必须走内网以保障同步稳定性,跨云迁移可通过vpc对等连接或cen实现内网互通;需正确配置内网ip、安全组、tcp参数及mysql参数(如max_allowed_packet=512m、wait_timeout=2147483),禁用ssl与冗余压缩,确保ntp和字符集一致。

必须走内网,否则延迟不可控——公网迁移基本等同于放弃同步稳定性。
主库和从库是否在同一个VPC内
跨云迁移(如阿里云到腾讯云、AWS到GCP)本质是跨网络域操作,但“跨云”不等于“必须走公网”。只要两边云厂商支持VPC对等连接或云企业网(CEN),就能打通内网通道。实际中失败最多的情况是:误用公网IP或EIP配置CHANGE MASTER TO MASTER_HOST,导致连接被防火墙拦截或限速。
- 确认主库
bind_address设为内网IP(如10.0.1.10),不是127.0.0.1或0.0.0.0 - 从库执行
CHANGE MASTER TO时,MASTER_HOST必须填对方内网IP,DNS域名会触发额外解析延迟且不可靠 - 安全组双向放行:主库3306端口入方向来源为从库内网IP;从库出方向目标为主库内网IP+3306
- 用
telnet 主库内网IP 3306验证连通性,比ping更准确(ICMP可能被禁)
max_allowed_packet和wait_timeout怎么设才不丢包
迁移工具(如mydumper或mysqlpump)在长连接中持续发送大INSERT语句,一旦max_allowed_packet不足,服务端会静默截断语句,表现为数据少几行、无报错但INSERT结果行数异常;而wait_timeout太小则直接断连,报错Lost connection to MySQL server during query。
- 源库和目标库的
my.cnf都要设max_allowed_packet = 512M(注意单位是M,不是MB) -
wait_timeout = 2147483(约24.8天),interactive_timeout同步调整;迁移完成后必须改回合理值(如7200) - 若用
mysql客户端导入SQL文件,命令行必须加--max_allowed_packet=512M,否则客户端自身也会截断 -
mysqldump加--skip-extended-insert可避免单条超长语句,但会降低导入速度,仅作保底方案
TCP参数调优比MySQL参数更关键
MySQL本身没有重传机制,一次TCP丢包就导致整个packet重发,叠加网络RTT后表现就是“卡住几秒后突然继续”。尤其在跨机房、跨可用区链路中,真正瓶颈常在TCP层而非MySQL配置。
- 在Linux系统上启用BBR拥塞控制:
sysctl -w net.ipv4.tcp_congestion_control=bbr - 增大TCP缓冲区:
sysctl -w net.core.rmem_max=16777216、sysctl -w net.core.wmem_max=16777216 - 禁用Nagle算法对binlog同步有效,但在
mydumper这类大块写场景收益有限,可不设TCP_NODELAY - 内网迁移务必关闭SSL:
require_secure_transport = OFF,否则万兆以下网卡吞吐下降20%~40%
别迷信压缩,内网带宽足够时压缩反而拖慢整体进度
很多团队习惯对mysqldump输出用gzip再传输,但在千兆/万兆内网环境下,CPU压缩/解压耗时远高于原始数据传输时间,实测反而降低吞吐。
- 优先选
mydumper+myloader组合,支持多线程导出导入,内网吞吐比mysqldump高3–5倍 - 导出时加
-t 8控制线程数,避免从库IOPS打满导致SQL线程堆积 - 如确需压缩(比如中间落盘),用
zstd -T0替代gzip,多线程压缩效率更高 - 避开业务高峰执行迁移,否则源库锁表或CPU争抢会放大网络抖动影响
最容易被忽略的是时间同步和字符集一致性——NTP未校准会导致GTID时间戳错乱,character_set_server不一致会让Emoji字段在目标库变问号,这些问题不会报错,但数据已损坏。











