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 文件,防止主库故障时数据丢失。

相关推荐
保持学习ing30 分钟前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
发仔1231 小时前
Oracle与MySQL核心差异对比
mysql·oracle
宇钶宇夕1 小时前
EPLAN 电气制图:建立自己的部件库,添加部件-加SQL Server安装教程(三)上
运维·服务器·数据库·程序人生·自动化
爱可生开源社区2 小时前
SQLShift 重磅更新:支持 SQL Server 存储过程转换至 GaussDB!
数据库
贾修行2 小时前
SQL Server 空间函数从入门到精通:原理、实战与多数据库性能对比
数据库·sqlserver
傲祥Ax2 小时前
Redis总结
数据库·redis·redis重点总结
一屉大大大花卷3 小时前
初识Neo4j之入门介绍(一)
数据库·neo4j
叁沐3 小时前
MySQL 08 详解read view:事务到底是隔离的还是不隔离的?
mysql
周胡杰4 小时前
鸿蒙arkts使用关系型数据库,使用DB Browser for SQLite连接和查看数据库数据?使用TaskPool进行频繁数据库操作
前端·数据库·华为·harmonyos·鸿蒙·鸿蒙系统
wkj0014 小时前
navicate如何设置数据库引擎
数据库·mysql