跨服务器MySQL指定表及特定行自动高频同步方案咨询
可行替代方案
1. MySQL 原生复制+行级过滤
MySQL主从复制可通过配置实现精准的表和行过滤:
- 低版本MySQL(<8.0.23):先在从库配置
replicate-wild-do-table=your_db.your_table指定仅同步目标表,然后在主库的目标表上创建触发器——当transfer=1的数据发生新增/更新时,自动将数据同步到一张中间表,让从库同步这张中间表即可。后续从库可将中间表的数据同步到业务表,或直接用中间表提供数据。 - MySQL 8.0.23+:直接用
replicate-row-event-filter配置行级过滤,比如在从库my.cnf中添加replicate-row-event-filter=your_db.your_table:transfer=1,复制阶段会自动过滤不符合条件的行,无需中间表,同步延迟能控制在秒级,完全满足20秒以内的要求。
2. CDC(变更数据捕获)工具
专门的CDC工具能精准解析Binlog,实现高效的增量同步:
- Debezium:开源工具,支持MySQL,可配置只监听指定表,还能通过行过滤规则只捕获
transfer=1的数据变更。捕获到的变更可通过消息队列(如Kafka)异步推送到目标库,延迟通常在几秒内,部署后自动运行,无需手动干预。 - MaxScale:MariaDB官方中间件,兼容MySQL,配置
binlogfilter模块就能过滤指定表和行,自带同步功能,能实现自动、低延迟的增量同步。
3. 秒级定时任务+导出导入
如果不需要严格实时,只要同步周期≤20秒,可用系统脚本配合MySQL命令实现:
- 编写循环脚本,每隔15秒执行一次:
- 主库执行导出:
SELECT * FROM your_db.your_table WHERE transfer=1 AND update_time > '上次同步时间' INTO OUTFILE '/tmp/sync_data.csv' FIELDS TERMINATED BY ',';(需维护上次同步的时间戳,避免重复同步) - 用
scp把CSV文件传到从库 - 从库执行导入:
LOAD DATA INFILE '/tmp/sync_data.csv' INTO TABLE your_db.your_table ON DUPLICATE KEY UPDATE ...;
- 主库执行导出:
- 将脚本后台运行,或用
crontab配合sleep实现秒级触发。这种方式实现简单,无需复杂工具,完全能控制同步周期在20秒内。
4. Federated引擎(只读场景适用)
如果目标库只需要读取数据,不需要写入本地,可使用Federated引擎:在从库创建一张Federated表,关联主库的目标表,查询时直接加transfer=1的条件。不过这不是真正的数据同步,而是实时查询主库,适合只读场景,性能依赖网络状况。
内容的提问来源于stack exchange,提问作者chris01
相关产品推荐
相关产品推荐

