mysql服务无法启动?
发布网友
发布时间:2024-10-14 01:54
我来回答
共1个回答
热心网友
时间:2024-10-14 10:11
在更换了 MySQL 数据库服务器的 CPU 和主板后,尝试重新开机时发现 MySQL 无法启动。错误提示为 "Ignoring the redo log due to missing MLOG_CHECKPOINT between the checkpoint .... and ...",该问题出现在 MySQL 5.7 及以后版本,原因在于 MySQL 在最新的 checkpoint 完成后会在 redo log 写入一个 MLOG_CHECKPOINT 标记,用于指示在此之前的 redo 都已 checkpoint 完成。若缺失此标记,整个 redo log 文件将被忽略。如果未做好备份,解决办法需采取非常规启动方式,但此操作可能导致数据丢失。
尝试移除当前使用的 redo log 文件后,数据库仍无法启动。错误信息显示 "InnoDB: Page [page id: space=0, page number=0] log sequence number 178377412422 is in the future! Current system log sequence number 165909011496.",这是因为 MySQL writer 线程按配置时间间隔以 page 为单位刷新 buffer 数据至磁盘,新写入磁盘的 page 包含较新的 LSN,但系统表空间头的 LSN 未同步更新,通常这是由检查点线程执行的工作。由于 redo log 已被删除,MySQL 无法执行恢复操作。通过设置 innodb_force_recovery=3 强制启动 MySQL,仍无法启动,修改为 4 后成功启动。使用 mysqldump 导出备份时,MySQL 又崩溃。提示 "InnDB: Failed to find tablespace for table......"。
尝试设置 innodb_force_recovery=5 启动,但数据库依然无法启动,设置为 6 后,数据库成功启动。利用 sqldump 成功备份数据,初始化数据库并导入备份数据后,数据库恢复完成。
关键在于设置 innodb_force_recovery 参数,其说明如下:1. SRV_FORCE_IGNORE_CORRUPT:忽略检测到的 corrupt 页;2. SRV_FORCE_NO_BACKGROUND:阻止主线程运行,可能引起 crash;3. SRV_FORCE_NO_TRX_UNDO:不执行事务回滚操作;4. SRV_FORCE_NO_IBUF_MERGE:不执行插入缓冲合并操作;5. SRV_FORCE_NO_UNDO_LOG_SCAN:不查看重做日志,InnoDB 存储引擎会将未提交事务视为已提交;6. SRV_FORCE_NO_LOG_REDO:不执行前滚操作。