# MySQL 主从复制原理与配置笔记

- 原文地址：https://www.kuddy.cn/archives/61
- 发布时间：2016-07-28 21:06:20
- 更新时间：2026-05-18 02:42:12
- 分类：数据库
- 标签：MySQL, PHP

> 整理 MySQL/MariaDB 主从复制的核心概念，包括复制类型、binary log、relay log、主从节点配置、复制过滤和常见验证方式。

---

这篇整理 MySQL/MariaDB 主从复制的核心概念和基础配置。原文是早期收集的长资料，这里保留关键流程和命令，方便后续查阅。

## 复制概述

MySQL 复制通常由一台主库和一台或多台从库组成。主库将数据变更写入 binary log，从库通过 I/O 线程拉取 binlog 到 relay log，再由 SQL 线程重放 relay log，使从库数据追上主库。

## 复制类型

1. Statement-Based Replication：基于 SQL 语句复制。

2. Row-Based Replication：基于行变化复制。

3. Mixed Replication：混合模式，按场景自动选择。

## 主库配置

主库需要开启 binlog，并设置唯一的 server-id。

```
[mysqld]
log-bin=mysql-bin
binlog_format=mixed
server-id=1
```

## 从库配置

从库同样需要唯一的 server-id。如果该从库还要继续作为其它从库的上游，可以开启 binlog 和 log_slave_updates。

```
[mysqld]
server-id=10
relay-log=relay-bin
log-bin=mysql-bin
log_slave_updates=1
read_only=on
```

## 创建复制账号

```
CREATE USER 'repl'@'%' IDENTIFIED BY 'strong_password';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
```

## 查看主库 binlog 位置

```
SHOW MASTER STATUS;
```

需要记录返回结果里的 File 和 Position，从库初始化复制时会用到。

## 从库启动复制

```
STOP SLAVE;
CHANGE MASTER TO
    MASTER_HOST = '172.16.31.20',
    MASTER_USER = 'repl',
    MASTER_PASSWORD = 'strong_password',
    MASTER_PORT = 3306,
    MASTER_LOG_FILE = 'mysql-bin.000001',
    MASTER_LOG_POS = 98;
START SLAVE;
```

## 检查复制状态

```
SHOW SLAVE STATUS;
```

重点关注以下字段：

```
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Master_Log_File: mysql-bin.000001
Relay_Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 98
Exec_Master_Log_Pos: 98
```

## 复制过滤

可以通过库级或表级过滤限制同步范围，但不建议同时混用白名单和黑名单。

```
STOP SLAVE;
SET GLOBAL replicate_do_db = 'testdb';
START SLAVE;

SHOW GLOBAL VARIABLES LIKE '%replicat%';
```

## 注意事项

4. 主从服务器版本最好一致；版本不一致时，从库版本应高于主库。

5. 生产环境优先考虑 row 或 mixed binlog 格式。

6. 从库建议设置 read_only=on，避免业务误写。

7. 复制账号密码会记录在复制元数据里，要注意权限隔离。