首页/数据/数据库速查/主库复制配置(server_id / log_bin)
主从复制与高可用53 条

主库复制配置(server_id / log_bin)

主库三件套:全局唯一 server_id、开启 log_bin、binlog_format=ROW;GTID 环境再加 gtid_mode=ON 与 enforce_gtid_consistency=ON。

数据库速查数据更新于 2026-10-13

主库复制配置是什么

要让一个实例能当复制源,最少需要三件套:全拓扑唯一且固定的 server_id、开启二进制日志(log_bin)、binlog_format 设为 ROW。GTID 环境再叠加 gtid_mode=ON 与 enforce_gtid_consistency=ON。除此之外还要准备复制账号并授权,以及把 binlog 保留时间设得足够长,否则从库稍晚一点就会遇到日志被清理的报错。

基本信息

server_id取值 1 到 2^32-1,全拓扑必须唯一
log_bin必须开启,路径可自定义便于分离磁盘
binlog_formatROW,MySQL 8.0 默认
binlog_row_imageFULL,保证行镜像完整可读
复制账号需 REPLICATION SLAVE 权限,来源主机要提前放行

典型使用场景

  • 新建从库:确认主库三件套与账号都已就绪
  • 搭建只读实例:用同一套参数,从库额外开启 read_only
  • 复制账号审计:核对账号来源主机与权限是否最小化
  • 核对日志保留:确认从库断连期间不会因为日志过期而必须重建
  • 数据恢复:ROW 格式的 binlog 可读出变更行,用于误删回滚
  • GTID 准备:切换前先让所有节点接受 GTID 事务类型

主库 my.cnf 与账号

主库 my.cnf 与账号
[mysqld]
server_id = 1001
log_bin = /var/lib/mysql/binlog/mysql-bin
binlog_format = ROW
binlog_row_image = FULL
sync_binlog = 1
binlog_expire_logs_seconds = 604800
# GTID 可选
gtid_mode = ON
enforce_gtid_consistency = ON

# 复制账号(主库执行)
# CREATE USER 'repl'@'10.0.0.%' IDENTIFIED BY '强口令';
# GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.0.%';
# SHOW MASTER STATUS;   -- 非 GTID 环境记录位点,GTID 环境看 Executed_Gtid_Set

参数读法

参数含义典型问题
server_id实例的唯一标识与其他实例重复会导致复制中断
log_bin是否开启二进制日志未开启则无法作为复制源
binlog_format记录方式,ROW 为行级STATEMENT 格式下部分函数不可复制
binlog_expire_logs_seconds日志保留秒数过短会让断连的从库无法续传
gtid_modeGTID 开关,需渐进切换直接 ON 会导致实例启动失败
对已有业务的实例开启 GTID 需按 OFF 到 ON_PERMISSIVE 再到 ON 的渐进流程,不能一步到位。
server_id 重复是很隐蔽的故障:两台实例同号时从库可能连到错误来源或直接中断,变更前用 SHOW VARIABLES LIKE 'server_id' 核对全拓扑。
从库侧建议同时开启 read_only 与 super_read_only 防止误写;这两个开关在提升为主库时必须显式关闭,否则应用写入会被拒绝。主从参数也应纳入配置基线,定期比对。

易错点

  • 两套环境都沿用默认或相同 server_id,复制建立后莫名中断
  • binlog 未开启或磁盘写满导致日志停写,从库立刻报错
  • binlog_format 用 STATEMENT,函数与临时表相关语句在从库结果不一致
  • 日志保留时间太短,从库断连几小时就必须重建
  • 复制账号用通配主机加高权限,一旦泄露即可读写全部数据

数据来源与参考

  • MySQL 8.0 Reference Manual: Replication Configuration

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌