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

如何在近乎零停机下将MySQL实例MA的db1迁移至独立实例MB?

刚好之前处理过几乎一模一样的跨实例MySQL迁移场景,结合你给出的限制条件(允许最多10秒的写暂停、复制延迟可控),完全可以实现近乎零停机的db1迁移,具体步骤如下:

分步实现db1从MA到MB的低停机迁移

一、前期准备(无停机)

  • 在MB实例上创建与MA完全匹配的空db1库,字符集、排序规则必须和MA的db1一致,避免后续数据兼容问题:
    -- 先在MA上执行 SHOW CREATE DATABASE db1; 拿到实际的字符集和排序规则,再在MB上执行
    CREATE DATABASE db1 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  • 配置MA到MB的单向增量复制(仅同步db1):
    1. 在MA上创建专属复制账号,遵循最小权限原则:
      CREATE USER 'repl_db1'@'MB的IP地址' IDENTIFIED BY 'your_strong_password';
      GRANT REPLICATION SLAVE, REPLICATION CLIENT ON db1.* TO 'repl_db1'@'MB的IP地址';
      FLUSH PRIVILEGES;
      
    2. 对MA的db1做全量备份,用--single-transaction保证InnoDB表的一致性,无需锁表:
      mysqldump -h MA_IP -u root -p --single-transaction --databases db1 > db1_full_backup.sql
      
    3. 将备份文件传到MB服务器,导入到MB的db1中:
      mysql -h MB_IP -u root -p db1 < db1_full_backup.sql
      
    4. 立刻在MA上查看当前二进制日志位置(避免备份后数据变化):
      SHOW MASTER STATUS;
      
      记录下File(比如mysql-bin.000015)和Position(比如26891)的值。
    5. 在MB上配置复制并启动:
      CHANGE MASTER TO
      MASTER_HOST='MA_IP',
      MASTER_USER='repl_db1',
      MASTER_PASSWORD='your_strong_password',
      MASTER_LOG_FILE='mysql-bin.000015', -- 替换为刚才记录的File
      MASTER_LOG_POS=26891; -- 替换为刚才记录的Position
      -- 只同步db1,过滤MA上的其他库
      REPLICATE_DO_DB=db1;
      START SLAVE;
      
    6. 验证复制状态,确保同步正常:
      SHOW SLAVE STATUS\G
      
      确认Slave_IO_Running和Slave_SQL_Running均为Yes,且Seconds_Behind_Master小于10(符合你的延迟要求),此时MB的db1会实时同步MA的db1增量数据。

二、切换阶段(停机窗口<10秒)

  • 协调应用团队暂停对MA上db1的所有写事务,这个过程严格控制在10秒内。
  • 等待MB的复制完全追上MA的最新数据,再次执行SHOW SLAVE STATUS\G,确认Seconds_Behind_Master为0,此时MA和MB的db1数据完全一致。
  • 在MA上清理复制账号(可选,防止后续误操作):
    REVOKE ALL PRIVILEGES ON db1.* FROM 'repl_db1'@'MB的IP地址';
    DROP USER 'repl_db1'@'MB的IP地址';
    FLUSH PRIVILEGES;
    
  • 在MB上停止并重置复制进程:
    STOP SLAVE;
    RESET SLAVE ALL;
    
  • 通知应用团队将db1的读写流量切换到MB实例,更新应用配置中的数据库连接地址。

三、验证与收尾

  • 验证数据完整性:对比MA和MB上db1关键表的行数,或者用校验工具确认数据一致:
    -- 在MA上执行
    SELECT COUNT(*) FROM db1.your_key_table;
    -- 在MB上执行相同语句,确保结果匹配
    
  • 观察应用切换后的运行状态,确认读写事务正常,无报错。
  • 确认无误后,可以在MA上删除db1库(建议先保留1-2天,确保没有回滚需求后再删除):
    DROP DATABASE db1;
    

内容的提问来源于stack exchange,提问作者Leonth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:25:13