You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 07:27:15