EMERGÊNCIA! Declaração de atualização para banco de dados de produção do mysql crítico agora em execução por 18 horas, precisa de ajuda

6

Temos uma tabela com 500 milhões de linhas. Infelizmente, uma das colunas foi int (11), que é um int assinado, e foi um valor incremental que acabou de passar dos 2,1 bilhões de números mágicos. Isso imediatamente causou tempo de inatividade para cerca de 10.000 usuários. Discutimos muitas soluções e decidimos que poderíamos reverter esse valor com segurança, digamos, um bilhão. Mas nós tivemos que revertê-lo para cada linha.

Aqui está o que fizemos:

atualizar Tabela1 Definir MessageId = caso em que MessageId < 1073741824 então 0 else MessageId - 1073741824 end;

Eu testei isso em uma tabela com 10 milhões de linhas e levou 11 minutos. Então eu assumi que a tabela maior levaria 550 minutos, ou 9 horas. Este seria o nosso maior downtime em 3 anos. (Nós somos uma startup). Agora está acontecendo 18 horas.

O que devemos fazer?

Por favor, não diga o que deveríamos ter feito. Acho que deveríamos ter atualizado alguns milhões de linhas de cada vez.

Existe uma maneira de vermos o progresso? O Mysql poderia ter sido suspenso? Usando o mysql 5.0.22.

Obrigado!

    
por Tim 27.02.2010 / 14:29

2 respostas

1

Tente ver a saída de SHOW PROCESSLIST; deve dar uma breve ideia do que está acontecendo dentro desse segmento; Na pior das hipóteses, você poderia matar esse thread (usando KILL $ threadID) e, em seguida, limpar manualmente.

HTH.

    
por 27.02.2010 / 14:51
0

Você quis dizer: update Table1 Set MessageId = case quando MessageId < 1073741824 então MessageId else MessageId - 1073741824 end;

Caso contrário, posso ver várias mensagens com o mesmo id.

Outra maneira que pode ser mais rápida, no nível sql:

create table new_table as
select (all other fields),
       case msg id > xxx then msg_id - 1000000 else msg_id
  from old_table;

Dessa forma, você faz uma varredura completa de uma tabela e escreve a outra de uma só vez, ao invés de fazer um monte de i / o aleatório (que você pode verificar com o iostat).

    
por 27.02.2010 / 21:28

Tags