Como faço para reparar uma tabela InnoDB?
Pergunta
Nós (aparentemente) tinha mal executado do nosso motor de banco de dados MySQL Solaris noite passada. Pelo menos algumas das tabelas InnoDB estão corrompidos, com hora e data de erros de ordem no log de transações, e um erro específico sobre o índice a ser corrompido.
Nós sabemos sobre as ferramentas disponíveis para reparos de tabela MyISAM, mas não consigo encontrar nada para InnoDB.
Nota lateral:. Tentar um OPTIMIZE TABLE (na minha tentativa de reconstruir o índice corrompido) faz com que o servidor de banco de dados para falhar
Solução
Antes de tudo parar o servidor ea imagem do disco . Não há nenhum ponto ter apenas um tiro neste. Então dê uma olhada aqui .
Outras dicas
parar a sua aplicação ... ou parar seu escravo por isso há novas linhas estão sendo adicionados
create table <new table> like <old table>;
insert <new table> select * from <old table>;
truncate table <old table>;
insert <old table> select * from <new table>;
reiniciar o servidor ou escravo
A solução seguinte foi inspirado pela ponta de Sandro acima.
Aviso : enquanto ele trabalhou para mim, mas eu não posso dizer se ele vai trabalhar para você.
Meu problema era o seguinte: lendo algumas linhas específicas de uma tabela (vamos chamar essa broken
tabela) iria falhar MySQL. Mesmo SELECT COUNT(*) FROM broken
iria matá-lo. Espero que você tenha um PRIMARY KEY
nessa tabela (no exemplo a seguir, é id
).
- Certifique-se de que você tem um backup ou instantâneo do servidor MySQL quebrada (apenas no caso de você querer voltar ao passo 1 e tente outra coisa!)
-
CREATE TABLE broken_repair LIKE broken;
-
INSERT broken_repair SELECT * FROM broken WHERE id NOT IN (SELECT id FROM broken_repair) LIMIT 1;
- Repita o passo 3 até que ele trava o DB (você pode usar
LIMIT 100000
e então usar valores mais baixos, até usandoLIMIT 1
trava o DB). - Veja se você tem tudo (você pode comparar
SELECT MAX(id) FROM broken
com o número de linhas embroken_repair
). - Neste ponto, eu aparentemente tinha todas as minhas linhas (exceto aqueles que foram provavelmente selvagemente truncado por InnoDB). Se você perder algumas linhas, você pode tentar adicionar um
OFFSET
aoLIMIT
.
Boa sorte!
Aqui está a solução fornecida pela MySQL: http://dev.mysql.com/doc/refman /5.5/en/forcing-innodb-recovery.html
Veja este artigo: http://www.unilogica.com/mysql-innodb-recovery / (é em português)
são explicados como usar innodb_force_recovery e innodb_file_per_table . Eu descobri este banco de dados após necessidade de recuperação de um acidente com um único ibdata1 .
Usando innodb_file_per_table, todas as tabelas InnoDB criará um arquivo de tabela em separado, como MyISAM.
Passo 1.
servidor Parar MySQL
Passo 2.
Adicione esta linha para my.cnf (No Windows é chamado my.ini)
set-variable=innodb_force_recovery=6
Passo 3.
Excluir ib_logfile0 e ib_logfile1
Passo 4.
Servidor Iniciar MySQL
Passo 5.
Executar este comando:
mysqlcheck --database db_name table_name -uroot -p
Depois de ter resolvido com sucesso a tabela InnoDB caiu, não se esqueça de remover # set-variable = innodb_force_recovery = 6 de my.cnf e, em seguida, servidor MySQL reiniciar novamente.