Eu tenho esse erro InnoDB no MySQL 5.0. Mysqld foi parado de forma limpa, mas consegui perder ib_logfile0 & ib_logfile1 depois. Agora, após uma inicialização limpa, o InnoDB fez sua "recuperação de falhas". Eu passei pelo negócio innodb_force_recovery=4, consertei uma tabela MyISAM travada e agora a replicação está pronta, além disso. Grandes números comprometidos:
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.
Isso está em um servidor escravo. O erro acima vomita às centenas. Encontrei esta resposta: "insira e exclua > 64 GB de dados, para que o número de sequência de log seja inflado o suficiente".
http://forums.mysql.com/read.php?22,50163,50163#msg-50163
Esse número mágico de 64 GB vem de 4 GB * 16, onde o "número principal" do log innodb desse cara precisava aumentar de 0 a 15. O meu vai de 70 a 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 alguém tenha uma resposta melhor. Isso é bobo.
Esta era uma situação bastante rara. Espero nunca acabar lá novamente, com um InnoDB "número de sequência de log está no futuro!" erro. Por causa dos meus detalhes particulares, reconstruir/restaurar os dados do meu servidor foi o último recurso. Alguns truques para ajudar foram boas ideias, mas no final, decidi continuar melhorando meu script Perl para jogar esse jogo bobo e fazer o máximo de shows/hora que pudesse. Que diabos, é um bom teste de estresse do sistema.
Lembre-se: o objetivo é aumentar um único contador ("log sequence number") que é armazenado em algum lugar nos cabeçalhos de ib_logfile0 e ib_logfile1 . Isso é para falsificar o InnoDB para que ele ignore uma aparente distorção do tempo 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
.Veja seu LSN crescer, talvez em outro loop:
O grande número é um INT de 32 bits não assinado que será encapsulado em 4 GB, aumentando o número menor a cada vez. Neste caso acima, ele apenas rolou de 124 para 125. Seu objetivo está oculto no mysqld.log que o enviou pesquisando no Google para esta solução ridícula em primeiro lugar. Depois de cruzar a linha de chegada, é isso! Sopre os chifres! Solte o confete!
Você tem três (3) opções:
OPÇÃO 01 : Execute rsync de Master to Slave (Downtime no Master)
reset master;
no mestre (Zaps Binary Logs)service mysql stop
no mestreservice mysql stop
no escravoservice mysql start
no mestreservice mysql stop --skip-slave-start
no escravostart slave;
no escravo e deixe a replicação acompanharOPÇÃO 02 : Execute rsync de Master to Slave (tempo de inatividade mínimo no mestre)
reset master;
no mestre (Zaps Binary Logs)service mysql stop
no escravoservice mysql stop
no mestreservice mysql start
no mestreservice mysql stop --skip-slave-start
no escravostart slave;
no escravo e deixe a replicação acompanharOPÇÃO 03 : Use o XtraBackup
Esta ferramenta de software não apenas fará uma cópia não intrusiva de um mestre em execução, mas também criará os ib_logfiles correspondentes para você. Você teria que configurar a replicação
Eu postei no StackExchange antes sobre este assunto
Eu fiz essas coisas muitas vezes para a empresa de hospedagem do meu empregador. Um cliente tinha 3,7 TB para mover e demorou cerca de 16 horas. 64 GB é muito pequeno em comparação.
Descobri que talvez haja uma maneira mais legal de resolver esse problema trabalhando em tabelas particionadas. Eu precisava eliminar partições de alguns anos atrás e tive que adicionar algumas para 2014. Quase todas as partições relatam esse erro, assim como as antigas. Acidente muito desagradável.
Então, enquanto DROPPING old e usando REORGANIZE da partição MAXVALUE (a última), ele criará novos arquivos que estão ok, então eu recebo cada vez menos avisos. Enquanto isso, ajuda a incrementar o contador de sequência de log, então 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 na alteração 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, então não precisa se preocupar com backups sincronizados etc.
Agora, para o resto da tabela, como não toquei em todas as partições no processo, algumas ficarão com o aviso de sequência de log, para aquelas que estão quebradas , mas cobertas por esta ação de reorganização, provavelmente executarei isso:
ou aquilo
Então, isso me fez pensar, você poderia fazer isso com tabelas simples de baunilha, adicionar partições temporárias por hash e depois removê-las (ou mantê-las, posso recomendar fortemente partições).
Estou usando mariadb no entanto, não mysql (então XtraDB)
Talvez isso ajude alguém. Ainda estou rodando, até agora tudo bem. Mudar o ENGINE parece fazer o trabalho também, então eu o trago entre o MyIsam e eles de volta ao InnoDB.
É bastante lógico, se você mudar ENGINE, a tabela desaparece do innodb, então não será mais um problema.
parece funcionar aqui. Posso confirmar algumas coisas em tabelas particionadas:
Usei os últimos em várias mesas. Os avisos acontecem quando ele está tentando abrir os arquivos e há um para cada definição de partição aberta com problemas de contador. Quase rolou no balcão hoje para as últimas mesas. Eu acho que uma vez que tudo é processado, é necessário liberar os logs binários.
atualização : posso concluir algumas coisas agora que consegui resolver esse problema.