Quando o MySQL não inicia depois de uma queda de energia ou de um problema no disco, o primeiro objetivo é descobrir a causa e preservar os arquivos existentes. A queda, sozinha, não prova um dano. O InnoDB tem uma recuperação automática depois de falhas, e o serviço também pode deixar de iniciar por falta de espaço, por permissões ou por um erro na configuração.
O log de erros primeiro
O log de erros do MySQL registra o motivo de uma falha na inicialização. No Windows, ele costuma ficar na pasta de dados, com o nome do computador e a extensão err. As mensagens desse arquivo separam os casos mais comuns:
- a falta de espaço no disco;
- a falta de permissão na pasta de dados;
- uma opção inválida no arquivo de configuração;
- a porta 3306 ocupada por outro programa;
- páginas danificadas ou falhas repetidas durante a recuperação do InnoDB.
Nas versões anteriores ao MySQL 5.6, uma mudança no tamanho dos arquivos de registro do InnoDB, feita só no arquivo de configuração, também impede a inicialização, e o log mostra a diferença de tamanho entre a configuração e os arquivos existentes.
O modo de recuperação forçada
A opção innodb_force_recovery faz o InnoDB ignorar partes da recuperação normal. Com ela, dados ilegíveis podem ficar legíveis o bastante para uma exportação, mas os arquivos continuam danificados, e as linhas extraídas podem não estar consistentes. A opção fica na seção do servidor, no arquivo de configuração:
[mysqld]innodb_force_recovery = 1
Os valores vão de 1 a 6, e cada valor inclui os efeitos dos anteriores:
- 1: mantém o servidor funcionando mesmo com páginas danificadas e pula os registros danificados na leitura.
- 2: impede as tarefas de limpeza que rodam em segundo plano.
- 3: não desfaz as transações incompletas depois da recuperação.
- 4: impede a aplicação das alterações acumuladas para os índices secundários e o cálculo das estatísticas.
- 5: ignora os registros de desfazer e trata as transações incompletas como confirmadas.
- 6: ignora os registros de alterações usados na recuperação normal.
Com qualquer valor acima de zero, o InnoDB recusa INSERT, UPDATE e DELETE, e, nas versões atuais, os valores a partir de 4 deixam o InnoDB somente leitura. Os valores a partir de 4 podem causar um dano permanente aos arquivos, e a documentação do MySQL orienta testar esses valores antes em uma cópia física separada. O uso começa pelo valor 1 e só sobe um valor por vez, quando o valor anterior não permite a exportação.
Preservar, extrair e reconstruir
A recuperação segue uma sequência:
- a parada do serviço e uma cópia completa da pasta de dados, guardada em outro lugar;
- a inicialização com o menor valor que permita ler os dados;
- a exportação com o mysqldump, tabela por tabela quando uma tabela danificada interrompe a exportação do banco inteiro;
- a criação de uma instalação nova, sem a opção, e a importação dos dados exportados;
- a conferência das contagens, dos identificadores, das definições e dos dados importantes antes da volta da operação.
Nas instalações com o arquivo compartilhado ibdata1, todas as tabelas InnoDB ficam no mesmo arquivo, e a cópia da pasta de dados inteira é a única forma de preservar o estado. Uma exportação que parou em uma página danificada não recuperou a tabela inteira, e os trechos que faltaram ficam registrados. A ferramenta innochecksum, executada com o serviço parado, confere as somas de verificação das páginas de um arquivo do InnoDB e ajuda a localizar o dano.
Ao final, a opção sai da configuração. Um servidor que continua funcionando com a recuperação forçada não aceita alterações de dados e não tem as proteções normais do InnoDB.
No suporte
A preservação vem antes de qualquer tentativa, e o log de erros orienta a decisão. A recuperação forçada é um recurso de extração em uma emergência, acompanhado pela equipe responsável, e não uma configuração para manter os sistemas funcionando.
Para guardar
- Uma falha na inicialização começa pela leitura do log de erros.
- A recuperação forçada ajuda a exportar os dados e não repara os arquivos.
- Com qualquer valor acima de zero, o InnoDB recusa as alterações de dados.
- Os valores a partir de 4 podem causar um dano permanente.
- A volta à operação exige uma instalação nova, a importação dos dados e a validação.
O log de erros aponta páginas danificadas do InnoDB, e o serviço não inicia. Qual é o primeiro passo?
Preservar uma cópia completa da pasta de dados, com o serviço parado, e envolver a equipe responsável. As tentativas de recuperação forçada acontecem depois, de preferência sobre uma cópia. Mudar valores direto na única cópia disponível elimina a proteção mais importante.
O serviço iniciou com innodb_force_recovery igual a 1. A aplicação já pode ser liberada?
Não. A inicialização permite ler e exportar os dados, mas o InnoDB recusa as alterações e funciona sem a recuperação normal. A volta à operação passa pela instalação nova, pela importação, pela validação e pela retirada da opção.