最稳的起点是mysqldump+mysql一次性全量同步;需分批事务导入、处理主键冲突、记录断点、校验auto_increment和timestamp一致性,并用show create table比对建表语句。

用 mysqldump + mysql 做一次性全量同步
直接导出再导入是最稳的起点,适合首次迁移或数据量不大(
-
mysqldump默认不导出CREATE DATABASE语句,目标库得提前建好,且字符集要和源库一致(比如都用utf8mb4),否则中文变问号 - 加
--single-transaction可避免锁表,但只对 InnoDB 有效;MyISAM 必须用--lock-all-tables,会阻塞写入 - 别漏掉
--routines(存储过程)、--triggers(触发器),否则业务逻辑可能断掉 - 示例命令:
mysqldump -h src_host -u user -p --single-transaction --routines --triggers db_name | mysql -h dst_host -u user -p db_name
用 pt-table-sync 做增量比对与修复
当两个库已运行一段时间、需要校验并修复差异时,pt-table-sync 是目前最可靠的工具。它不依赖 binlog,而是逐行比对主键或唯一索引,适合跨机房、跨版本场景。
- 必须确保两张表结构完全一致(包括索引、自增起始值),否则会跳过或报错
Cannot find a unique index - 默认只输出 SQL,加
--execute才真正执行修复,建议先用--print看一遍要改什么 - 如果主从延迟大,或者目标库有活跃写入,
--sync-to-master模式可能误删数据,优先选--replicate模式(需提前建好校验表) - 性能上,单表超千万行时建议加
--chunk-size控制每次比对量,避免内存爆掉
PHP 脚本做条件性同步(比如只同步某段时间订单)
纯 PHP 写同步逻辑,灵活性最高,但也最容易出错——尤其是事务边界和错误恢复。别把它当成“简单循环插入”,本质是分布式状态同步。
PHP是一种功能强大的网络程序设计语言,而且易学易用,移植性和可扩展性也都非常优秀,本书将为读者详细介绍PHP编程。 全书分为预备篇、开始篇和加速篇三大部分,共9章。预备篇主要介绍一些学习PHP语言的预备知识以及PHP运行平台的架设;开始篇则较为详细地向读者介绍PKP语言的基本语法和常用函数,以及用PHP如何对MySQL数据库进行操作;加速篇则通过对典型实例的介绍来使读者全面掌握PHP。 本书
- 源库查数据必须用游标分页(
WHERE id > ? ORDER BY id LIMIT ?),不用OFFSET,否则越往后越慢还丢数据 - 目标库写入必须包在事务里,且每批(比如 100 条)提交一次,不然内存撑爆或锁表太久;但也要防事务太大导致
innodb_log_file_size不够 - 记得处理
ON DUPLICATE KEY UPDATE或INSERT ... ON CONFLICT(PostgreSQL),否则主键冲突直接中断 - 一定要记录最后同步的
id或updated_at到独立配置表或文件,断点续传不能靠“上次脚本结束时间”这种模糊值
忽略 auto_increment 和 timestamp 导致的隐性不一致
这是线上最常被忽略的坑:两个库看着数据一样,但新插入记录的 id 或 created_at 行为不一致,后续关联查询或分页就出问题。
立即学习“PHP免费学习笔记(深入)”;
-
mysqldump默认导出会带SET INSERT_METHOD=NO和SET TIMESTAMP=...,但如果你手动拼 SQL 或用 ORM 同步,这些元信息就丢了 - 目标库的
auto_increment_offset、auto_increment_increment如果和源库不同,即使数据一样,下一条自增 ID 也会错位 -
TIMESTAMP字段在插入NULL时会自动设为当前时间,但时区设置(time_zone)不同会导致值差几小时,务必检查SELECT @@time_zone - 用
SHOW CREATE TABLE对比两边建表语句,重点关注AUTO_INCREMENT值、DEFAULT表达式、ON UPDATE CURRENT_TIMESTAMP是否一致










