微信优化

weixinyouhua

mysql主从复制配置步骤是什么,mysql主从复制原理详解?

2026-09-23 18:51:59

MySQL主从复制配置并不复杂,抓住主库开binlog、从库做change master、启动同步三步走就能跑通,但真正考验人的是架构选型和异常处理。

先说结论:MySQL主从复制本质是主库把binlog日志推给从库,从库通过relay log回放实现数据一致,这套机制已经稳定运行了二十多年,目前仍然是中小团队搭建读写分离、备份容灾最常用的方案,下面直接拆解完整配置流程和坑点。

为什么多数团队仍然选择MySQL主从复制

很多人纠结该上MGR还是继续用传统主从,行业共识认为:主从复制胜在简单、可控、跨版本兼容性好,MySQL 5.7和8.0的原生复制机制没有本质变化,网上大量的历史踩坑经验依然有效。

MySQL主从复制和MGR有什么区别

  • 主从复制:异步或半同步,靠binlog推送,架构简单,延迟可控,适合读写分离场景
  • MGR:组复制,多节点强一致,但部署复杂度高,网络抖动敏感,节点数量建议奇数

多数中小项目没有强一致要求,用主从复制可以节省大量运维精力,如果你在纠结怎么选择,读多写少、能容忍秒级延迟就直接上主从;如果业务需要对账、资金类强一致,才需要考虑MGR或其它方案。

MySQL双主和一主多从有什么不同

  • 双主:两个节点互为主从,业务写入其中任意一台,常用于高可用切换,但需要处理自增主键冲突和脑裂问题
  • 一主多从:单点写入,多台从库分摊读流量,架构清晰,故障切换需要人工或外部脚本干预

从实际使用场景看,一主多从覆盖了80%以上的需求,双主更像是高可用中间件(如MHA)的底层配置。

MySQL主从复制配置步骤详解

重点来了,这里用MySQL 8.0版本演示,5.7基本一致,全程需要两台服务器,假设主库IP是192.168.1.10,从库IP是192.168.1.11。

mysql主从复制配置步骤是什么,mysql主从复制原理详解?

第一步:修改主库配置文件

在my.cnf或my.ini的[mysqld]段加入:

  • server-id=1(必须全局唯一)
  • log-bin=mysql-bin(开启二进制日志)
  • binlog_format=ROW(行级复制,官方默认,兼容性最好)
  • expire_logs_days=7(控制binlog保留时间,生产环境建议至少保留3天,便于从库追进度)

然后执行systemctl restart mysqld(不同发行版命令略有差异),重启完成后用SHOW MASTER STATUS确认binlog已经开启。

第二步:创建复制专用账号

在主库执行授权命令:

CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'YourStrongPassword';
GRANT REPLICATION SLAVE ON . TO 'repl'@'192.168.1.%';
FLUSH PRIVILEGES;

注意MySQL 8.0默认认证插件是caching_sha2_password,如果你的从库版本较老,需要改用mysql_native_password,否则同步时会报认证错误。

第三步:备份主库数据并恢复到从库

这是最容易被忽略的一步,如果直接拿一个没有数据的空库做从库,复制过程会直接断裂,除非你只新建库不同步历史数据。

主流做法是用mysqldump或XtraBackup做物理备份:

mysqldump -uroot -p --single-transaction --master-data=2 --all-databases > master.sql
  • –single-transaction:InnoDB表拿到一致性快照,不锁表
  • –master-data=2:自动记录SHOW MASTER STATUS的坐标,后面change master要用

把备份文件传到从库后执行mysql -uroot -p < master.sql恢复。

第四步:从库配置文件修改

从库需要配置:

  • server-id=2(不能和主库重复也不能复用历史值)
  • read_only=1(普通账号只读,防止应用误写)

mysql主从复制配置步骤是什么,mysql主从复制原理详解?

重启从库服务后进入MySQL执行:

CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_USER='repl',
MASTER_PASSWORD='YourStrongPassword',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=154;

MASTER_LOG_FILE和MASTER_LOG_POS从备份文件头部或主库SHOW MASTER STATUS输出里获取。

第五步:启动复制并验证

START SLAVE;
SHOW SLAVE STATUSG;

重点关注两个字段:

参数名 正常状态 含义
Slave_IO_Running Yes IO线程正常拉取binlog
Slave_SQL_Running Yes SQL线程正常回放relay log

如果两项都是Yes,复制就算建立成功了,可以通过在主库建测试表插入一条数据,在从库查询验证。

MySQL主从复制延时高怎么解决

做了主从之后最扎心的问题就是延迟,延迟产生的原因五花八门,排查方向比执行命令更重要。

排查思路和实用命令

先在从库执行SHOW SLAVE STATUS查看Seconds_Behind_Master字段,这个值接近0说明没有堆积,如果数值持续增长,按照以下顺序排查:

  • 主库是否有大事务长时间运行(查information_schema.innodb_trx)
  • 从库服务器CPU/IO是否被打满(用top和iostat看)
  • 从库的binlog和relay log是否放在同一块磁盘
  • 复制线程是否被慢查询拖累(打开慢查询日志定位)

解决主从延迟的实操手段

  • 升级半同步复制:主库等从库确认收到binlog再提交事务,能在很大程度上缓解数据丢失风险,但对延迟改善有限
  • 分库分表:把大库拆小,减少单个实例的复制压力
  • 并行复制:在从库配置slave_parallel_workers=4,8.0版本自动基于事务粒度分发,效果比较明显
  • mysql主从复制配置步骤是什么,mysql主从复制原理详解?

  • 硬件升级:换SSD、加大内存,让从库刷盘更快,是成本低见效快的土办法

行业共识认为,并行复制和硬件升级能解决大部分延迟问题,剩下少数场景得靠架构调整解决。

主从复制日常巡检和故障恢复

复制不会一劳永逸,跑生产环境每天花五分钟看一眼状态是基本功。

日常要盯的几个指标

  • 主从延迟秒数
  • 从库的IO线程和SQL线程状态
  • 主库binlog磁盘占用
  • 从库的relay log积压情况

常见异常之一是Slave_SQL_Running变No,原因可能是主库执行了从库不支持的语句,或者表结构不一致,处理方法是先查Last_Error定位报错,能修复数据就手动修复后执行STOP SLAVE; START SLAVE;让复制继续。

另一个高发问题是主库binlog被清理而从库还没拉取,这时需要重新做一次备份恢复,代价比较大,建议给从库监控加一个文件位置有效性的报警,别等复制彻底断开才发现。

MySQL主从复制配置常见问题

主从复制一定要用固定IP吗

推荐使用固定IP或内网域名,因为CHANGE MASTER语句里写的是主机地址,换IP后需要重新执行一次,云环境下优先用内网地址,不要穿越公网复制,延迟大还不安全。

从库能不能停掉binlog

可以关,但强烈建议开着,从库的binlog可以用作下一级从库的数据源,也可以作为备份恢复的补充,代价仅是额外磁盘占用,相比恢复数据的痛苦来说不值一提。

GTID复制和传统位点复制怎么选

MySQL 5.6以后推荐GTID,原因是故障切换后从库能自动找回正确的binlog位置,不需要人工拼接坐标,8.0默认就是GTID模式,新环境直接用GTID,老环境升级时再做对比评估也来得及。

相关文章

2024年,SaaS软件行业碰到获客难、增长慢等问题吗?

我们努力让每一次邂逅总能超越期待