Eu tenho algumas tabelas que são particionadas e possuem vários índices em um escravo replicado. Depois de copiar o instantâneo (verificado seguro) para um novo escravo e atualizar o mysqld de 5.1.42 para 5.5.15 e reiniciar a replicação, estou recebendo falhas do InnoDB com a mensagem de erro "Ponteiro inválido ..."
Esses erros ocorreram em 2 servidores com hardware e sistema operacional diferentes. Depois de correr:
ALTER TABLE .... COALESCE PARTION n;
o problema desaparece para essa tabela.
Minha pergunta é maior em escopo, porém, e é "Como você identifica a corrupção da tabela InnoDB?" ou reformulado "Como você avalia a integridade da tabela InnoDB?" O "CHECK TABLE" é a única ferramenta disponível para identificar problemas pré-crash?
Não tenho certeza se isso importa, mas as falhas ocorreram executando: Versão: '5.5.15-55-log' socket: '/opt/mysql.sock' porta: 3306 Percona Server (GPL), Release rel21.0, Revisão 158
Morgan dá uma dica em seu comentário de que o InnoDB está constantemente verificando páginas corrompidas fazendo checksums nas páginas que lê. Se o InnoDB encontrar uma incompatibilidade de checksum, ele irá
travaro servidor.Se você quiser acelerar esse processo (em vez de esperar que o InnoDB leia a página corrompida), você pode usar
innochecksum
:Uma ressalva interessante:
Então sim, para uma tabela online
CHECK TABLE
é provavelmente a ferramenta (ou como apontado em outra respostamysqlcheck
se você quiser fazer mais de um único banco de dados por vez).Se você pode desligar seu banco de dados, você pode forçar as somas de verificação usando
innochecksum
Anedótico: Em um tablespace innodb de 29 GB (com
innodb_file_per_table=1
), esse script levou cerca de 2 minutosComo um bônus, porém, como você está executando o Percona, eles implementaram um novo método para soma de verificação innodb rápida . Nunca usei, mas pode acelerar o processo.
AVISO: antes de tentar qualquer uma dessas instruções, é altamente recomendável verificar se há um backup íntegro do seu banco de dados em mãos, apenas por precaução. (obrigado @Nick pelo aviso)
Tente usar o
mysqlcheck
comando. Em um terminal:Este comando produzirá uma lista de todas as tabelas e um status informando se houve algum tipo de corrupção:
Com isso em mãos você já saberá quais mesas você precisa reparar. Apenas no caso de você querer reparar tudo de uma vez:
Mais sobre
mysqlcheck
: http://dev.mysql.com/doc/refman/5.0/en/mysqlcheck.htmlNota: você marcou sua pergunta com percona . Eu não tinha idéia do que era isso, então eu pesquisei. Parece ser um fork do MySQL, mas não tenho motivos para acreditar que os comandos são incompatíveis (dedos cruzados).
Alguém me indicou este guia que tem instruções mais específicas para recuperação de banco de dados InnoDB para situações mais críticas em que todo o banco de dados não inicia: http://www.softwareprojects.com/resources/programming/t-how-to-fix-mysql -database-myisam-innodb-1634.html
De acordo com o Guia de Estudo de Certificação MySQL 5.0, Página 443.444 Seção 30.4 :
Por favor, leia MySQL Docs em InnoDB Forced Recovery
Eu me pergunto o que acontece se alguém usar dados do InnoDB criados por meio do plug-in InnoDB e depois mudar para outra versão do InnoDB. Isso poderia criar uma possível corrupção de página aos olhos do mysqld.
Observe o que a documentação do MySQL no formato de arquivo InnoDB diz sobre essa possibilidade:
Eu descartaria os dados do escravo. Na verdade, eu apenas usaria força bruta obtendo um despejo lógico (mysqldump) dos dados:
Minha resposta original postada é considerada 'old school'. No entanto, neste caso, eu definitivamente examinaria os formatos de arquivo usados por .ibd e/ou ibdata1.