3月31日搬瓦工机房部分节点遭受电源故障,服务器直接等于异常关机了。我很不巧也是本次事故的受害者... 几个小时后机房恢复,但是 MySQL、Redis、MongoDB 均出现故障,无法启动... 本文记录以上这些服务的修复过程。

MySQL 无法启动

启动 MySQL 后,虽然启动失败,但是可以在 log 里找到如下内容:

[ERROR] Plugin 'InnoDB' init function returned error.
[ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
[ERROR] Unknown/unsupported storage engine: InnoDB

修复步骤:

  • 在配置文件 [mysqld] 下增加一行 innodb_force_recovery=6,此时服务可以启动,可以执行数据查询但不能执行插入和更新。
  • 此时 log 中有一些这样的日志,表示数据库损坏:
[ERROR] InnoDB: Failed to find tablespace for table '"database"."table"' in the cache.
Attempting to load the tablespace with space id 1290.
  • 利用数据库管理工具如 NavicatphpMyAdmin 将数据库当前数据导出。
  • 关闭 MySQL 服务,备份数据目录:
service mysqld stop
mv /mysql/data /mysql/data_backup_20220331
mkdir /mysql/data
  • 重新初始化 MySQL:
/mysql/bin/mysqld --initialize
  • 使用数据库管理工具重新登录,把数据重新导入,修复完成。

Redis 无法启动

Redis 无法正常启动,log 中出现如下日志:

Fatal error loading the DB: Invalid argument. Exiting.

修复步骤:

  • 删除 dump.rdb 文件:
rm /redis/dump.rdb
  • 重启 Redis 即可。

MongoDB 无法启动

修复步骤:

  • 删除数据目录中的 .lock 文件,备份 storage.bson
rm /mongodb/data/mongod.lock
rm /mongodb/data/WiredTiger.lock
mv /mongodb/data/storage.bson /mongodb/data/storage.bson.bak
  • 修复数据库:
/mongodb/bin/mongod --dbpath=/mongodb/data --repair
  • 还原 storage.bson
mv /mongodb/data/storage.bson.bak /mongodb/data/storage.bson
  • 重新启动服务。