目录
错误日志
2025-12-08T06:28:49.443463Z 0 [ERROR] InnoDB: Ignoring the redo log due to missing MLOG_CHECKPOINT between the checkpoint 67744233726 and the end 67744233472.
2025-12-08T06:28:49.444215Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2025-12-08T06:28:49.646689Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2025-12-08T06:28:49.647408Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2025-12-08T06:28:49.647842Z 0 [ERROR] Failed to initialize builtin plugins.
2025-12-08T06:28:49.648177Z 0 [ERROR] Aborting
错误原因分析
这个报错核心是 InnoDB 重做日志(redo log)损坏 / 不一致:
InnoDB 在启动时检查 redo log,发现检查点(checkpoint)位置(67744233726)超出了 redo log 实际结束位置(67744233472),说明 redo log 日志文件不完整、被截断或损坏。
导致 InnoDB 引擎初始化失败,最终 MySQL 启动中止。
常见触发场景:
MySQL 异常关闭(如强制 kill 进程、服务器断电、磁盘满);
redo log 文件(ib_logfile0/ib_logfile1)被手动修改 / 删除;
磁盘 IO 错误导致 redo log 写入不完整;
文件系统损坏。
解决步骤(按优先级 / 风险从低到高)
步骤 1:先备份数据(关键!防止二次损坏)
无论后续操作,先备份 MySQL 数据目录(默认 /var/lib/mysql):
bash
运行
停止 MySQL 服务(如果还在尝试启动)
systemctl stop mysqld
备份数据目录(替换为你的实际数据路径)
cp -r /var/lib/mysql /var/lib/mysql_backup_$(date +%Y%m%d)
步骤 2:尝试跳过 redo log 启动(临时应急)
修改 MySQL 配置文件(my.cnf/my.ini),添加跳过 InnoDB 重做日志检查的参数:
ini
mysqld
跳过 redo log 恢复(仅临时使用,启动后需移除)
innodb_force_recovery = 1 # 先尝试1级,若不行逐步提高到6(最高风险)
innodb_purge_threads = 0 # 辅助参数,减少恢复压力
innodb_force_recovery 级别说明:
1:忽略损坏的页,继续运行;
2:阻止主线程运行(不执行 purge);
3:不执行事务回滚;
4:不刷新缓冲池到磁盘;
5:不检查日志页的有效性;
6:不应用 redo log(最高级别,可能丢失数据) 。
启动 MySQL 并导出数据:
bash
运行
systemctl start mysqld
若启动成功,立即导出所有数据库(防止数据丢失)
mysqldump -uroot -p --all-databases > all_databases_backup.sql
步骤 3:重建 redo log(彻底解决)
如果跳过恢复能启动,或确认可以舍弃未提交事务,可重建 redo log:
停止 MySQL 服务:
bash
运行
systemctl stop mysqld
移除旧的 redo log 文件(仅确认数据已备份后执行):
bash
运行
cd /var/lib/mysql # 数据目录
rm -f ib_logfile0 ib_logfile1 # 重做日志文件
恢复 MySQL 配置(移除 innodb_force_recovery 等临时参数);
启动 MySQL(InnoDB 会自动重建 redo log):
bash
运行
systemctl start mysqld
步骤 4:极端情况(数据文件损坏)
如果上述操作仍无法启动,可能是 ibdata1 或表空间文件损坏:
尝试用 innodb_force_recovery=6 启动(最高级别,只读);
导出所有可访问的表数据:
bash
运行
mysqldump -uroot -p --skip-lock-tables --force dbname > dbname_backup.sql
重新初始化 MySQL 实例:
bash
运行
停止服务
systemctl stop mysqld
清空数据目录(备份后)
rm -rf /var/lib/mysql/*
初始化
mysqld --initialize --user=mysql --datadir=/var/lib/mysql
启动并导入数据
systemctl start mysqld
mysql -uroot -p < all_databases_backup.sql
预防措施
避免强制 kill MySQL 进程(用 mysqladmin shutdown 正常关闭);
监控磁盘空间(防止磁盘满导致日志写入失败);
开启 MySQL 慢日志 / 错误日志,及时发现异常;
定期备份数据(如 xtrabackup 物理备份);
确保文件系统健康(定期检查 fsck)。
如果操作中遇到权限问题,需确保 mysql 用户对数据目录有读写权限(chown -R mysql:mysql /var/lib/mysql)。
结合本系统
(1)先按上述方案,可以导出 wvpdb.sql
(2)然后把\data 下的数据库文件全部删除
mysqld" --defaults-file="USER_INSTALL_DIR/mysql-5.7.27-winx64/my.ini" --initialize-insecure
(3)
sc start wvp-server
mysqladmin -uroot -P3380 -h127.0.0.1 password
mysql -uroot ..... -e "create database wvpdb"
mysql -u **** wvpdb < wvpdb.sql