Jw
首页
技术
英语
首页
技术
英语
  • MySQL

    • MySQL 基础
    • 环境变量配置(PATH)
    • SQL 语法与分类
    • MySQL 数据类型
    • SQL - DDL 数据定义语言
    • SQL - DML 数据操作语言
    • SQL - DQL 数据查询语言
    • SQL - DCL 数据控制语言
    • MySQL 函数
    • SQL 约束
    • SQL 外键约束
    • 多表关系
    • 多表查询(连接查询)
    • 隐式内连接 vs 显式内连接
    • 子查询
    • 多表查询案例
    • 事务
    • 并发事务问题与隔离级别
    • MySQL 体系结构与存储引擎
    • 索引概述
    • 索引结构
    • 索引分类
    • 索引语法
    • SQL 性能分析
    • 索引使用
    • 索引设计原则
    • SQL 优化 - 插入数据与主键优化
    • SQL 优化 - order by 与 group by
    • SQL 优化 - limit / count / update
    • 视图
    • 存储过程
    • 存储过程 - 变量
    • 存储过程 - 流程控制、游标与条件处理
    • 存储函数
    • 触发器
    • 锁概述与全局锁
    • 表级锁
    • 行级锁
    • InnoDB 逻辑存储结构
    • InnoDB 架构
    • 事务原理(redo / undo log)
    • MVCC
    • MySQL 系统数据库
    • MySQL 常用工具
    • 数据备份与导入导出
    • 错误日志与二进制日志
    • 查询日志与慢查询日志
    • 主从复制 - 概述与原理
    • 主从复制 - 搭建
    • Mycat 配置
    • Mycat 垂直拆分与水平拆分
    • Mycat 分片规则
    • Mycat 管理与监控
    • Mycat 读写分离 - 一主一从
    • Mycat 读写分离 - 双主双从

主从复制 - 搭建

搭建顺序:准备服务器 → 配置主库 → 配置从库 → 开启同步 → 验证状态 → 测试同步。主库负责写,从库 read-only=1 只负责读。

一、服务器准备

准备两台服务器,分别安装 MySQL 并完成基础初始化:

角色地址(示例)
Master1.2.3.4
Slave1.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_FILEbinlog 日志文件名MASTER_LOG_FILE
SOURCE_LOG_POSbinlog 日志文件位置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_RunningYes
Replica_SQL_RunningYes
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
最近更新: 2026/10/25 21:59
Contributors: liujw
Prev
主从复制 - 概述与原理
Next
Mycat 配置