异地两台MySQL服务器能否按需同步指定数据表?求实现方案
异地MySQL服务器同步指定数据表的可行方案
1. 原生主从复制(过滤指定表)
- 主库配置
my.cnf(Windows用my.ini),添加表过滤规则,只生成指定表的binlog:# 仅同步db1库下的table1、table2 binlog-do-db=db1 binlog-ignore-table=db1.table3 binlog-ignore-table=db1.table4 # 也可直接指定要同步的表(部分MySQL版本支持) binlog-do-table=db1.table1 binlog-do-table=db1.table2 - 从库配置
my.cnf,设置只同步指定表:replicate-do-db=db1 replicate-do-table=db1.table1 replicate-do-table=db1.table2 # 用通配符匹配更灵活,比如同步db1下所有table开头的表 # replicate-wild-do-table=db1.table_ - 优势:原生支持,性能稳定,实时性不错
- 劣势:配置有点繁琐,异地网络波动可能断同步,需要持续维护链路
2. 定时任务+导出导入脚本
- 写shell脚本定时执行,用
mysqldump导出指定表再导入到异地库:# 导出主库的table1、table2 mysqldump -h主库IP -u用户名 -p'密码' 库名 table1 table2 > /tmp/sync_data.sql # 导入到从库 mysql -h从库IP -u用户名 -p'密码' 库名 < /tmp/sync_data.sql - 大数据量推荐用
SELECT INTO OUTFILE和LOAD DATA INFILE,更快且不锁全表:-- 主库导出为CSV SELECT * INTO OUTFILE '/tmp/table1.csv' FIELDS TERMINATED BY ',' FROM 库名.table1; -- 把CSV传到从库服务器后,导入数据 LOAD DATA INFILE '/tmp/table1.csv' INTO TABLE 库名.table1 FIELDS TERMINATED BY ','; - 优势:实现简单,零复杂配置,想什么时候同步就什么时候执行
- 劣势:实时性差(取决于定时频率),大数据量时耗时久,导出时可能锁表
3. 触发器+自定义同步脚本
- 在主库指定表上建触发器,把增删改操作记录到日志表:
-- 示例:INSERT操作触发记录 CREATE TRIGGER sync_table1_insert AFTER INSERT ON 库名.table1 FOR EACH ROW INSERT INTO 库名.sync_log (table_name, opt_type, data) VALUES ('table1', 'INSERT', JSON_OBJECT('id', NEW.id, 'name', NEW.name)); - 写脚本定时读取日志表的变更数据,同步到从库对应表,同步完清空日志
- 优势:只同步变更数据,减少传输量,可自定义同步逻辑
- 劣势:触发器会增加主库负载,脚本需要自己维护,出问题排查麻烦
4. 第三方工具(如Percona Toolkit的pt-table-sync)
- 用pt-table-sync工具做指定表同步,支持全量校验和增量同步:
# 同步主库的db1.table1到从库对应表,--execute表示直接执行同步 pt-table-sync --execute h=主库IP,D=db1,t=table1 h=从库IP,D=db1,t=table1 - 优势:工具成熟,能自动校验数据一致性,增量同步效率高
- 劣势:需要额外安装工具,异地网络延迟会影响同步速度
内容的提问来源于stack exchange,提问作者Abhinav
相关产品推荐
相关产品推荐

