如何在近乎零停机下将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):
- 在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; - 对MA的db1做全量备份,用
--single-transaction保证InnoDB表的一致性,无需锁表:mysqldump -h MA_IP -u root -p --single-transaction --databases db1 > db1_full_backup.sql - 将备份文件传到MB服务器,导入到MB的db1中:
mysql -h MB_IP -u root -p db1 < db1_full_backup.sql - 立刻在MA上查看当前二进制日志位置(避免备份后数据变化):
记录下SHOW MASTER STATUS;File(比如mysql-bin.000015)和Position(比如26891)的值。 - 在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; - 验证复制状态,确保同步正常:
确认SHOW SLAVE STATUS\GSlave_IO_Running和Slave_SQL_Running均为Yes,且Seconds_Behind_Master小于10(符合你的延迟要求),此时MB的db1会实时同步MA的db1增量数据。
- 在MA上创建专属复制账号,遵循最小权限原则:
二、切换阶段(停机窗口<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
相关产品推荐
相关产品推荐

