如何在MySQL Shell 8.0.23中停止MySQL复制以执行实例转储
MySQL Shell 备份延迟副本前停止复制SQL线程实现方案
MySQL Shell Python模式内置会话执行接口,无需调用外部mysql客户端即可直接执行复制控制语句,完全等效于你给出的命令行操作:仅停止SQL应用线程,保留IO线程持续拉取主库二进制日志,后续重启复制无需重新拉取同步日志。
注意事项
- 执行脚本使用的数据库账号需要持有
REPLICATION_SLAVE_ADMIN权限,否则停/启复制操作会抛出权限错误 - MySQL 8.0.23同时兼容旧版
STOP SLAVE语法和新版STOP REPLICA语法,执行效果完全一致 - 建议增加异常捕获逻辑,无论备份成功还是失败,都自动重启复制SQL线程,避免副本长期停止同步
完整修改后代码
import os import time TIME = time.strftime("%Y%m%d-%H%M") MYSQL_HOST = os.getenv('MYSQL_HOST') MYSQL_PORT = os.getenv('MYSQL_PORT') BACKUP_PATH = "/backup/"+MYSQL_HOST+":"+MYSQL_PORT+"//"+TIME try: # 停止副本SQL线程,和命令行STOP SLAVE SQL_THREAD效果完全一致 session.sql("STOP SLAVE SQL_THREAD;").execute() # 轮询确认SQL线程已完全停止,再启动备份 replica_status = session.sql("SHOW SLAVE STATUS").fetch_one() while replica_status.get_string("Slave_SQL_Running") != "No": time.sleep(1) replica_status = session.sql("SHOW SLAVE STATUS").fetch_one() # 执行实例转储备份 util.dump_instance( BACKUP_PATH, {'dryRun': False, 'threads': 4, 'showProgress': True, 'consistent': True}) finally: # 无论备份成功、报错还是手动中断,都自动重启复制SQL线程 session.sql("START SLAVE SQL_THREAD;").execute()
逻辑说明
session.sql().execute()是MySQL Shell内置的SQL执行方法,会自动复用当前Shell的数据库连接,不需要额外传入连接参数,执行效果和原生mysql客户端完全一致- 增加线程状态检查逻辑,避免SQL线程未完全停止时启动备份,导致一致性快照出现偏差
finally块做兜底,不会因为备份流程异常导致副本复制长期中断
内容的提问来源于stack exchange,提问作者Jules
相关产品推荐
相关产品推荐

