MySQL 主从配置(Master-Slave Replication)是实现数据同步、读写分离、提高系统可用性的常用方案。其核心原理是:主库(Master)记录数据变更到二进制日志(binlog),从库(Slave)通过 IO 线程读取主库的 binlog 并写入中继日志(relay log),再通过 SQL 线程执行中继日志中的操作,实现数据同步。
-
环境要求:
-
2 台服务器(或同一服务器的 2 个 MySQL 实例),安装相同版本的 MySQL(版本差异可能导致兼容问题)。
-
主从服务器网络互通(关闭防火墙或开放 3306 端口)。
-
主库已存在数据时,建议先通过
mysqldump备份并导入从库,确保初始数据一致。
-
示例环境:
-
主库(Master):IP=192.168.1.100,端口 = 3306
-
从库(Slave):IP=192.168.1.101,端口 = 3306
主库需要开启 binlog 日志,并配置唯一的server-id。
编辑主库的配置文件(Linux 通常为/etc/my.cnf或/etc/mysql/my.cnf,Windows 为my.ini):
[mysqld]
log_bin = /var/lib/mysql/mysql-bin
server-id = 1
binlog_do_db = test_db
binlog_ignore_db = mysql
binlog_format = ROW
重启 MySQL 使配置生效:
systemctl restart mysqld
service mysql restart
登录主库 MySQL,验证 binlog 是否开启:
从库需要通过该用户连接主库读取 binlog,需授予replication slave权限:
mysql -u root -p
CREATE USER 'repl'@'192.168.1.101' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.101';
FLUSH PRIVILEGES;
再次执行show master status;,记录File(如mysql-bin.000001)和Position(如 154),从库配置时需要用到:
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | test_db | mysql | |
+------------------+----------+--------------+------------------+-------------------+
从库需配置唯一的server-id(不可与主库重复),无需开启 binlog(除非作为其他从库的主库)。
编辑从库的配置文件:
[mysqld]
server-id = 2
replicate_do_db = test_db
replicate_ignore_db = mysql
systemctl restart mysqld
service mysql restart
登录从库 MySQL,执行change master to命令,指定主库信息:
mysql -u root -p
stop slave;
CHANGE MASTER TO
MASTER_HOST = '192.168.1.100',
MASTER_PORT = 3306,
MASTER_USER = 'repl',
MASTER_PASSWORD = '123456',
MASTER_LOG_FILE = 'mysql-bin.000001',
MASTER_LOG_POS = 154;
start slave;
在从库执行以下命令,检查关键状态:
重点关注以下 2 个字段,均为Yes说明同步正常:
Slave_IO_Running: Yes -- IO线程正常(负责读取主库binlog)
Slave_SQL_Running: Yes -- SQL线程正常(负责执行中继日志)
在主库的test_db中创建表并插入数据:
use test_db;
create table user(id int, name varchar(20));
insert into user values(1, 'test');
在从库中查询,若能看到新增的数据,说明同步成功:
use test_db;
select * from user;
-
Slave_IO_Running: Connecting
-
可能原因:主库 IP / 端口错误、网络不通、同步用户密码错误、主库 binlog 文件 / 位置错误。
-
排查:检查从库
show slave status\G中的Last_IO_Error字段,根据错误信息修复。
-
Slave_SQL_Running: No
-
可能原因:从库执行中继日志时出错(如主从表结构不一致、数据冲突)。
-
排查:查看
Last_SQL_Error字段,修复错误后执行start slave;重启同步。
-
主从数据不一致
-
解决:重新用
mysqldump备份主库数据导入从库,重置从库同步位置。
通过以上步骤,即可完成 MySQL 主从配置,实现数据自动同步。实际生产环境中,还可根据需求配置多从库、级联复制等架构。