主从复制 - 搭建
搭建顺序:准备服务器 → 配置主库 → 配置从库 → 开启同步 → 验证状态 → 测试同步。主库负责写,从库
read-only=1只负责读。
一、服务器准备
准备两台服务器,分别安装 MySQL 并完成基础初始化:
| 角色 | 地址(示例) |
|---|---|
| Master | 1.2.3.4 |
| Slave | 1.2.3.5 |
需要保证主从之间 3306 端口互通,二选一:
# 方式一:开放指定 3306 端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
# 方式二:关闭服务器防火墙(测试环境)
systemctl stop firewalld
systemctl disable firewalld
二、主库配置
1. 修改 /etc/my.cnf
# mysql 服务 ID,保证整个集群环境中唯一,取值范围 1 ~ 2^32-1,默认为 1
server-id=1
# 是否只读,1 代表只读,0 代表读写
read-only=0
# 忽略的数据,指不需要同步的数据库
#binlog-ignore-db=mysql
# 指定同步的数据库
#binlog-do-db=db01
binlog-ignore-db与binlog-do-db二选一:前者排除指定库,后者只同步指定库。
2. 重启 MySQL
systemctl restart mysqld
3. 创建复制账号并授权
-- 创建 itcast 用户,可在任意主机连接(密码用占位符替换)
CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
-- 授予主从复制权限
GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';
4. 查看二进制日志坐标
SHOW MASTER STATUS;
| 字段 | 含义 |
|---|---|
File | 从哪个日志文件开始推送日志文件(如 binlog.000002) |
Position | 从哪个位置开始推送日志 |
Binlog_Do_DB / Binlog_Ignore_DB | 指定同步 / 不需要同步的数据库 |
记下这两个值,配置从库时要用;搭建期间主库不要有新的写入,否则坐标会变化。
三、从库配置
1. 修改 /etc/my.cnf
# mysql 服务 ID,保证整个集群环境中唯一,和主库不一样即可
server-id=2
# 是否只读,1 代表只读,0 代表读写
read-only=1
2. 重启 MySQL
systemctl restart mysqld
3. 设置主库配置
MySQL 8.0.23 及之后:
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='1.2.3.4',
SOURCE_USER='itcast',
SOURCE_PASSWORD='你的密码',
SOURCE_LOG_FILE='binlog.000002',
SOURCE_LOG_POS=1383;
MySQL 8.0.23 之前:
CHANGE MASTER TO
MASTER_HOST='1.2.3.4',
MASTER_USER='itcast',
MASTER_PASSWORD='你的密码',
MASTER_LOG_FILE='binlog.000002',
MASTER_LOG_POS=1383;
| 8.0.23+ 参数 | 含义 | 8.0.23 之前 |
|---|---|---|
SOURCE_HOST | 主库 IP 地址 | MASTER_HOST |
SOURCE_USER | 连接主库的用户名 | MASTER_USER |
SOURCE_PASSWORD | 连接主库的密码 | MASTER_PASSWORD |
SOURCE_LOG_FILE | binlog 日志文件名 | MASTER_LOG_FILE |
SOURCE_LOG_POS | binlog 日志文件位置 | MASTER_LOG_POS |
4. 开启同步
START REPLICA; -- 8.0.22 之后
-- START SLAVE; -- 8.0.22 之前
5. 查看主从同步状态
SHOW REPLICA STATUS\G
-- SHOW SLAVE STATUS\G -- 8.0.22 之前
关键字段:
| 字段 | 预期 |
|---|---|
Replica_IO_Running | Yes |
Replica_SQL_Running | Yes |
Source_Host / Source_User | 与主库配置一致 |
Source_Log_File / Read_Source_Log_Pos | 对应主库的 binlog 文件与位置 |
Relay_Log_File | 从库的中继日志文件 |
两个
Running都是Yes才算复制正常;若Replica_IO_Running为Connecting,先检查网络、端口、账号密码和主库 binlog 坐标。
四、测试
1. 主库建库建表并插入数据
CREATE DATABASE db01;
USE db01;
CREATE TABLE tb_user(
id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
sex VARCHAR(1)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO tb_user(id, name, sex) VALUES
(NULL, 'Tom', '1'),
(NULL, 'Trigger', '0'),
(NULL, 'Dawn', '1');
2. 从库查询验证
USE db01;
SELECT * FROM tb_user; -- 能查到主库插入的 3 条数据即同步成功
从库
read-only=1只限制普通用户写入,拥有SUPER权限的账号仍可写;复制线程不受影响。
速查
# 主库 /etc/my.cnf
server-id=1
read-only=0
#binlog-ignore-db=mysql
#binlog-do-db=db01
# 从库 /etc/my.cnf
server-id=2
read-only=1
# 主从都要重启
systemctl restart mysqld
# 开放 3306(或测试环境直接关防火墙)
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
-- 主库:创建复制账号并授权
CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';
-- 主库:记下 File 与 Position
SHOW MASTER STATUS;
-- 从库:指向主库(8.0.23+)
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='1.2.3.4',
SOURCE_USER='itcast',
SOURCE_PASSWORD='你的密码',
SOURCE_LOG_FILE='binlog.000002',
SOURCE_LOG_POS=1383;
-- 从库:开启并查看状态
START REPLICA;
SHOW REPLICA STATUS\G
| 步骤 | 关键点 |
|---|---|
| 准备服务器 | 两台机 3306 互通 |
| 主库配置 | server-id 唯一、开 binlog、建复制账号 |
| 从库配置 | server-id 与主库不同、read-only=1 |
| 开启复制 | 8.0.23+ 用 SOURCE_*,之前用 MASTER_* |
| 验证 | IO / SQL 两个线程都是 Yes |
相关
- 主从复制 - 概述与原理:复制三步与 IO / SQL 线程
- 错误日志与二进制日志:binlog 坐标与清理
- 数据备份与导入导出:从库备份
- SQL DCL 数据控制语言:
CREATE USER与GRANT