目录
起因
强制启用恢复模式
备份数据
起因
服务器重启了,然后服务器启动完成之后我发现MySQL程序没有启动,错误信息如下:
2025-04-19T12:46:47.648559Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2025-04-19T12:46:55.913703Z 0 [Warning] [MY-000081] [Server] option 'max_allowed_packet': unsigned value 107374182400 adjusted to 1073741824.
2025-04-19T12:46:55.913790Z 0 [Warning] [MY-010915] [Server] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
2025-04-19T12:46:55.913893Z 0 [System] [MY-010116] [Server] /www/server/mysql/bin/mysqld (mysqld 8.0.24) starting as process 17471
2025-04-19T12:46:56.017284Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
查看./mysqlbinlog,宝塔的mysqlbinlog日志地址
/www/server/mysql/bin
大概看了binlog日志,发现最后几条的sql并没有问题,然后想起来重启的时候我在导出sql,大概率是因为服务器是突然断点重启,但是此时正在执行sql,造成innodb数据库文件出现错误的原因
强制启用恢复模式
在mysql的配置文件中加入以下内容:
innodb_force_recovery = 1
其中参数的含义是:
1
(SRV_FORCE_IGNORE_CORRUPT)- 即使检测到损坏的页面,也允许服务器运行。尝试使
SELECT * FROM *
tbl_name*
跳过损坏的索引记录和页面,这有助于转储表。
- 即使检测到损坏的页面,也允许服务器运行。尝试使
2
(SRV_FORCE_NO_BACKGROUND)- 阻止主线程和任何清除线程运行。如果在清除操作期间发生意外退出,则此恢复值会阻止它。
3
(SRV_FORCE_NO_TRX_UNDO)- 崩溃恢复后不运行事务回滚.
4
(SRV_FORCE_NO_IBUF_MERGE)- 阻止插入缓冲区合并操作。如果它们会导致崩溃,请不要这样做。不计算表统计信息。此值可能会永久损坏数据文件。使用此值后,请准备好删除并重新创建所有二级索引。将
InnoDB
设置为只读。
- 阻止插入缓冲区合并操作。如果它们会导致崩溃,请不要这样做。不计算表统计信息。此值可能会永久损坏数据文件。使用此值后,请准备好删除并重新创建所有二级索引。将
5
(SRV_FORCE_NO_UNDO_LOG_SCAN)- 启动数据库时不查看撤消日志:
InnoDB
甚至将未完成的事务视为已提交。此值可能会永久损坏数据文件。将InnoDB
设置为只读。
- 启动数据库时不查看撤消日志:
6
(SRV_FORCE_NO_LOG_REDO)- 不执行与恢复相关的重做日志前滚。此值可能会永久损坏数据文件。使数据库页处于过时状态,这反过来又可能会给 B 树和其他数据库结构带来更多损坏。将
InnoDB
设置为只读。
- 不执行与恢复相关的重做日志前滚。此值可能会永久损坏数据文件。使数据库页处于过时状态,这反过来又可能会给 B 树和其他数据库结构带来更多损坏。将
从1开始逐步往上尝试启动,我是尝试到2启动成功的
备份数据
启动成功后我们在使用dump导出一下数据库的结构和数据/宝塔直接点击备份数据
备份成功之后我们就可以删除原来的数据库了,由于使用的是恢复模式,而且innodb的文件已经损坏了,所以我们可以找到mysql配置文件,找到对应的数据文件,然后使用rm -rf 文件删除掉原有的数据库文件。
确保已备份全部数据!!!!!!!!
rm -rf /www/server/mysql
删除完之后,重新安装数据库,接着把直接备份的数据库重新导入,MySQL就可以正常启动了。
end
人的一生 必须要学会做一件事 而且要做到透彻 才不枉此生...共勉 💪。