MySQL 日志数据同步的详细教程

发布于:2025-06-07 ⋅ 阅读:(17) ⋅ 点赞:(0)

以下是 MySQL 日志数据同步的详细教程,主要介绍基于二进制日志(binlog)的主从复制和基于 GTID 的高级同步方案:
一、MySQL 二进制日志(binlog)同步基础
1. 二进制日志原理
binlog 是 MySQL 的事务性日志,记录所有导致数据变更的 SQL 语句(如 INSERT、UPDATE、DELETE)。
主从复制 通过 binlog 实现:主库记录 binlog → 从库复制 binlog → 从库重放 SQL 语句。
2. 配置主库(Master)
修改my.cnf配置文件:
[mysqld]
server-id = 1                 # 唯一ID,范围1-2^32-1
log-bin = /var/log/mysql/binlog   # 启用binlog并指定路径
binlog-do-db = mydatabase     # 指定需要同步的数据库(可选)
expire-logs-days = 7          # binlog过期时间
max-binlog-size = 100M        # 单个binlog文件最大大小
重启 MySQL 后,创建用于复制的用户:
sql
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
获取主库当前 binlog 位置:
sql
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| binlog.000001    | 1234     | mydatabase   |                  |
+------------------+----------+--------------+------------------+
3. 配置从库(Slave)
修改my.cnf配置文件:
[mysqld]
server-id = 2                 # 唯一ID,不能与主库重复
relay-log = /var/log/mysql/relay-bin  # 中继日志路径
log-bin = /var/log/mysql/binlog       # 从库也可作为其他从库的主库
read-only = 1               # 从库设置为只读(可选)
重启 MySQL 后,配置主库连接信息:
CHANGE MASTER TO
  MASTER_HOST='master_ip',
  MASTER_USER='repl_user',
  MASTER_PASSWORD='password',
  MASTER_LOG_FILE='binlog.000001',  # 主库SHOW MASTER STATUS的File值
  MASTER_LOG_POS=1234;              # 主库SHOW MASTER STATUS的Position值

START SLAVE;
SHOW SLAVE STATUS\G;  # 检查同步状态
确保以下两个状态均为Yes:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
二、基于 GTID 的高级同步
1. GTID(全局事务标识符)原理
GTID 是全局唯一的事务 ID(格式如UUID:Transaction_ID),每个事务在主库生成后即固定。
优势:自动定位 binlog 位置,简化拓扑结构变更,支持多主复制。
2. 配置主库(GTID 模式)
修改my.cnf配置文件:
[mysqld]
server-id = 1
log-bin = /var/log/mysql/binlog
gtid_mode = ON                # 启用GTID模式
enforce-gtid-consistency = ON # 强制GTID一致性
log-slave-updates = ON        # 从库更新写入binlog
3. 配置从库(GTID 模式)
修改my.cnf配置文件:
[mysqld]
server-id = 2
gtid_mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON
配置同步(无需指定 binlog 位置):
CHANGE MASTER TO
  MASTER_HOST='master_ip',
  MASTER_USER='repl_user',
  MASTER_PASSWORD='password',
  MASTER_AUTO_POSITION=1;      # 使用GTID自动定位

START SLAVE;
三、常见同步问题排查
1. 状态检查命令
SHOW SLAVE STATUS\G;          # 查看从库同步状态
SHOW BINARY LOGS;             # 查看主库binlog文件列表
SHOW RELAYLOG EVENTS;         # 查看从库中继日志事件
2. 常见错误及解决
IO 线程错误(Slave_IO_Running: No):
检查主从网络连通性(ping、telnet 3306)
验证复制用户权限
检查主库 binlog 文件是否存在
SQL 线程错误(Slave_SQL_Running: No):
查看Last_SQL_Error定位具体错误
从库与主库数据不一致时,可尝试:
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;  # 跳过一个事务
START SLAVE;

四、其他同步方案
1. 半同步复制(Semi-sync Replication)
确保事务在至少一个从库写入中继日志后才返回成功,提高数据安全性。
-- 主库安装插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;

-- 从库安装插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
2. 多源复制(Multi-source Replication)
一个从库同时从多个主库复制数据(需 MySQL 5.7+):
-- 配置多个通道
CHANGE MASTER TO
  MASTER_HOST='master1_ip',
  MASTER_USER='repl_user',
  MASTER_PASSWORD='password',
  MASTER_AUTO_POSITION=1
FOR CHANNEL 'channel1';

CHANGE MASTER TO
  MASTER_HOST='master2_ip',
  MASTER_USER='repl_user',
  MASTER_PASSWORD='password',
  MASTER_AUTO_POSITION=1
FOR CHANNEL 'channel2';
五、生产环境注意事项
硬件配置:主库性能不足可能导致 binlog 生成慢,影响同步延迟。
网络优化:主从服务器建议部署在同机房,低延迟网络(RTT < 1ms)。
监控告警:
监控Seconds_Behind_Master(同步延迟时间)
监控 binlog 磁盘空间(避免占满导致主库挂起)
备份策略:定期备份 binlog 文件,防止主库故障时数据丢失。


网站公告

今日签到

点亮在社区的每一天
去签到