故障分析 | MySQL clone 自动重启失败的解决方式

本文探讨了MySQL8的Clone插件在分布式恢复中的重启失败问题,重点解析了监控进程的重要性,指出自建systemd服务时需要配置环境变量以确保自动重启,并介绍了如何通过设置RestartForceExitStatus解决重启失败。

作者:李鹏博

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

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。



作者自画像

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/refman/8.0/en/clone-plugin-remote.html中,也特别说明了这个报错:

意思说是当 recipient server 在 clone 数据拉取完成后会进行重启操作,前提是监控进程可用。而当出现相关报错时也不用担心,并不能说明 clone 失败了,随后只需要手动重启就可以了。

通过上面的日志和官方文档我们得到了出现重启失败的两个线索:RESTART 、监控进程。

先看关于 RESTART 的相关官方文档说明(https://dev.mysql.com/doc/refman/8.0/en/restart.html):

通过这段文档我们可以知道,如果想要成功执行“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 操作时可以自动重启

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

### 配置 MySQL 主从复制 MySQL 主从复制是一种常见的数据库高可用性和负载均衡方案,通过将主服务器(Master)的数据复制到一个或多个从服务器(Slave),可以实现数据的冗余备份、读写分离和故障转移。以下是实现 MySQL 主从复制的详细步骤。 #### 1. 准备工作 在开始配置之前,需要确保以下几点: - 主服务器和从服务器都已安装 MySQL,并且版本兼容。 - 确保主服务器和从服务器之间的网络连接畅通。 - 主服务器和从服务器的 `server-id` 必须不同,且从服务器的 `server-id` 不能与主服务器相同。 #### 2. 配置主服务器(Master) 首先,在主服务器上启用二进制日志(Binary Log),并设置唯一的 `server-id`。编辑 MySQL 的配置文件(通常是 `/etc/my.cnf` 或 `/etc/mysql/my.cnf`),添加或修改以下内容: ```ini [mysqld] server-id=1 log-bin=mysql-bin ``` 保存并重启 MySQL 服务以使配置生效。 接下来,创建一个专门用于主从复制的用户,并授予相应的权限: ```sql CREATE USER 'replica'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; ``` 然后,查看主服务器当前的二进制日志文件名和位置,以便在从服务器上指定同步点: ```sql SHOW MASTER STATUS; ``` 输出示例: | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | |-------------------|----------|--------------|------------------| | mysql-bin.000001 | 1000 | | | 记录下 `File` 和 `Position` 的值,后续配置从服务器时会用到。 #### 3. 配置从服务器(Slave) 在从服务器上同样需要设置唯一的 `server-id`,并且要小于主服务器的 `server-id`。编辑 MySQL 的配置文件,添加或修改以下内容: ```ini [mysqld] server-id=2 ``` 保存并重启 MySQL 服务。 接下来,停止从服务器的复制进程(如果之前已经配置过),并重置所有复制相关的设置: ```sql STOP SLAVE; RESET SLAVE ALL; ``` 然后,使用 `CHANGE MASTER TO` 命令指定主服务器的信息,包括 IP 地址、复制用户、密码、二进制日志文件名和位置: ```sql CHANGE MASTER TO MASTER_HOST='10.1.1.90', MASTER_USER='replica', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1000; ``` 最后,启动从服务器的复制进程: ```sql START SLAVE; ``` #### 4. 验证主从复制是否正常运行 在从服务器上执行以下命令,查看复制状态: ```sql SHOW SLAVE STATUS\G ``` 重点关注以下两个字段: - `Slave_IO_Running`: YES - `Slave_SQL_Running`: YES 如果这两个字段的值都是 `YES`,则表示主从复制已经成功启动。 #### 5. 常见问题及解决方法 - **网络问题**:确保主服务器和从服务器之间的网络连接正常,可以通过 `ping` 或 `telnet` 测试端口连通性。 - **权限问题**:确保复制用户具有 `REPLICATION SLAVE` 权限,并且可以从从服务器访问主服务器。 - **日志文件或位置错误**:如果 `CHANGE MASTER TO` 中指定的 `MASTER_LOG_FILE` 或 `MASTER_LOG_POS` 不正确,会导致复制失败。可以通过 `SHOW MASTER STATUS` 在主服务器上重新获取正确的日志文件和位置。 - **UUID 冲突**:如果从服务器的 `server-id` 与主服务器相同,或者从服务器的 UUID 与其他从服务器冲突,也会导致复制失败。确保每个服务器的 `server-id` 唯一。 #### 6. 克隆数据库 除了配置主从复制外,还可以通过克隆数据库的方式快速创建一个与主服务器相同的数据副本。MySQL 提供了多种方式来克隆数据库,以下是两种常见的方法: ##### 方法一:使用 `mysqldump` 工具 `mysqldump` 是 MySQL 自带的一个命令行工具,可以用来导出数据库的结构和数据。在主服务器上执行以下命令,将数据库导出为 SQL 文件: ```bash mysqldump -u root -p --single-transaction --master-data=2 database_name > backup.sql ``` 其中,`--single-transaction` 选项确保导出的数据是一致的快照,而 `--master-data=2` 选项会在导出的 SQL 文件中插入 `CHANGE MASTER TO` 语句,记录当前的二进制日志文件和位置。 将 `backup.sql` 文件传输到从服务器,并导入数据库: ```bash mysql -u root -p database_name < backup.sql ``` 导入完成后,根据 `backup.sql` 文件中的 `CHANGE MASTER TO` 语句,配置从服务器的复制设置。 ##### 方法二:使用 MySQL 的克隆插件(MySQL 8.0+) 从 MySQL 8.0 开始,MySQL 引入了克隆插件(Clone Plugin),允许直接克隆整个数据库实例。克隆插件可以在不中断主服务器的情况下,将主服务器的数据、日志、表空间等完整地复制到从服务器。 在从服务器上安装克隆插件: ```sql INSTALL PLUGIN clone SONAME 'mysql_clone.so'; ``` 然后,使用 `CLONE INSTANCE` 命令克隆主服务器的数据: ```sql CLONE INSTANCE FROM 'replica'@'10.1.1.90':3306 IDENTIFIED BY 'password'; ``` 克隆完成后,从服务器会自动停止,并重新启动以应用克隆的数据。克隆插件的优势在于它能够高效地复制大量数据,并且不会影响主服务器的性能。 #### 7. 主从复制的应用场景 - **读写分离**:通过主从复制,可以将写操作集中在主服务器上,而将读操作分散到多个从服务器上,从而提高系统的并发处理能力。 - **数据备份与恢复**:从服务器可以作为主服务器的备份,当主服务器发生故障时,可以快速切换到从服务器,确保业务连续性。 - **负载均衡**:通过多个从服务器分担读请求,可以有效降低主服务器的压力,提升整体系统的性能。 - **数据分析**:可以将从服务器用于数据分析、报表生成等操作,避免对主服务器造成额外负担。 #### 8. 主从复制的注意事项 - **延迟问题**:由于主从复制是异步的,从服务器可能会存在一定的数据延迟。如果对数据一致性要求较高,可以考虑使用半同步复制(Semi-Synchronous Replication)或组复制(Group Replication)。 - **数据一致性**:在主从复制过程中,如果主服务器发生了某些操作(如 `DELETE`、`UPDATE`),而从服务器未能及时同步,可能会导致数据不一致。可以通过定期检查 `SHOW SLAVE STATUS` 来监控复制状态。 - **版本兼容性**:不同版本的 MySQL 可能会对复制行为产生影响,建议主从服务器使用相同的 MySQL 版本,以避免兼容性问题。 - **安全性**:为了防止未经授权的访问,建议对复制用户进行严格的权限控制,并使用 SSL 加密连接,确保数据传输的安全性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值