Blog 服务器文件系统损坏后,由于日志与数据库文件不一致,数据库无法启动。事实上,当时有一个简单粗暴的方法可以启动数据库:修改 /etc/mysql/my.cnf,增加如下的配置:


[mysqld]
innodb_force_recovery = 6

启动后的数据库是只读模式,可以用 mysqldump 命令把数据库 dump 出来,绝大部分数据是完好的。也就是说,文件系统损坏后的数据库,以及使用 rsync 在线备份出来的数据库,尽管都是处于不一致状态的,但是可以忽略日志部分,恢复其大部分数据的。

恢复 blog 的时候,我也查到了 innodb_force_recovery 选项,但只看到了设置它为 1(文档的开头部分),发现启动不起来就没有办法了。事实上这个选项可以设置为 1~6 的不同级别,表示跳过 innodb 数据库恢复的不同步骤。经测试,该值设为 1~5 都不行,只有设置为 6,即完全忽略 redo 和 undo 日志,才能成功启动数据库,也就是 rsync 造成的不一致是比较严重的。

参见 MySQL 官方文档:Forcing InnoDB Recovery

教训:

  1. 看文档要看完整。
  2. 数据库不能使用 rsync 来同步,而要使用 mysqldump 全量导出、DRBD(块设备级别的同步)或者数据库主从复制。