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

目录

错误日志

错误原因分析

结合本系统


错误日志

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

相关推荐
锦衣夜行?2 小时前
oracle 未知长度从左到右截取某个字符串
数据库·oracle
han_hanker2 小时前
@JsonIgnore,@JsonProperty, @JsonInclude,@JsonFormat
数据库·oracle
hanyi_qwe2 小时前
MySQL事务基础
数据库·mysql
l1t2 小时前
三种用SQL解决Advent of Code 2022第8题 树顶木屋 的比较和分析
数据库·sql·oracle·duckdb·advent of code
如果未来,2 小时前
Oracle的Redo log和Undo log的区别
数据库·oracle
koping_wu3 小时前
【方案设计】Mysql相关场景
数据库·mysql
杨云龙UP3 小时前
SQL Server小技巧:用 SSMS 重置登录密码,不影响正在运行的系统
运维·服务器·数据库·sql·sqlserver
洁洁!3 小时前
openEuler多样性算力支持实践:容器化多架构应用部署与调度
服务器·数据库·科技·语言模型·数据分析
白露与泡影3 小时前
MySQL整体设计与存储引擎深度剖析:从架构哲学到引擎选型(了解)
数据库·mysql·架构