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

如何在MariaDB(MySQL)中同步克隆库修改至原库并保留新增数据

同步MariaDB Database B修改到Database A且保留A新增数据的方案

首先得给你提个关键提醒:操作前一定要全量备份Database A和Database B,这是绝对的底线,避免任何操作失误导致数据丢失。备份命令如下:

# 备份Database A
mysqldump -u [你的用户名] -p --single-transaction --all-databases DatabaseA > db_a_backup.sql

# 备份Database B
mysqldump -u [你的用户名] -p --single-transaction --all-databases DatabaseB > db_b_backup.sql

接下来分表结构同步和数据同步两部分处理,确保只同步B的修改,同时完整保留A新增的表和数据。

一、同步表结构修改

这里只处理克隆时就存在的表(A新增的表直接保留,无需操作),需要找出B相对于A的结构变化(比如新增列、修改列类型、增减索引等):

  1. 分别导出A和B的表结构(不含数据):
# 导出Database B的结构
mysqldump -u [你的用户名] -p --no-data DatabaseB > db_b_structure.sql

# 导出Database A的结构
mysqldump -u [你的用户名] -p --no-data DatabaseA > db_a_structure.sql
  1. 对比两个结构文件,定位B的修改:
diff db_a_structure.sql db_b_structure.sql

你会看到B中修改的SQL语句(比如ALTER TABLE、CREATE INDEX等),把这些语句挑出来,手动执行到Database A中即可。注意:A中新增的表在B的结构文件里没有,diff结果不会涉及,直接忽略就行。

二、同步数据修改

核心目标是:只同步B对原有表的新增、更新、删除操作,同时保留A中新增的数据行。推荐用Percona Toolkit的pt-table-sync工具(高效且安全),如果不想用工具也可以手动处理。

方法1:用pt-table-sync工具(推荐)

这个工具能自动对比两个表的数据差异,只同步必要的部分,且不会覆盖A的新增数据:

  1. 安装Percona Toolkit(以Debian/Ubuntu为例,CentOS用yum):
sudo apt update && sudo apt install percona-toolkit
  1. 先做干运行(查看会执行的SQL,确认没问题再实际执行):
# 同步单个表:把B的table1数据同步到A的table1
pt-table-sync --dry-run h=localhost,D=DatabaseA,t=table1 h=localhost,D=DatabaseB,t=table1

# 同步多个克隆时的表:
pt-table-sync --dry-run --databases DatabaseA,DatabaseB --tables table1,table2,table3
  1. 确认干运行结果符合预期后,执行实际同步:
# 单个表同步
pt-table-sync --execute h=localhost,D=DatabaseA,t=table1 h=localhost,D=DatabaseB,t=table1

# 多个表同步
pt-table-sync --execute --databases DatabaseA,DatabaseB --tables table1,table2,table3

注意:这个工具依赖主键或唯一键来对比数据,所以你的表必须有主键或唯一键,否则无法正常工作。

方法2:手动同步数据(无工具时)

如果不想用第三方工具,可以手动分场景处理:

1. 同步B中新增的数据行(原有表中B有但A没有的行)

假设表有主键id,导出B中A没有的行:

mysqldump -u [你的用户名] -p --single-transaction --no-create-info DatabaseB table1 --where="id NOT IN (SELECT id FROM DatabaseA.table1)" > table1_new_rows.sql

然后导入到A:

mysql -u [你的用户名] -p DatabaseA < table1_new_rows.sql

2. 同步B中更新的数据行(原有表中B修改过的行)

如果表有更新时间字段(比如updated_at),导出B中更新时间晚于A的行:

mysqldump -u [你的用户名] -p --single-transaction --no-create-info DatabaseB table1 --where="id IN (SELECT b.id FROM DatabaseB.table1 b JOIN DatabaseA.table1 a ON b.id=a.id WHERE b.updated_at > a.updated_at)" > table1_updated_rows.sql

然后把导出的SQL里的INSERT改成REPLACE(或者用INSERT ... ON DUPLICATE KEY UPDATE),避免主键冲突:

sed -i 's/INSERT INTO/REPLACE INTO/' table1_updated_rows.sql

最后导入到A:

mysql -u [你的用户名] -p DatabaseA < table1_updated_rows.sql

3. 同步B中删除的数据行(谨慎操作!)

如果需要把B中删除的行同步到A,一定要注意不能删除A新增的行。首先回忆克隆时原有表的最大主键值(比如clone_max_id),然后只删除A中原有范围内且B不存在的行:

-- 登录MariaDB后执行
USE DatabaseA;
DELETE FROM table1 WHERE id <= [clone_max_id] AND id NOT IN (SELECT id FROM DatabaseB.table1);

警告:如果没有记录克隆时的最大主键,不要执行这个操作,否则会误删A新增的行!

三、注意事项

  • 尽量在业务低峰期操作,避免锁表影响业务;
  • 对于InnoDB表,使用--single-transaction参数可以避免全局锁表,保证数据一致性;
  • 如果表有外键,操作前可以临时禁用外键检查:SET FOREIGN_KEY_CHECKS=0;,操作完成后再开启:SET FOREIGN_KEY_CHECKS=1;;
  • 所有操作先在测试环境验证,再应用到生产环境。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:08:52