Eu tenho esse erro do InnoDB no MySQL 5.0. O Mysqld foi parado de maneira limpa, mas eu consegui perder o ib_logfile0 e o ib_logfile1 posteriormente. Agora, após uma inicialização limpa, o InnoDB fez sua "recuperação de falha". Passei pela empresa innodb_force_recovery = 4, consertei uma tabela MyISAM suspensa e agora a replicação está pronta, além disso. Grandes números confirmados:
111116 15:49:36 InnoDB: Error: page 393457 log sequence number 111 561,760,232
InnoDB: is in the future! Current system log sequence number 70 3,946,969,851.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.0/en/forcing-recovery.html
InnoDB: for more information.
Este está em um servidor escravo. O erro acima vomita às centenas. Eu encontrei esta resposta: "insira e exclua mais de 64 GB de dados, para que o número de sequência do log fique inflado suficientemente grande".
http://forums.mysql.com/read.php?22,50163,50163#msg-50163
Esse número mágico de 64 GB vem de 4 GB * 16, em que o "número principal" do registro do innodb desse cara precisava aumentar de 0 para 15. O meu passou de 70 para 111 = 164 GB. Isso levará 5 dias. Continuarei trabalhando para acelerar meu script e executá-lo em paralelo para acelerar isso. Enquanto isso, espero que outra pessoa tenha uma resposta melhor. Isso é bobo.
Respostas:
Essa era uma situação bastante rara. Espero nunca mais chegar lá novamente, com um InnoDB "número de sequência de log está no futuro!" erro. Por causa dos meus detalhes particulares, a reconstrução / restauração dos dados do meu servidor foi o último recurso. Alguns truques para ajudar foram boas idéias, mas no final, decidi continuar melhorando meu script Perl para jogar esse jogo bobo e agitar o máximo de shows / hora que pude. Que diabos, é um bom teste de estresse do sistema.
Lembre-se: o objetivo é aumentar um único contador ("número de sequência do log") que é armazenado em algum lugar nos cabeçalhos de ib_logfile0 e ib_logfile1 . Isso é para falsificar o InnoDB, para que ele ignore um aparente tempo distorcido e continue com a vida. Mas ninguém sabe como editar esse número. Ou se eles sabem, ninguém está falando.
Aqui está o meu produto final. YMMV, mas usar a função REPEAT do mysql para gerar os dados internamente é altamente eficiente.
Minha receita sugerida:
while true; do date; junk.pl dataX; done
.Assista seu LSN crescer, talvez em outro loop:
O grande número é um INT de 32 bits não assinado, com quebra de 4 GB, aumentando sempre o número menor. Neste caso acima, ele passou de 124 para 125. Seu objetivo está oculto no mysqld.log que o enviou pesquisando no Google essa solução ridícula em primeiro lugar. Depois de cruzar a linha de chegada, é isso! Sopre os chifres! Solte o confete!
fonte
Você tem três (3) opções:
OPÇÃO 01: Executar rsync do mestre para o escravo (tempo de inatividade no mestre)
reset master;
no mestre (registros binários do Zaps)service mysql stop
no mestreservice mysql stop
no escravoservice mysql start
no mestreservice mysql stop --skip-slave-start
no escravostart slave;
o escravo e deixe a replicação recuperar o atrasoOPÇÃO 02: Executar rsync do mestre para o escravo (tempo de inatividade mínimo no mestre)
reset master;
no mestre (registros binários do Zaps)service mysql stop
no escravoservice mysql stop
no mestreservice mysql start
no mestreservice mysql stop --skip-slave-start
no escravostart slave;
o escravo e deixe a replicação recuperar o atrasoOPÇÃO 03: Use o XtraBackup
Essa ferramenta de software não apenas fará uma cópia não invasiva de um mestre em execução, mas também criará os ib_logfiles correspondentes para você. Você precisaria configurar a replicação
Eu já postei no StackExchange antes sobre esse assunto
Eu já fiz isso várias vezes pela empresa de hospedagem na web do meu empregador. Um cliente tinha 3,7 TB para mover e levou cerca de 16 horas. 64GB é muito pequeno em comparação.
fonte
RESET SLAVE
é útil, especialmente se você tiver acumulado muitos GB de logs de retransmissão. Após o processo rsync e o restabelecimento da replicação, lembre-se de que o comando CHANGE MASTER TO também apagará os logs de retransmissão para você.Descobri que talvez haja uma maneira mais legal de resolver esse problema trabalhando em tabelas particionadas. Eu precisava descartar partições de alguns anos atrás e tive que adicionar algumas para 2014. Quase todas as partições relatam esse erro, também as antigas. Acidente muito desagradável.
Portanto, enquanto DROPPING antiga e usando REORGANIZE da partição MAXVALUE (a última), ela criará novos arquivos que estão bem, então recebo cada vez menos avisos. Enquanto isso, ajuda a incrementar o contador de sequência de log, portanto, não preciso inserir dados falsos. Eu tenho isso acontecendo em um servidor mestre btw ...
Então, é isso:
E isto:
Isso eliminará efetivamente cada partição da mudança e a recriará com uma cópia temporária do conteúdo do que estava lá. Você pode fazer isso por tabela, se quiser, meu aplicativo permite que isso aconteça, portanto, não há necessidade de se preocupar com backups sincronizados, etc.
Agora, para o restante da tabela, como não toquei em todas as partições no processo, algumas serão deixadas com o aviso de sequência de log; para aquelas que estão quebradas, mas cobertas por essa ação de reorganização, provavelmente executarei o seguinte:
ou aquilo
Então, isso me fez pensar: você poderia fazer isso com tabelas simples, adicionar partições temporariamente por hash e depois removê-lo (ou mantê-las, eu recomendo fortemente partições).
No entanto, estou usando o mariadb, não o mysql (portanto, o XtraDB)
Talvez isso ajude alguém. Eu ainda estou executando, até agora tudo bem. Mudar o MOTOR parece fazer o trabalho também, então eu o troco entre o MyIsam e eles de volta ao InnoDB.
É bastante lógico, se você mudar ENGINE, a tabela desaparecerá do innodb, portanto não será mais um problema.
parece funcionar aqui. Posso confirmar algumas coisas nas tabelas particionadas:
Eu usei os últimos em várias mesas. Os avisos acontecem quando ele tenta abrir os arquivos e há um para cada definição de partição que é aberta com problemas de contador. Hoje quase rolou no balcão hoje para as últimas mesas. Acho que uma vez processado, é necessário liberar os logs binários.
atualização : posso concluir algumas coisas agora que consegui resolver esse problema.
fonte
USE INFORMATION_SCHEMA; SELECT CONCAT("ALTER TABLE `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` REBUILD PARTITION ALL;") AS MySQLCMD AS MySQLCMD FROM TABLES;
(fonte: dba.stackexchange.com/questions/35073/… ) e conectá- lo a um arquivo para ser executado como uma série de comandos.