【数据库损坏】关于一次现场数据库损坏

目录

错误日志

错误原因分析

结合本系统


错误日志

复制代码
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

相关推荐
广州灵眸科技有限公司7 小时前
xfce桌面触摸校准:基于灵眸科技EASY-EAl-Orin-Nano
数据库·windows·科技
Cloud云卷云舒9 小时前
云卷云舒:从Oracle/MySQL迁移到HaishanDB:迁移评估工具核心技术拆解
mysql·oracle·ai-native·haishandb·信创数据库替换
憧憬成为web高手10 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学10 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh12 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
用户713335851562412 小时前
MySQL - 事务、redo/undo 日志与 MVCC
mysql
z1234567898613 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD13 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo13 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程
用户713335851562413 小时前
MySQL - InnoDB 的 Buffer Pool
mysql