凌峰创科服务平台

同一服务器如何实现MySQL数据同步?

在MySQL数据库管理中,同一服务器内的数据同步是常见需求,主要用于实现读写分离、数据备份、负载均衡或跨库数据整合,本文将详细解析MySQL在同一服务器内实现数据同步的多种方法,包括主从复制、基于GTID的复制、半同步复制以及使用触发器或事件等方案,并对比其优缺点及适用场景,最后通过FAQs解答常见问题。

同一服务器如何实现MySQL数据同步?-图1
(图片来源网络,侵删)

MySQL主从复制(基于二进制日志)

主从复制是MySQL最经典的同步方式,通过主库的二进制日志(binlog)将数据变更同步到从库,其核心流程包括:主库记录所有写操作到binlog,从库的I/O线程读取binlog并中继到中继日志(relay log),SQL线程从中继日志执行重放操作,实现数据一致,在同一服务器内实现主从复制时,需配置不同的端口和数据目录,避免冲突。

配置步骤

  1. 主库配置(my.cnf):
    [mysqld]
    server-id=1
    log-bin=mysql-bin
    binlog-format=ROW
  2. 从库配置(my.cnf):
    [mysqld]
    server-id=2
    relay-log=relay-bin
    read-only=1
  3. 创建复制用户
    CREATE USER 'repl'@'localhost' IDENTIFIED BY 'password';
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'localhost';
  4. 启动复制
    CHANGE REPLICATION SOURCE TO SOURCE_HOST='127.0.0.1', SOURCE_PORT=3306, SOURCE_USER='repl', SOURCE_PASSWORD='password';
    START REPLICA;

优点:异步复制性能高,支持多级复制;缺点:可能存在数据延迟,需手动处理主从切换。

基于GTID的复制

GTID(全局事务标识符)为每个事务分配唯一ID,简化了复制的配置和故障恢复,同一服务器内配置GTID复制时,需确保主从库的gtid_mode=ON

同一服务器如何实现MySQL数据同步?-图2
(图片来源网络,侵删)

配置差异

  • 主库启用GTID:
    [mysqld]
    gtid-mode=ON
    enforce-gtid-consistency=ON
  • 从库启动复制时无需指定binlog文件和位置:
    CHANGE REPLICATION SOURCE TO SOURCE_HOST='127.0.0.1', SOURCE_PORT=3306, SOURCE_USER='repl', SOURCE_PASSWORD='password', AUTO_POSITION=1;

优点:故障恢复无需定位binlog位置,支持自动故障转移;缺点:对事务提交顺序要求严格,可能影响某些非事务表的兼容性。

半同步复制

半同步复制是主从复制的增强版,要求至少一个从库确认收到binlog后才返回成功,降低数据丢失风险,需安装插件rpl_semi_sync_masterrpl_semi_sync_slave

配置步骤

同一服务器如何实现MySQL数据同步?-图3
(图片来源网络,侵删)
  1. 主库安装并启用插件:
    INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
    SET GLOBAL rpl_semi_sync_master_enabled = ON;
  2. 从库安装并启用插件:
    INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
    SET GLOBAL rpl_semi_sync_slave_enabled = ON;
  3. 重启复制。

优点:数据一致性更高;缺点:性能略低于异步复制,超时后自动降级为异步复制。

其他同步方式

  1. 触发器+事件:通过触发器捕获数据变更,写入中间表,再通过事件定时同步到目标表,适用于小规模数据同步,但维护复杂度高。
  2. MySQL Workbench/第三方工具:如mysqldump+定时任务,或使用Percona Toolkit的pt-table-sync,适合一次性或低频同步。

方案对比

方案 延迟性 一致性 配置复杂度 适用场景
主从复制(异步) 最终一致 读多写少,高并发
GTID复制 最终一致 需简化故障恢复的集群
半同步复制 对数据一致性要求严格
触发器+事件 实时 跨库表级同步,小数据量

常见问题与优化

  1. 复制延迟:可通过调整slave_net_timeout、增加从库硬件资源或使用多线程复制(slave_parallel_workers)优化。
  2. 主从数据不一致:定期使用pt-table-checksum校验,发现不一致后用pt-table-sync修复。

FAQs

Q1: 同一服务器内MySQL主从复制如何避免端口和文件冲突?
A1: 需为每个实例配置独立的端口(如主库3306,从库3307)、数据目录(如/var/lib/mysql-master/var/lib/mysql-slave)、socket文件(如/tmp/mysql.sock/tmp/mysql_slave.sock)以及日志文件路径(如log-bin=mysql-bin-master),通过mysqld_multi或Docker容器隔离不同实例,确保配置文件参数不重叠。

Q2: GTID复制时,从库跳过事务导致同步中断怎么办?
A2: 可通过以下步骤处理:

  1. 查看被跳过的事务ID:SHOW REPLICA STATUS\G,检查Retrieved_Gtid_SetExecuted_Gtid_Set
  2. 手动跳过单个事务:SET GLOBAL sql_slave_skip_counter=1; START REPLICA;(仅适用于非关键事务)。
  3. 若需跳过多个事务,调整gtid_nextSET gtid_next='XXX:XXX'; BEGIN; COMMIT; SET gtid_next='AUTOMATIC';
  4. 长期解决方案是检查主从库业务逻辑,避免因唯一键冲突或事务依赖导致跳过,必要时通过备份重建从库。
分享:
扫描分享到社交APP
上一篇
下一篇