mysql主从复制:搭建、状态检查与断点恢复
前言
主从复制是 mysql 高可用的基础:读写分离、故障切换、异地备份都建立在它之上。这篇整理主从搭建的完整步骤、状态检查要点,以及复制中断后的几种恢复手段——生产环境主从挂掉大多是「中断后不知道怎么安全地恢复」,这部分才是重点。
一、主库(Master)配置
1. 修改 my.cnf 开启 binlog
|
|
2. 重启后创建复制账号
|
|
3. 查看主库状态(记下 File 和 Position,从库对接要用)
|
|
二、从库(Slave)配置
1. 修改 my.cnf
|
|
注意:多台从库的 server-id 绝不能重复——克隆机器搭建的从库最容易踩这个坑。
2. 重启后建立复制关联
|
|
MASTER_LOG_FILE / MASTER_LOG_POS 要对应主库 SHOW MASTER STATUS 查出来的值。
3. 启动并检查复制线程
|
|
三、server_uuid 冲突报错
如果错误日志出现:
|
|
原因是复制过来的数据目录里 auto.cnf 中生成的 UUID 与其他实例撞了。直接删掉 data 目录下的 auto.cnf 重启,让 mysql 重新生成 UUID 即可。
四、状态检查看什么
SHOW SLAVE STATUS\G 输出很长,重点盯这几行:
IO 线程状态为 Waiting for master to send event 说明与主库的连接正常。
Slave_IO_Running 和 Slave_SQL_Running 必须同时为 Yes——前者负责拉主库 binlog,后者负责回放 relay log,任何一个为 No 复制就断了。
Slave has read all relay log; waiting for the slave I/O thread to update it 表示 SQL 线程已追平,处于正常等待。
五、复制中断的三种恢复策略
从库回放出错(常见如主从表结构不一致、记录不存在)时,Last_Errno / Last_Error 会给出原因:
上例是错误码 1677:主从同一列的 varchar 长度不一致导致转换失败。处理按优先级:
方法 1:跳过错误 Event(错误量少时首选)
|
|
一条条跳,跳完观察是否恢复正常。
方法 2:跳过指定类型的错误
在 my.cnf 的复制配置段加:
|
|
重启实例后 START SLAVE。因为要重启数据库不推荐,除非错误事件太多逐条跳不现实。
方法 3:还原被误删的数据
根据报错指向的 binlog 位置,用 mysqlbinlog 找出该条 event 的 SQL 手动逆向执行(如 delete 改 insert):
|
|
跳错命令(
SET GLOBAL SQL_SLAVE_SKIP_COUNTER)慎用:跳多了主从表面正常、数据实际不一致,排查起来更痛苦。
六、修复表结构不一致
报错 1677 这类问题,根因是主从表结构 drift。确认两边建表语句:
|
|
不一致时以主库为准修正从库;顺手统一字符集:
|
|
七、用 mydumper 快速重建备库
错误积累太多、或想从指定时间节点重搭从库时,物理备份重建比逐条修复快得多:
|
|
八、主从一致性校验
修复或跳错之后,用两份SQL校验数据是否还对得上:
|
|
总结
主从复制三个关键点:搭建时 server-id 唯一(克隆机器记得删 auto.cnf);巡检时盯住 两个 Running 都为 Yes;中断后优先「定位报错 → 少量跳过 / 逆向修复 → 一致性校验」,跳错是最后手段。数据量大时直接 mydumper 重建从库,比反复跳错可靠得多。
参考
相关阅读
- 原文作者:Anttu
- 原文链接:https://anTtutu.github.io/post/2020-12-26-mysql-master-slave-replication/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。