mysql主从复制如何配置异地复制_mysql跨地域部署方案

来源:这里教程网 时间:2026-02-28 20:49:30 作者:

主库和从库的 server_id 必须全局唯一

跨地域复制本质仍是标准 MySQL 主从,但网络延迟、丢包、带宽限制会让配置稍有不同。最基础却最容易翻车的点是

server_id
—— 它必须是整数,且在所有参与复制的节点中唯一。同城部署时可能随手设成 1/2,异地多机房场景下若未统一规划,极易出现两个从库
server_id
冲突,导致复制中断或日志错乱。

实操建议:

用机房+角色编码规则,比如
sh_master_101
server_id = 101
bj_slave_202
server_id = 202
避免使用 0、1 这类默认值,尤其不要让多个从库都设为 2 修改后必须重启 mysqld 或执行
SET PERSIST server_id = 202
(MySQL 8.0+),仅
SET GLOBAL
不持久

binlog_format 必须设为 ROW,且主库开启 binlog_checksum

跨地域链路不稳定,语句级复制(

STATEMENT
)在从库重放时极易因函数、临时表、非确定性操作失败;而
MIXED
在跨版本或跨配置环境下行为不可控。ROW 格式能确保变更内容精确传递,是异地复制的事实标准。

同时,必须启用

binlog_checksum = CRC32
(MySQL 5.6.6+ 默认开启,但部分旧配置会关掉)。否则网络传输中二进制日志损坏无法被检测,从库可能静默应用错误数据。

检查与设置:

确认:
SELECT @@binlog_format, @@binlog_checksum;
—— 两者都应为
ROW
CRC32
配置文件中写死:
binlog_format = ROW
binlog_checksum = CRC32
不推荐运行时动态改
binlog_format
,需重启生效且会清空当前 binlog

CHANGE REPLICATION SOURCE TO 的连接参数要加超时和重试

异地网络波动大,从库连主库时容易卡在 TCP 握手或认证阶段。默认的

CHANGE REPLICATION SOURCE TO
没有连接超时控制,可能 hang 住数分钟才报错,影响自动化部署或故障恢复。

解决方法是显式指定网络参数:

SOURCE_CONNECT_RETRY = 60
:失败后每 60 秒重试一次(默认 60,但建议显式写出,便于维护)
SOURCE_RETRY_COUNT = 86400
:最大重试次数(默认 2^32−1,但设个合理上限防无限等待)
配合
SOURCE_SSL = 1
(强烈建议异地启 SSL 加密传输,哪怕自签名证书)
避免用域名做
SOURCE_HOST
,优先填主库公网 IP 或内网穿透后的固定端口地址

从库务必关闭 binlog 并设为 read_only=ON

异地从库通常只读,但 MySQL 默认仍可能写入(比如 SQL 线程自身写入 relay log 对应的 event)。若意外开启

log_bin
,又没设
read_only
,可能造成循环复制、GTID 冲突或数据污染。

关键配置项:

skip_log_bin
log_bin = OFF
(5.7 可用
skip_log_bin
,8.0 推荐注释掉
log_bin
行)
read_only = ON
:阻止普通用户写入(注意:对 SUPER 权限用户无效,所以要严格管控账号)
super_read_only = ON
(MySQL 5.7.8+):进一步锁死 SUPER 用户的写权限,上线前必开

真正麻烦的不是配置本身,而是「以为配了,其实没生效」——比如

read_only
被动态 SET 过但没写进配置文件,重启后失效;或者
super_read_only
在低版本 MySQL 中不存在,误配导致启动失败。

相关推荐