Mysql历险记: Job for mysqld.service failed because the control process exited with error code

现象

经过一个五一小长假,电脑也得到了很好的休息。

开工第一天,发现Mysql挂掉了,原因是其他服务产生了大量日志,把磁盘搞满了。

理论上,磁盘满了,删除点文件,把空间释放出来,再重启Mysql就好了。

但这次,重启不了了,查看状态显示如下:

在这里插入图片描述

定位解决

重启了几次,查看状态时,都是报这个错误。

下面看一下Mysql的日志吧:

在这里插入图片描述

这里的信息比较详细,可以看出Mysql在几天前已经挂掉了,它把丢弃无法恢复的数据。

好在它给出了解决方法:set innodb_force_recovery=1

于是,修改配置文件,vim /etc/my.cnf,在最后增加一行:innodb_force_recovery=1。

重启Mysql:

在这里插入图片描述

ok,启动正常,但业务报错,继续查看Mysql日志:

在这里插入图片描述

唂,把innodb_force_recovery设置为1后,Mysql不允许修改数据了,需要把它设置为0.

按照提示,vim /etc/my.cnf,修改innodb_force_recovery=0,重启Mysql:

在这里插入图片描述

ok了,业务也正常了。

关于innodb_force_recovery

Mysql的innodb_force_recovery,说明如下:

这个参数一般是不会用到的。他是当mysql crash后,导致数据库表空间损坏,或者其他原因导致innodb事务日志损坏等原因导致mysql 闪退后无法正常启动。

这个参数的默认值是0, 如果面临上述问题,无法正常启动mysql,并且查看mysql错误日志发现导致mysql无法启动的原因是innodb的问题,那么就需要设置这个参数了。

它的取值范围是0-6,含义如下:

  • 1:(SRV_FORCE_IGNORE_CORRUPT): 忽略检查到的 corrupt 页。尽管检测到了损坏的 page 仍强制服务运行。一般设置为该值即可,然后 dump 出库表进行重建。
  • 2:(SRV_FORCE_NO_BACKGROUND): 阻止主线程的运行,如主线程需要执行 full purge 操作,会导致 crash。 阻止 master thread 和任何 purge thread 运行。若 crash 发生在 purge 环节则使用该值。
  • 3:(SRV_FORCE_NO_TRX_UNDO): 不执行事务回滚操作。
  • 4:(SRV_FORCE_NO_IBUF_MERGE): 不执行插入缓冲的合并操作。如果可能导致崩溃则不要做这些操作。不要进行统计操作。该值可能永久损坏数据文件。若使用了该值,则将来要删除和重建辅助索引。
  • 5:(SRV_FORCE_NO_UNDO_LOG_SCAN): 不查看重做日志,InnoDB 存储引擎会将未提交的事务视为已提交。此时 InnoDB 甚至把未完成的事务按照提交处理。该值可能永久性的损坏数据文件。
  • 6:(SRV_FORCE_NO_LOG_REDO): 不执行前滚的操作。恢复时不做 redo log roll-forward。使数据库页处于废止状态,继而可能引起 B 树或者其他数据库结构更多的损坏。

使用参数innodb_force_recovery建议:

  • 如果MySQL服务故障重启后,因为事务回滚导致异常,可以将参数innodb_force_recovery设置为3跳过回滚阶段
  • 如果因为MySQL数据页损坏导致异常,可以使用SELECT+WHERE查找出未损坏数据并将其通过mysqldump导出。
  • 将innodb_force_recovery参数设置大于0启动服务后,应通过修改端口或域名(VIP)指向来屏蔽应用访问。
  • 将innodb_force_recovery参数设置大于0启动服务后,可以通过mysqlcheck命令来对表进行检查/分析/优化/修复。
  • 使用force_recovery重启服务前,建议对数据库所有文件进行备份,避免修复过程中对数据进行二次损害。
小结

Mysql应用广泛,但要想做到高可用,还是要好好思考一下的。

但Mysql崩溃后也不要慌乱,查看日志是解决问题的第一步,它的日志记录的还是非常完善的。

参考资料

MySQL–使用innodb_force_recovery修复数据库异常

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
"Job for mysqld.service failed because the control process exited with error code" 这个错误提示表明MySQL的控制进程退出并且返回了错误代码。该错误通常是由于一些配置问题或者系统资源不足引起的。要解决这个问题,你可以按照以下步骤进行操作: 1. 首先,你可以使用命令 "systemctl status mysqld.service" 来查看更详细的错误信息。这会显示出MySQL服务的状态和错误日志。请确保你已经正确安装和配置了MySQL,并检查日志中是否有任何明显的错误信息。 2. 如果你在日志中找到了错误信息,可以根据错误提示进行相应的修复。常见的问题包括数据库文件的权限问题、配置文件错误、端口占用等。请仔细检查并修复这些问题。 3. 如果你无法找到明显的错误信息,你还可以尝试运行命令 "journalctl -xe" 来查看系统日志中的其他错误信息。这些错误可能与MySQL服务相关或者是其他系统组件的问题。请仔细阅读日志并根据提示进行修复。 总之,当出现"Job for mysqld.service failed because the control process exited with error code"错误时,你应该先查看系统日志和MySQL服务状态,找到具体的错误信息,并根据提示进行相应的修复。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Job for mysqld.service failed because the control process exited with error code.](https://blog.csdn.net/yujinlong2002/article/details/128555984)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [解决MySQL因不能创建 PID 导致无法启动的方法](https://download.csdn.net/download/weixin_38519660/13698119)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值