迁移时需调大wait_timeout和interactive_timeout至约24.8天以防断连,同步增大max_allowed_packet至512M避免大包截断,并优化TCP参数如tcp_tw_reuse、缓冲区及禁用Nagle算法;内网迁移应关闭SSL以保性能。
迁移时连接超时:wait_timeout 和 interactive_timeout 必须调大
MySQL 默认的 wait_timeout 是 28800 秒(8 小时),但实际迁移工具(如 mysqldump、mydumper 或应用直连同步)在长事务、大表导出或网络抖动时,很容易因空闲等待超时被服务端主动断连,报错类似 Lost connection to MySQL server during query。
- 建议在迁移前,在目标/源库的
my.cnf中临时设为wait_timeout = 2147483(约 24.8 天,MySQL int 最大值),interactive_timeout同步调整 - 仅需改服务端配置,客户端无需对应修改;但要注意该设置对所有连接生效,迁移完建议恢复合理值(如 7200)
- 如果用
mysqldump,加上--skip-extended-insert可减少单条语句长度,降低因语句执行慢触发超时的概率
大包传输失败:max_allowed_packet 不够会静默截断
迁移中遇到 INSERT 语句突然中断、数据少几行、或者 Packet for query is too large 报错,基本就是 max_allowed_packet 溢出。它控制服务端能接收/返回的最大单个 packet,而 mysqldump 默认每行生成一个 INSERT,但带 --extended-insert(默认开启)时会拼成超长语句,极易突破默认 4MB 限制。
- 源库和目标库都需调高:在
my.cnf中设max_allowed_packet = 512M(注意单位是 M,不是 MB) - 若用
mysql客户端导入 SQL 文件,也要加参数:mysql --max_allowed_packet=512M -u user -p db - 调太大可能增加内存压力,512M 对百 GB 级迁移已足够;不建议设为 0(表示无限),MySQL 8.0+ 已弃用该用法
网络重传与缓冲:TCP 层优化比 MySQL 参数更关键
跨机房、云厂商 VPC 间迁移时,真正卡顿往往不在 MySQL 内部,而在 TCP 层丢包重传。MySQL 自身无重传机制,一次丢包就导致整个 packet 重发,叠加延迟后表现就是「卡住几秒后突然继续」。