乐趣区

关于故障:故障分析-MySQL-clone-自动重启失败的解决方式

作者:李鹏博

爱可生 DBA 团队成员,次要负责 MySQL 故障解决和 SQL 审核优化。对技术执着,为客户负责。

本文起源:原创投稿

* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。


<br/>


<center> 作者自画像 </center>

MySQL 8 增加了新的 clone 插件,被用于 MGR 的分布式复原当中,也能够用来进行物理备份复原。

然而在进行 clone 操作的过程中,当拉取数据实现并进行主动重启 server 时,总是会呈现重启失败的景象,如:

日志报错提醒 RESTART 失败,须要在前面手动重启,错误代码 3707,即:ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process)。

而在对于 clone 的官网文档相干链接:https://dev.mysql.com/doc/ref… 中,也特地阐明了这个报错:

意思说是当 recipient server 在 clone 数据拉取实现后会进行重启操作,前提是监控过程可用。而当呈现相干报错时也不必放心,并不能阐明 clone 失败了,随后只须要手动重启就能够了。

通过下面的日志和官网文档咱们失去了呈现重启失败的两个线索:RESTART、监控过程。

先看对于 RESTART 的相干官网文档阐明(https://dev.mysql.com/doc/ref…):

通过这段文档咱们能够晓得,如果想要胜利执行“RESTART”命令,须要有一个监控过程,所以“RESTART”执行胜利与否的要害就在于这个监控过程,而这个监控过程到底是什么文档在前面也进行了阐明:

这时候咱们就晓得在类 Unix 零碎中应用 systemd 或 mysqld_safe 来实现这个监控过程。

然而有时当咱们应用自建的 systemd 的 MySQL service 服务时,仍旧不能实现主动重启,而问题的要害还是在于没有配置好相干的监控过程,咱们能够参考官网 rpm 包装置 MySQL Server 时生成的 systemd 的 service 文件的“[Service]”区域:

Restart=on-failure

RestartPreventExitStatus=1

# Set enviroment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1

官网的 systemd 的 service 文件曾经指出了如果想要实现主动重启,最重要的就是要设置“Environment=MYSQLD_PARENT_PID=1”,PID 为 1 的过程就是 systemd 的过程。

而官网设置的重启机会是“on-failure”,即数据库当遇到异样宕机、过程中断信号或监控超时时就会进行重启,然而当数据库异样宕机时,有时咱们并不想让数据库立即主动重启,而是须要在运维和开发人员确认过问题之后进行手动重启,这时候咱们就须要调整主动重启的策略。

在“RESTART”相干的官网文档中,明确指出了“RESTART”命令执行时数据库敞开时的退出状态码:16。这时咱们就能够设置只有当数据库退出状态码为 16 时才进行主动重启,而在其余状况下不会进行主动重启,MySQL 的 systemd 的 service 的“[Service]”区域进行如下配置:

RestartForceExitStatus=16
RestartPreventExitStatus=1
# Set enviroment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1

“RestartForceExitStatus=16”的意思就是说不论是否配置了“Restart=”,当服务的退出状态码为 16 时都会进行主动重启,这样就解决了 clone 主动重启失败的问题,同时也保障了数据库在其余异常情况下不会进行主动重启。

如给 MySQL 发送中断信号时不会主动重启:

当执行 clone 操作时能够主动重启

没有了之前的报错,进行主动重启

退出移动版