Recentemente tivemos um problema com o desligamento inadequado de um servidor, e então o MySQL não iniciou mais corretamente.
Analisando o mysql.log, verificamos mensagens como essa abaixo, a cada tentativa de início.
InnoDB: stored checksum 3103110567, prior-to-4.0.14-form stored checksum 438929502 InnoDB: Page lsn 66 2543532480, low 4 bytes of lsn at page end 2544351964 InnoDB: Page number (if stored to page already) 131080, InnoDB: space id (if created with >= MySQL-4.1.1 and stored already) 0 InnoDB: Page may be an index page where index id is 0 381 InnoDB: Database page corruption on disk or a failed InnoDB: file read of page 131080.
Utilizar o programa mysqlcheck não era uma opção, pois ele precisa que o MySQL esteja iniciado e operacional.
Então utilizamos o parâmetro innodb_force_recovery, que possui os níveis de 0 a 6, sendo que 0 é o padrão e significa que não haverá uma recuperação forçada, e 6 pode ser considerado o mais agressivo, pois com este valor nenhuma recuperação é executada.
A intenção deste parâmetro é que caso não haja um backup recente disponível (quase nunca há, não é mesmo?), o MySQL possa ser iniciado e ter seus dados exportados. É uma opção para ser utilizada em último caso, contando com a sorte para que os dados possam ser exportados.
Fui então incrementando o valor do parâmetro progressivamente e tentando iniciar o MySQL, mas só consegui com o 6.
[root@zabbix ~]# grep force /etc/my.cnf [root@zabbix ~]# service mysqld start Timeout error occurred trying to start MySQL Daemon. Starting MySQL: [FAILED] [root@zabbix ~]# echo "innodb_force_recovery = 1" >> /etc/my.cnf [root@zabbix ~]# service mysqld start Timeout error occurred trying to start MySQL Daemon. Starting MySQL: [FAILED] [root@zabbix ~]# echo "innodb_force_recovery = 2" >> /etc/my.cnf [root@zabbix ~]# service mysqld start Timeout error occurred trying to start MySQL Daemon. Starting MySQL: [FAILED] [root@zabbix ~]# echo "innodb_force_recovery = 3" >> /etc/my.cnf [root@zabbix ~]# service mysqld start Timeout error occurred trying to start MySQL Daemon. Starting MySQL: [FAILED] [root@zabbix ~]# echo "innodb_force_recovery = 4" >> /etc/my.cnf [root@zabbix ~]# service mysqld start Timeout error occurred trying to start MySQL Daemon. Starting MySQL: [FAILED] [root@zabbix ~]# echo "innodb_force_recovery = 5" >> /etc/my.cnf [root@zabbix ~]# service mysqld start Timeout error occurred trying to start MySQL Daemon. Starting MySQL: [FAILED] [root@zabbix ~]# echo "innodb_force_recovery = 6" >> /etc/my.cnf [root@zabbix ~]# service mysqld start Starting MySQL: [ OK ] [root@zabbix ~]# mysqldump -u root -pMinhaSenha mysql > mysql.sql [root@zabbix ~]# mysqldump -u root -pMinhaSenha zabbix > zabbix.sql
Então eu desistalei o MySQL, removi todos seus arquivos de dados e de configurações, e então reinstalei a mesma versão, para depois importar os dumps criados.
Felizmente não perdemos nenhum dado com esta operação, mas a melhor estratégia é a correta: tenha Backup, e utilize Bin Logs.
Documentação innodb_force_recovery: http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
Documentação mysqlcheck: http://dev.mysql.com/doc/refman/5.5/en/mysqlcheck.html



