写一个 Python 脚本来做增量同步

可以,写一个 Python 脚本来做增量同步完全可行。你的需求总结是:

  • 两张表结构相同(主库 vs 从库)
  • 通过 主键(id)+ update_time 判断哪些记录需要更新/插入
  • 批量同步,减少数据库压力

我写一个脚本你可以直接从命令行或 Navicat 的 SQL 编辑器里跑。不过更实际的方案是——基于主键分片,逐批比对+写入

脚本如下:脚本写好了。用法说明如下:

使用方式

1. 先安装依赖:

pip3 install pymysql

2. 修改脚本里的密码:MASTER["password"]SLAVE["password"] 改成对应的密码。

3. 运行:

同步所有表:

python3 db_sync.py

只同步指定表(逗号分隔):

python3 db_sync.py --tables jav_dmm,jav_xxx,jav_yyy

调整批次大小(默认 5000):

python3 db_sync.py --batch 10000

脚本做了什么

步骤 说明
1️⃣ 获取从库每张表的当前最大主键 ID
2️⃣ 把主库大于从库最大 ID 的记录 INSERT IGNORE 到从库
3️⃣ 如果有 update_time 字段,比对主从相同的 ID 行,update_time 不同则 UPDATE
4️⃣ 分批(默认 5000 条一批)提交,避免大事务

⚠️ 注意事项

  • 同步前建议先停掉从库同步STOP SLAVE;),同步完再 START SLAVE;
  • 如果表数多且数据量大,跑完全部表可能需要一段时间
  • 建议先 --tables 指定几张表测试一下效果
  • 主键名为 id 的自动识别,如果不是 id 也能自动识别主键名

你可以先从本地 Mac 或任何能同时连主库和从库的机器上跑这个脚本。要我现在帮你跑吗?或者你想先改密码自己跑? 文件在:

/Users/dean/.openclaw/workspace-jason/db_sync.py

不过这个是本机 Mac 上的路径,如果你要从这台 Mac 运行,可以直接:

cd /Users/dean/.openclaw/workspace-jason
# 先装依赖
pip3 install pymysql
# 修改脚本里的密码
# 运行
python3 db_sync.py

如果你是要在其他机器(比如 fnOS 或其他服务器)上跑,你可以把文件内容复制过去。内容我给你贴在下面,你直接复制保存为 db_sync.py

⚠️ 记得先把脚本里 MASTER["password"]SLAVE["password"]"***" 改成实际密码。

MySQL 原生支持一主多从

可以,完全没问题。MySQL 原生支持一主多从,操作也很简单。

配置方法

假设你现有主库 124.156.196.225:30416 已经带了一个从库 192.168.1.70,要再加一个新从库:

第 1 步:主库检查 repl 用户(如果已配过就不需要)

-- 确认 repl_fn 用户已存在且授权给所有 IP
SELECT user, host FROM mysql.user WHERE user='repl_fn';

第 2 步:主库查当前 binlog 位置(锁住确保位置不变)

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

记下 FilePosition

第 3 步:新从库全量导入数据

用 mysqldump 从主库导出:

mysqldump -h 124.156.196.225 -P 30416 -u root -p \
  --databases avdb \
  --source-data=2 --single-transaction \
  --routines --triggers --events \
  --set-gtid-purged=OFF > /tmp/avdb_full.sql

导入到新从库:

mysql -h 新从库IP -u root -p < /tmp/avdb_full.sql

第 4 步:新从库配主从

CHANGE MASTER TO
  MASTER_HOST='124.156.196.225',
  MASTER_PORT=30416,
  MASTER_USER='repl_fn',
  MASTER_PASSWORD='***',
  MASTER_LOG_FILE='binlog.xxxxxx',
  MASTER_LOG_POS=xxxxx;
START SLAVE;

第 5 步:主库解锁

UNLOCK TABLES;

注意事项

维度 说明
性能影响 主库的 binlog 会分发到所有从库,从库越多主库的 IO 压力越大。一般建议不超过 5-10 个从库
网络延迟 各从库 Seconds_Behind_Master 可能不同,取决于从库性能和网络
repl 用户 所有从库共用同一个 repl_fn 用户,不需要为每个从库单独创建
从库独立 每个从库独立配置,互不影响。一个从库挂了不影响其他从库同步

你是打算再加一个从库吗?