这篇整理 MySQL/MariaDB 主从复制的核心概念和基础配置。原文是早期收集的长资料,这里保留关键流程和命令,方便后续查阅。
复制概述
MySQL 复制通常由一台主库和一台或多台从库组成。主库将数据变更写入 binary log,从库通过 I/O 线程拉取 binlog 到 relay log,再由 SQL 线程重放 relay log,使从库数据追上主库。
复制类型
- Statement-Based Replication:基于 SQL 语句复制。
- Row-Based Replication:基于行变化复制。
- Mixed Replication:混合模式,按场景自动选择。
主库配置
主库需要开启 binlog,并设置唯一的 server-id。
[mysqld]
log-bin=mysql-bin
binlog_format=mixed
server-id=1从库配置
从库同样需要唯一的 server-id。如果该从库还要继续作为其它从库的上游,可以开启 binlog 和 log_slave_updates。
[mysqld]
server-id=10
relay-log=relay-bin
log-bin=mysql-bin
log_slave_updates=1
read_only=on创建复制账号
CREATE USER 'repl'@'%' IDENTIFIED BY 'strong_password';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;查看主库 binlog 位置
SHOW MASTER STATUS;需要记录返回结果里的 File 和 Position,从库初始化复制时会用到。
从库启动复制
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST = '172.16.31.20',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'strong_password',
MASTER_PORT = 3306,
MASTER_LOG_FILE = 'mysql-bin.000001',
MASTER_LOG_POS = 98;
START SLAVE;检查复制状态
SHOW SLAVE STATUS;重点关注以下字段:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Master_Log_File: mysql-bin.000001
Relay_Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 98
Exec_Master_Log_Pos: 98复制过滤
可以通过库级或表级过滤限制同步范围,但不建议同时混用白名单和黑名单。
STOP SLAVE;
SET GLOBAL replicate_do_db = 'testdb';
START SLAVE;
SHOW GLOBAL VARIABLES LIKE '%replicat%';注意事项
- 主从服务器版本最好一致;版本不一致时,从库版本应高于主库。
- 生产环境优先考虑 row 或 mixed binlog 格式。
- 从库建议设置
read_only=on,避免业务误写。 - 复制账号密码会记录在复制元数据里,要注意权限隔离。