MySQL主从复制搭建,一主多从配置
时间:2026-10-8 07:53 作者:emer 分类: 无
前言
一台数据库扛不住读写压力,怎么办?搭主从复制,主库写、从库读,分担压力。
一、主从复制原理
原理:
- 主库把写操作写进binlog
- 从库IO线程读主库binlog,写进中继日志(relay log)
- 从库SQL线程读中继日志,重放SQL
作用:
- 读写分离,分担主库压力
- 数据备份,主库挂了从库顶上
- 异地容灾
二、准备工作
环境:
| 角色 | IP | MySQL版本 |
|---|---|---|
| 主库 | 192.168.1.10 | 5.7 |
| 从库1 | 192.168.1.11 | 5.7 |
| 从库2 | 192.168.1.12 | 5.7 |
要求:
- MySQL版本一致
- 主库开启binlog
- 主从时间同步
三、配置主库
1. 改my.cnf
[mysqld]
# 服务ID(唯一)
server_id = 1
# 开启binlog
log_bin = mysql-bin
# binlog格式
binlog_format = ROW
# 只复制哪些库(可选)
# binlog_do_db = mydb
# 忽略哪些库(可选)
# binlog_ignore_db = mysql
2. 重启主库
systemctl restart mysqld
3. 创建复制用户
CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'repl123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';
FLUSH PRIVILEGES;
4. 查看主库状态
SHOW MASTER STATUS;
输出:
| File | Position |
|---|---|
| mysql-bin.000001 | 156 |
记住File和Position,后面从库要用。
5. 锁表导数据
FLUSH TABLES WITH READ LOCK;
开另一个终端导出数据:
mysqldump -u root -p --all-databases --master-data=2 > all.sql
解锁:
UNLOCK TABLES;
四、配置从库1
1. 改my.cnf
[mysqld]
# 服务ID(唯一,和主库不同)
server_id = 2
# 中继日志
relay_log = relay-bin
2. 重启从库
systemctl restart mysqld
3. 导入主库数据
mysql -u root -p < all.sql
4. 关联主库
CHANGE MASTER TO
MASTER_HOST='192.168.1.10',
MASTER_USER='repl',
MASTER_PASSWORD='repl123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=156;
5. 开启从库
START SLAVE;
6. 查看状态
SHOW SLAVE STATUS\G
看两个值:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
都是Yes就成功了。
五、配置从库2
和从库1一样,只是server_id改成3:
[mysqld]
server_id = 3
relay_log = relay-bin
然后重复上面的步骤3-6。
六、验证主从同步
主库插入数据
CREATE TABLE test (id INT);
INSERT INTO test VALUES (1);
从库查
SELECT * FROM test;
能查到就同步成功了。
七、常用操作
查看从库状态
SHOW SLAVE STATUS\G
停止从库
STOP SLAVE;
重置从库
RESET SLAVE;
查看主库有哪些从库
SHOW SLAVE HOSTS;
常见坑
坑1:server_id重复
主库和从库server_id一样,复制失败。
解决: 每个MySQL实例server_id必须唯一。
坑2:防火墙挡了3306
从库连不上主库。
解决: 主库开放3306端口。
坑3:复制用户权限不够
解决: 复制用户需要REPLICATION SLAVE权限。
坑4:数据不一致
主从数据对不上。
原因:
- 从库写了数据
- 主库跳过了错误
- 大事务导致延迟
解决: 从库只读:
[mysqld]
read_only = 1
坑5:从库延迟很大
主库写太快,从库追不上。
解决:
- 用半同步复制
- 从库硬件升级
- 拆分更多从库
总结
搭建步骤:
- 主库开启binlog,设server_id=1
- 主库创建复制用户
- 主库锁表导出数据
- 从库改server_id,导入数据
- 从库关联主库,START SLAVE
- 验证两个Yes
记住: 一主多从配置简单,关键是server_id唯一、binlog格式一致。
遇到问题加QQ23979811 协助处理