mysql主从配置,实现数据自动同步

首页 2025-09-20 10:18:22


MySQL 主从配置(Master-Slave Replication)是实现数据同步、读写分离、提高系统可用性的常用方案。其核心原理是:主库(Master)记录数据变更到二进制日志(binlog),从库(Slave)通过 IO 线程读取主库的 binlog 并写入中继日志(relay log),再通过 SQL 线程执行中继日志中的操作,实现数据同步。

一、准备工作

  1. 环境要求
    • 2 台服务器(或同一服务器的 2 个 MySQL 实例),安装相同版本的 MySQL(版本差异可能导致兼容问题)。
    • 主从服务器网络互通(关闭防火墙或开放 3306 端口)。
    • 主库已存在数据时,建议先通过mysqldump备份并导入从库,确保初始数据一致。
  2. 示例环境
    • 主库(Master):IP=192.168.1.100,端口 = 3306
    • 从库(Slave):IP=192.168.1.101,端口 = 3306

二、主库(Master)配置

1. 修改 MySQL 配置文件

主库需要开启 binlog 日志,并配置唯一的server-id
编辑主库的配置文件(Linux 通常为/etc/my.cnf/etc/mysql/my.cnf,Windows 为my.ini):
ini
[mysqld]
# 开启binlog(日志文件前缀,如mysql-bin.000001)
log_bin = /var/lib/mysql/mysql-bin
# 主库唯一ID(1-4294967295,不可与从库重复)
server-id = 1
# 可选:只记录指定数据库的binlog(多个库用多行)
binlog_do_db = test_db
# 可选:忽略指定数据库的binlog
binlog_ignore_db = mysql
# binlog格式(建议用ROW,记录行级变更,更安全)
binlog_format = ROW
 

2. 重启主库并验证配置

重启 MySQL 使配置生效:
bash
# Linux重启命令(根据安装方式可能不同)
systemctl restart mysqld
# 或
service mysql restart
 
登录主库 MySQL,验证 binlog 是否开启:
sql
-- 查看主库状态(若有File和Position字段,说明binlog已开启)
show master status;
 

3. 创建主从同步专用用户

从库需要通过该用户连接主库读取 binlog,需授予replication slave权限:
sql
-- 登录主库MySQL
mysql -u root -p

-- 创建用户(用户名:repl,密码:123456,允许从库192.168.1.101连接)
CREATE USER 'repl'@'192.168.1.101' IDENTIFIED BY '123456';

-- 授予同步权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.101';

-- 刷新权限
FLUSH PRIVILEGES;
 

4. 记录主库 binlog 信息

再次执行show master status;,记录File(如mysql-bin.000001)和Position(如 154),从库配置时需要用到:
plaintext
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 | test_db      | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+
 

三、从库(Slave)配置

1. 修改 MySQL 配置文件

从库需配置唯一的server-id(不可与主库重复),无需开启 binlog(除非作为其他从库的主库)。
编辑从库的配置文件:
ini
[mysqld]
# 从库唯一ID(需与主库不同)
server-id = 2
# 可选:只同步指定数据库
replicate_do_db = test_db
# 可选:忽略指定数据库
replicate_ignore_db = mysql
 

2. 重启从库

bash
systemctl restart mysqld
# 或
service mysql restart
 

3. 配置从库连接主库

登录从库 MySQL,执行change master to命令,指定主库信息:
sql
-- 登录从库MySQL
mysql -u root -p

-- 停止从库同步进程(若已配置过)
stop slave;

-- 配置主库信息(替换为实际值)
CHANGE MASTER TO
  MASTER_HOST = '192.168.1.100',  -- 主库IP
  MASTER_PORT = 3306,             -- 主库端口
  MASTER_USER = 'repl',           -- 同步用户
  MASTER_PASSWORD = '123456',     -- 同步密码
  MASTER_LOG_FILE = 'mysql-bin.000001',  -- 主库binlog文件名(步骤二.4记录)
  MASTER_LOG_POS = 154;            -- 主库binlog位置(步骤二.4记录)

-- 启动从库同步进程
start slave;
 

四、验证主从同步

1. 查看从库同步状态

在从库执行以下命令,检查关键状态:
sql
show slave status\G;
 
重点关注以下 2 个字段,均为Yes说明同步正常:
plaintext
Slave_IO_Running: Yes    -- IO线程正常(负责读取主库binlog)
Slave_SQL_Running: Yes   -- SQL线程正常(负责执行中继日志)
 

2. 测试数据同步

在主库的test_db中创建表并插入数据:
sql
-- 主库操作
use test_db;
create table user(id int, name varchar(20));
insert into user values(1, 'test');
 
在从库中查询,若能看到新增的数据,说明同步成功:
sql
-- 从库操作
use test_db;
select * from user;
-- 输出:1 | test
 

五、常见问题排查

  1. Slave_IO_Running: Connecting
    • 可能原因:主库 IP / 端口错误、网络不通、同步用户密码错误、主库 binlog 文件 / 位置错误。
    • 排查:检查从库show slave status\G中的Last_IO_Error字段,根据错误信息修复。
  2. Slave_SQL_Running: No
    • 可能原因:从库执行中继日志时出错(如主从表结构不一致、数据冲突)。
    • 排查:查看Last_SQL_Error字段,修复错误后执行start slave;重启同步。
  3. 主从数据不一致
    • 解决:重新用mysqldump备份主库数据导入从库,重置从库同步位置。
通过以上步骤,即可完成 MySQL 主从配置,实现数据自动同步。实际生产环境中,还可根据需求配置多从库、级联复制等架构。
MySQL连接就这么简单!本地远程、编程语言连接方法一网打尽
还在为MySQL日期计算头疼?这份加一天操作指南能解决90%问题
MySQL日志到底在哪里?Linux/Windows/macOS全平台查找方法在此
MySQL数据库管理工具全景评测:从Workbench到DBeaver的技术选型指南
MySQL密码忘了怎么办?这份重置指南能救急,Windows/Linux/Mac都适用
你的MySQL为什么经常卡死?可能是锁表在作怪!快速排查方法在此
MySQL单表卡爆怎么办?从策略到实战,一文掌握「分表」救命技巧
清空MySQL数据表千万别用错!DELETE和TRUNCATE这个区别可能导致重大事故
你的MySQL中文排序一团糟?记住这几点,轻松实现准确拼音排序!
别再混淆Hive和MySQL了!读懂它们的天壤之别,才算摸到大数据的门道