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.
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!
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.
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).