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

相关推荐
文牧之25 分钟前
PostgreSQL 的扩展pg_freespacemap
运维·数据库·postgresql
deriva43 分钟前
某水表量每15分钟一报,然后某天示数清0了,重新报示值了 ,如何写sql 计算每日水量
数据库·sql
Leo.yuan2 小时前
数据库同步是什么意思?数据库架构有哪些?
大数据·数据库·oracle·数据分析·数据库架构
zhangzhangkeji2 小时前
(33)课54--??:3 张表的 join-on 连接举例,多表查询总结。
mysql
Kookoos2 小时前
ABP VNext 与 Neo4j:构建基于图数据库的高效关系查询
数据库·c#·.net·neo4j·abp vnext
云之兕2 小时前
MyBatis 的动态 SQL
数据库·sql·mybatis
gaoliheng0063 小时前
Redis看门狗机制
java·数据库·redis
?ccc?3 小时前
MySQL主从复制与读写分离
数据库·mysql
会飞的Anthony3 小时前
数据库优化实战分享:高频场景下的性能调优技巧与案例解析
数据库