MySQL主从复制保姆级指南(命令详解+实操示例)
以下内容覆盖主从复制原理、核心命令、排错技巧及实操案例,适合零基础快速掌握
一、主从复制核心原理
-
核心流程
-
主库(Master):记录所有数据变更到二进制日志(binlog),包含增删改操作
从库(Slave):
- I/O线程:拉取主库的binlog并写入中继日志(relay log)
- SQL线程:解析relay log并执行SQL,保持主从数据一致
-
异步复制:主库提交事务后即响应客户端,不等待从库同步(默认模式)
-
-
三种模式对比
模式 数据一致性 性能 适用场景 异步 弱 高 高并发写场景(默认) 半同步 中 中 强一致性要求较高 全同步 强 低 金融级数据一致性
二、主从配置全流程
1. 主库配置
步骤1:修改配置文件(my.cnf)
[mysqld]
server-id = 1 # 唯一标识(主从不同)
log-bin = /data/mysql-bin # 启用binlog
binlog-format = ROW # 推荐ROW模式保证一致性
binlog-do-db = mydb # 同步指定库(可选)
重启MySQL生效:
systemctl restart mysqld # CentOS/RHEL
步骤2:创建复制用户
-- 创建用户并授权
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
步骤3:查看主库状态
SHOW MASTER STATUS;
输出示例:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 154 | mydb | |
+------------------+----------+--------------+------------------+
记录关键字段:File
(日志文件名)和 Position
(日志位置)
2. 从库配置
步骤1:修改配置文件(my.cnf)
[mysqld]
server-id = 2 # 唯一标识(与主库不同)
relay-log = /data/relay-bin # 中继日志路径
read-only = 1 # 从库只读(非强制)
重启MySQL生效:
systemctl restart mysqld
步骤2:配置主库连接
-- MySQL 8.0+版本语法
CHANGE REPLICATION SOURCE TO
SOURCE_HOST = '192.168.1.100',
SOURCE_USER = 'repl',
SOURCE_PASSWORD = 'password',
SOURCE_LOG_FILE = 'mysql-bin.000003',
SOURCE_LOG_POS = 154;
-- 旧版本语法(兼容)
CHANGE MASTER TO
MASTER_HOST = '192.168.1.100',
MASTER_USER = 'repl',
MASTER_PASSWORD = 'password',
MASTER_LOG_FILE = 'mysql-bin.000003',
MASTER_LOG_POS = 154;
步骤3:启动复制
SQLSTART REPLICA; -- 8.0+版本
START SLAVE; -- 旧版本
步骤4:检查同步状态
SQLSHOW REPLICA STATUS\G; -- 8.0+版本
SHOW SLAVE STATUS\G; -- 旧版本
关键字段验证:
-
Slave_IO_Running: Yes
-
Slave_SQL_Running: Yes
-
Seconds_Behind_Master: 0(无延迟)
三、数据初始化与同步
场景1:主库已有数据
# 主库全量备份(含binlog位置)
mysqldump -uroot -p --master-data=2 --single-transaction mydb > mydb.sql
# 从库导入数据
mysql -uroot -p mydb < mydb.sql
参数说明:
-
--master-data=2:备份时记录主库的binlog位置
四、维护与排错命令
1. 常用维护命令
命令 | 作用 | 示例 |
---|---|---|
STOP REPLICA; | 停止复制线程 | STOP SLAVE; (旧版本) |
RESET REPLICA ALL; | 清除主从配置信息 | RESET SLAVE ALL; |
SET GLOBAL sql_slave_skip_counter=1; | 跳过错误事务 | 主键冲突时使用 |
2. 常见错误处理
-
错误1:主键冲突(1062)
SQL-- 跳过当前错误事务 STOP SLAVE; SET GLOBAL sql_slave_skip_counter=1; START SLAVE;
-
错误2:数据丢失(1032)
- 主库删除数据,从库找不到记录:需手动修复数据或重新同步
-
错误3:中继日志损坏
-- 清除中继日志并重新同步 STOP SLAVE; RESET SLAVE; CHANGE MASTER TO ...; -- 重新配置主库信息 START SLAVE; ```[69](@ref)
五、高级技巧与扩展
1. 基于GTID的复制(推荐)
-- 主从库配置中启用GTID
gtid_mode=ON
enforce_gtid_consistency=ON
-- 从库配置
CHANGE MASTER TO MASTER_AUTO_POSITION=1;
优势:自动追踪事务位置,无需手动指定MASTER_LOG_FILE
和MASTER_LOG_POS
2. 并行复制(减少延迟)
SQL-- 从库启用多线程复制
SET GLOBAL slave_parallel_workers=4; -- 并行线程数
适用场景:高并发写入导致主从延迟
六、主从切换实战
主库故障时升级从库为主库:
- 停止从库复制:
STOP SLAVE;
- 重置主从信息:
RESET SLAVE ALL;
- 关闭只读模式:
SET GLOBAL read_only=0;
- 原主库恢复后,反向配置为从库
七、测试验证
操作示例:
-
主库插入数据:
INSERT INTO users (name) VALUES ('Alice');
-
从库查询验证:
SELECT * FROM users WHERE name='Alice';
模式:SET GLOBAL read_only=0;
4. 原主库恢复后,反向配置为从库
七、测试验证
操作示例:
-
主库插入数据:
INSERT INTO users (name) VALUES ('Alice');
-
从库查询验证:
SELECT * FROM users WHERE name='Alice';
预期结果:主从数据完全一致