You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL主从复制数据未同步问题求助:主库变更后从库无更新

主从复制数据不同步问题排查与解决

你遇到的这个问题核心在于复制过滤规则的逻辑冲突和主从库名不一致但未配置映射,导致从库SQL线程虽然在推进日志位置,但实际跳过了数据变更语句。下面一步步拆解原因和解决方案:

问题核心原因分析

从你的配置和日志来看,两个关键配置导致了同步失效:

  1. binlog_do_db与replicate-do-db的逻辑陷阱

    • 主库的binlog_do_db = alpha:这个参数的规则是只有当当前会话的默认数据库是alpha时,变更才会写入binlog。如果主库操作是USE alpha; INSERT INTO t1 ...,binlog里的语句会不带库名;如果是INSERT INTO alpha.t1 ...这种跨库写法,在STATEMENT模式下不会被写入binlog。
    • 从库的replicate-do-db = beta:这个参数的规则是只有当当前会话的默认数据库是beta时,才会执行中继日志里的语句。但主库binlog里的语句要么不带库名(默认库是alpha),要么带alpha库名,从库SQL线程执行时默认库不是beta,所以直接忽略了实际的DML语句,只执行了事务的BEGIN/COMMIT框架——这就是你看到从库日志只有这两条记录的原因。
  2. 主从库名不一致,未配置库名重写
    主库业务库是alpha,从库对应是beta,但你没有配置库名映射。即使从库收到了binlog语句,要么因为语句里的alpha库不存在而静默失败(但你这里没有报错,说明是过滤规则直接跳过了),要么因为默认库不匹配而不执行。

具体解决方案

步骤1:调整主库的binlog配置

修改主库my.cfg,移除容易踩坑的binlog_do_db,改用表级通配符过滤,确保所有alpha库下的表变更都能写入binlog:

# 移除原有的 binlog_do_db = alpha
binlog-do-table = alpha.%

这样不管你在主库用USE alpha;还是直接写INSERT INTO alpha.t1 ...,所有alpha库的表变更都会被记录到binlog。

步骤2:调整从库的复制配置

修改从库my.cfg,配置库名映射和表级过滤,让从库把主库alpha的操作自动映射到beta库:

# 移除原有的 replicate-do-db = beta
replicate-rewrite-db = alpha->beta
replicate-wild-do-table = beta.%
  • replicate-rewrite-db = alpha->beta:会自动把中继日志里所有针对alpha库的操作,替换为beta库的操作
  • replicate-wild-do-table = beta.%:确保只执行beta库下所有表的变更,避免无关操作干扰

步骤3:重启主从数据库服务

# 主库重启(MySQL)
sudo systemctl restart mysql

# 从库重启(MariaDB)
sudo systemctl restart mariadb

步骤4:重置并重新启动复制(可选,清理残留日志)

如果之前的中继日志有无效内容,可以重置从库复制状态,重新同步主库当前的binlog位置:

-- 在从库执行
STOP SLAVE;
RESET SLAVE;
-- 填入你之前主库SHOW MASTER STATUS的信息
CHANGE MASTER TO
  MASTER_HOST='144.217.157.211',
  MASTER_USER='beta_user',
  MASTER_PASSWORD='你的复制用户密码',
  MASTER_LOG_FILE='mysql-bin.000006',
  MASTER_LOG_POS=24181;
START SLAVE;

验证同步效果

  1. 在主库alpha库执行测试语句:
USE alpha;
INSERT INTO test_table (col1) VALUES ('test_sync');
  1. 在从库beta库查询:
USE beta;
SELECT * FROM test_table;

如果能查到新增的记录,说明同步正常。同时查看从库日志,应该能看到实际的INSERT语句执行记录。

补充说明

  • 为什么Exec_Master_Log_Pos会更新?因为IO线程正常读取主库binlog到中继日志,SQL线程也在推进位置,但它只是跳过了不符合过滤规则的语句,只执行了事务的空框架,所以位置会更新但数据不变。
  • 尽量避免使用binlog_do_db和replicate-do-db,这两个参数依赖当前会话的默认数据库,很容易出现过滤错误。优先使用表级过滤或库名映射规则。

内容的提问来源于stack exchange,提问作者Vincent_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 11:29:09