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

以下是 MySQL 日志数据同步的详细教程,主要介绍基于二进制日志(binlog)的主从复制和基于 GTID 的高级同步方案:

一、MySQL 二进制日志(binlog)同步基础

  1. 二进制日志原理

binlog 是 MySQL 的事务性日志,记录所有导致数据变更的 SQL 语句(如 INSERT、UPDATE、DELETE)。

主从复制 通过 binlog 实现:主库记录 binlog → 从库复制 binlog → 从库重放 SQL 语句。

  1. 配置主库(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 | |

+------------------+----------+--------------+------------------+

  1. 配置从库(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 位置,简化拓扑结构变更,支持多主复制。

  1. 配置主库(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

  1. 配置从库(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; # 查看从库中继日志事件

  1. 常见错误及解决

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;

  1. 多源复制(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 文件,防止主库故障时数据丢失。

相关推荐
SelectDB25 分钟前
5000+ 中大型企业首选的 Doris,在稳定性的提升上究竟花了多大的功夫?
大数据·数据库·apache
路多辛26 分钟前
Golang database/sql 包深度解析(二):连接池实现原理
数据库·sql·golang
SimonKing37 分钟前
Mybatis批量插入,形式不同性能也不同
数据库·后端·程序员
小卓笔记1 小时前
MySQL库表操作
mysql
iVictor1 小时前
MySQL 密码防暴力破解插件:Connection Control
mysql
Seven971 小时前
了解Mysql优化吗?如何优化索引?
mysql
rannn_1112 小时前
【MySQL学习|黑马笔记|Day7】触发器和锁(全局锁、表级锁、行级锁、)
笔记·后端·学习·mysql
杰克尼2 小时前
MYSQL-175. 组合两个表
数据库·mysql
DemonAvenger2 小时前
MySQL索引原理深度解析与优化策略实战
数据库·mysql·性能优化
189228048612 小时前
NY270NY273美光固态闪存NY277NY287
服务器·网络·数据库·科技·性能优化