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

目录

错误日志

错误原因分析

结合本系统


错误日志

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

相关推荐
小陈工4 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
0xDevNull8 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花8 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸8 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain8 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希9 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神9 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员9 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java9 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿10 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb