异地mysql灾备不能仅依赖主从复制,必须满足可验证一致性、可安全切换、可独立接管流量三大前提:主库强制ssl且限制ip授权,从库启用relay_log_recovery并校验数据,binlog实时推送对象存储以保障rpo≤10秒。

不能只靠主从复制就认为实现了容灾——它只是必要条件,不是充分条件。跨地域主从同步本身解决的是数据搬运问题,但误删、SQL线程卡死、GTID错位、网络抖动导致的中继日志丢失……这些都会让从库“看起来在跑”,实际已不可用。真正能进灾备流程的异地从库,必须满足三个硬性前提:可验证一致性、可安全切换、可独立接管流量。
主库必须关闭公网直连,且强制 SSL
跨地域场景下,ERROR 2003 (HY000): Can't connect to MySQL server 和 ERROR 1045 (28000): Access denied 八成源于主库暴露在公网且未加固。直接开 3306 + 'repl'@'%' 是高危操作。
- 主库
my.cnf必须设require_secure_transport = ON,否则密码明文走公网 - 从库连接字符串里必须带
?ssl-mode=REQUIRED(MySQL 8.0+)或指定--ssl-ca(5.7) - 主库授权语句不能用
'repl'@'%',而要精确到对端 NAT 网关 IP 或弹性公网 IP,例如'repl'@'203.205.128.45' - 云厂商安全组/防火墙只放行该 IP 段,禁用全网段(
0.0.0.0/0)
从库必须开启 relay_log_recovery 并禁用 read_only 写保护
异地链路不稳定,从库宕机重启后若 relay log 断在中间,Seconds_Behind_Master 可能显示为 0,但实际已丢日志——这是灾备失效最隐蔽的入口。
- 从库
my.cnf必须设relay_log_recovery = ON(MySQL 5.6+ 默认 OFF) -
relay_log_info_repository = TABLE,避免崩溃后master.info文件残留旧位置 - 灾备演练前临时执行
SET GLOBAL read_only = OFF,否则START SLAVE会因权限拒绝报错 - 切主前必须确认
SHOW SLAVE STATUS\G中SQL_Delay为 0,且Exec_Master_Log_Pos已追平
必须用 pt-table-checksum 校验内容,而非只看 Seconds_Behind_Master
Seconds_Behind_Master = 0 只代表 relay log 已拉完、SQL 线程空闲,不代表数据一致。一次 SET sql_log_bin = 0 或从库被误写,就能让主从差异静默存在数周。
- 校验前确保主从
binlog_format = ROW,否则pt-table-checksum结果无效 - 在主库执行:
pt-table-checksum --nocheck-replication-filters --replicate=test.checksums --databases=db1,db2 h=master_host,u=repl,p=xxx - 校验后立刻查从库:
SELECT * FROM test.checksums WHERE master_cnt != this_cnt;,有结果即不一致 - 修复用
pt-table-sync时务必加--print先看 SQL,线上禁用--execute直接刷库
binlog 必须实时推送到对象存储,不能只依赖从库
主从复制 RPO(恢复点目标)受限于网络延迟和从库 SQL 线程处理速度,上海到新加坡批量写入时,Seconds_Behind_Master 显示 2 秒,实际积压可能达 3 分钟。仅靠从库,RPO 无法压到秒级。
- 主库部署
mysqlbinlog --raw --read-from-remote-server --host=127.0.0.1 --user=repl --password=xxx mysql-bin.000001 | aws s3 cp - s3://bucket/binlog/$(date +%Y%m%d_%H%M%S).binlog - 对象存储路径按
region/date/binlog_file组织,便于按时间点快速定位 - 配合定期全量备份(
mysqldump --single-transaction+sha256sum校验),RPO 可稳定控制在 10 秒内 - 注意主库
expire_logs_days不能设太小,否则 binlog 被自动清理,对象存储又没同步完,就会断链
真正落地时,最难的不是配置 CHANGE REPLICATION SOURCE TO,而是把校验、推送、切换这三件事变成自动化流水线——人工介入越少,灾备越可信。任何环节留白,都等于在 RTO/RPO 指标上埋雷。











