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

Foi útil?

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

  1. 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!)
  2. CREATE TABLE broken_repair LIKE broken;
  3. INSERT broken_repair SELECT * FROM broken WHERE id NOT IN (SELECT id FROM broken_repair) LIMIT 1;
  4. Repita o passo 3 até que ele trava o DB (você pode usar LIMIT 100000 e então usar valores mais baixos, até usando LIMIT 1 trava o DB).
  5. Veja se você tem tudo (você pode comparar SELECT MAX(id) FROM broken com o número de linhas em broken_repair).
  6. 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 ao LIMIT.

Boa sorte!

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top