某线上服务器的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!
尝试了各种修复方法均告失败,看来只能重建数据库了。
先添加如下设置到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;
...
如果数据库太多,可使用如下命令批量删除。注意:应该替换为真实密码。
# mysql -uroot -p -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
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终于启动正常了,数据也完全恢复成功。
阅读:66