某线上服务器的mysql突然崩溃后,重启一直失败。查看mysql的error.log发现如下错误信息:
InnoDB: Serious error! InnoDB is trying to free page 716 InnoDB: though it is already marked as free in the tablespace! InnoDB: The tablespace free space info is corrupt. InnoDB: You may need to dump your InnoDB tables & recreate the whole InnoDB: database!
尝试了各种修复方法均告失败,看来只能重建数据库了。
首先解决无法启动的问题(参见http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html的说明):
先添加如下设置到my.cnf:
# vi /etc/mysql/my.cnf [mysqld] innodb_force_recovery = 1
保存my.cnf退出vi后重启mysql:
# service mysql start
但重启依然失败。
按上述官方文档提示,尝试提高recovery级别到2:
[mysqld] innodb_force_recovery = 2
这次重启成功了,并且可以正常查询,但此时mysql处于只读状态,无法做update、delete等写操作。下面开始尝试先备份再恢复全部数据库。
1、备份全部数据库
mysqldump -uroot -p -AER > /root/recovery_dump.sql
2、删除全部数据库
mysql> SET FOREIGN_KEY_CHECKS=0; mysql> DROP DATABASE db1; mysql> DROP DATABASE db2; ...
如果数据库太多,可使用如下命令批量删除。注意:<password>应该替换为真实密码。
# mysql -uroot -p<password> -e "show databases" | grep -v Database | grep -v mysql| grep -v information_schema| grep -v test | grep -v OLD |gawk '{print "drop database " $1 ";select sleep(0.1);"}' | mysql -uroot -p<password>
3、停止mysql。注意应该禁用innodb_fast_shutdown,确保mysql完全停止。
# mysql -uroot -p -e "SET GLOBAL innodb_fast_shutdown = 0" # service mysql stop
4、完全删除mysql数据和日志
rm /var/lib/mysql/ibdata* rm /var/lib/mysql/ib_log*
5、重启mysql并导入备份的数据:
# service mysql start # mysql -uroot -p < /root/recovery_dump.sql
至此mysql终于启动正常了,数据也完全恢复成功。
阅读:83