MySQL主从复制是通过主库将数据的变更操作记录到二进制日志中,从库读取主库的二进制日志并重放这些操作,从而实现主从库数据一致性的机制,是MySQL集群实现读写分离、数据备份的基础。主从复制的核心依赖二进制日志(binlog)的传输和重放,主库负责生成binlog,从库通过IO线程拉取binlog并写入本地的中继日志,再由SQL线程重放中继日志中的操作完成数据同步。

环境准备
搭建主从复制前需要准备两台或以上安装好MySQL的服务器,本文以两台服务器为例,主库IP为192.168.0.10,从库IP为192.168.0.11,两台服务器的MySQL版本保持一致,避免版本差异导致兼容性问题。同时需要确保两台服务器之间的网络互通,防火墙开放MySQL默认端口3306的访问权限。
主库配置步骤
1. 修改主库配置文件
打开主库的MySQL配置文件my.cnf或者my.ini,添加以下配置项:
[mysqld] # 设置服务器唯一ID,主从库ID不能重复 server-id=1 # 开启二进制日志,指定日志文件前缀 log-bin=mysql-bin # 可选配置:指定需要同步的数据库,不配置则同步所有数据库 binlog-do-db=test_db # 可选配置:忽略同步的数据库 binlog-ignore-db=mysql
修改完成后重启MySQL服务使配置生效。
2. 创建主从复制专用账号
登录主库MySQL,创建一个用于从库连接的账号,并授予复制权限:
-- 创建用户,允许从库IP连接 CREATE USER 'repl_user'@'192.168.0.11' IDENTIFIED BY 'repl_password'; -- 授予复制权限 GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.0.11'; -- 刷新权限 FLUSH PRIVILEGES;
3. 查看主库状态
执行以下命令查看主库的二进制日志信息,记录下File和Position的值,后续从库配置需要用到:
SHOW MASTER STATUS;
正常输出会包含类似如下内容:
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
|---|---|---|---|
| mysql-bin.000001 | 154 | test_db | mysql |
从库配置步骤
1. 修改从库配置文件
打开从库的MySQL配置文件,添加以下配置:
[mysqld] # 设置从库唯一ID,与主库不重复 server-id=2 # 可选配置:开启中继日志 relay-log=mysql-relay
修改完成后重启从库MySQL服务。
2. 配置从库连接主库
登录从库MySQL,执行以下命令配置主库连接信息,将对应的参数替换为实际的主库信息:
CHANGE MASTER TO MASTER_HOST='192.168.0.10', MASTER_USER='repl_user', MASTER_PASSWORD='repl_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
其中MASTER_LOG_FILE和MASTER_LOG_POS就是之前在主库执行SHOW MASTER STATUS得到的两个值。
3. 启动从库复制进程
执行以下命令启动从库的IO线程和SQL线程:
START SLAVE;
4. 验证从库状态
执行以下命令查看从库复制状态:
SHOW SLAVE STATUSG
如果Slave_IO_Running和Slave_SQL_Running两个字段的值都为Yes,说明主从复制已经正常运行。如果出现No的情况,可以查看Last_IO_Error或者Last_SQL_Error字段的提示信息排查问题。
主从复制验证
在主库的test_db数据库中创建一张测试表并插入数据:
USE test_db;
CREATE TABLE test_table (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
);
INSERT INTO test_table (name) VALUES ('test_data');
然后登录从库查询test_db数据库中的test_table表,如果能看到刚才插入的数据,说明主从复制已经生效。
常见问题说明
- 主从库server-id必须唯一,否则会导致复制异常
- 主库重启后二进制日志文件可能会变更,从库需要重新配置对应的File和Position值
- 如果从库出现SQL线程异常,大概率是主从库数据不一致导致,需要先修复数据再重启复制进程
- 主从复制存在轻微延迟,对实时性要求极高的场景需要额外评估延迟影响