MySQL主从复制搭建,一主多从配置

前言

一台数据库扛不住读写压力,怎么办?搭主从复制,主库写、从库读,分担压力。

一、主从复制原理

原理:

  1. 主库把写操作写进binlog
  2. 从库IO线程读主库binlog,写进中继日志(relay log)
  3. 从库SQL线程读中继日志,重放SQL

作用:

  1. 读写分离,分担主库压力
  2. 数据备份,主库挂了从库顶上
  3. 异地容灾

二、准备工作

环境:

角色 IP MySQL版本
主库 192.168.1.10 5.7
从库1 192.168.1.11 5.7
从库2 192.168.1.12 5.7

要求:

  1. MySQL版本一致
  2. 主库开启binlog
  3. 主从时间同步

三、配置主库

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:数据不一致

主从数据对不上。

原因:

  1. 从库写了数据
  2. 主库跳过了错误
  3. 大事务导致延迟

解决: 从库只读:

[mysqld]
read_only = 1

坑5:从库延迟很大

主库写太快,从库追不上。

解决:

  1. 用半同步复制
  2. 从库硬件升级
  3. 拆分更多从库

总结

搭建步骤:

  1. 主库开启binlog,设server_id=1
  2. 主库创建复制用户
  3. 主库锁表导出数据
  4. 从库改server_id,导入数据
  5. 从库关联主库,START SLAVE
  6. 验证两个Yes

记住: 一主多从配置简单,关键是server_id唯一、binlog格式一致。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 07:53