同步时auto_increment值被意外覆盖,需手动查当前值并执行alter table回填;云数据库需配置公网地址、安全组入方向规则及账号host为%;pt-osc避免在--alter中声明auto_increment;docker启动应使用非root用户或初始化sql授权。
同步时 auto_increment 值被意外覆盖怎么办
本地和云数据库结构同步时,auto_increment 值最常被 mysqldump --no-data 或 orm 迁移工具忽略,导致云库插入新记录时主键冲突。根本原因不是“没同步”,而是多数工具默认不导出表的 auto_increment 当前值(它属于元数据,不是 ddl 的一部分)。
实操建议:
- 导出结构时加
--skip-auto-increment(避免 dump 里硬写死旧值),但必须额外补上SHOW CREATE TABLE中的AUTO_INCREMENT=xxx字段 - 用
SELECT AUTO_INCREMENT FROM information_schema.TABLES查当前值,再拼成ALTER TABLE t1 AUTO_INCREMENT = 12345手动执行 - 如果用 Flyway/Liquibase,别依赖
CREATE TABLE语句快照——它们通常不捕获AUTO_INCREMENT当前值,得在afterEach钩子中单独跑 SQL
云数据库连不上本地同步脚本的网络权限卡点
不是所有云厂商都允许“从公网 IP 反向连入 RDS”,尤其阿里云、腾讯云默认关闭外网地址,且安全组只放行入方向——而你的本地脚本是主动发起连接的一方,需要的是“云数据库允许被你的本地 IP 连接”,不是“云服务能访问你电脑”。
常见错误现象:ERROR 2003 (HY000): Can't connect to MySQL server 或超时,但 telnet rds-host 3306 也通不过。
实操建议:
- 先确认云数据库是否开了「公网地址」(不是内网地址),有些实例创建后需手动申请,且有费用或安全提示
- 安全组规则必须添加「入方向」:协议 TCP,端口 3306,源 IP 填你本地的真实公网 IP(不是
0.0.0.0/0,更不是内网段) - 某些云厂商(如 AWS RDS)还要求数据库参数组里开启
skip_show_database以外的权限控制,检查mysql.user表中对应账号的host是%还是localhost
用 pt-online-schema-change 同步结构但跳过自增字段
pt-online-schema-change 本质是建影子表 + 触发器同步数据,它不会动原表的 AUTO_INCREMENT 值,但如果你在 --alter 里写了 MODIFY id BIGINT AUTO_INCREMENT,就会触发 MySQL 重置该值为 1——这是陷阱。
使用场景:仅改字段类型或加索引,不想影响主键连续性。
实操建议:
- 绝对不要在
--alter参数里显式出现AUTO_INCREMENT,哪怕只是重复声明;用MODIFY id BIGINT UNSIGNED NOT NULL替代 - 同步前先记下原表
SELECT MAX(id)和SHOW CREATE TABLE里的AUTO_INCREMENT值,变更后立刻ALTER TABLE ... AUTO_INCREMENT = xxx回填 - 注意
pt-osc默认会复制ENGINE和CHARSET,但不复制AUTO_INCREMENT元数据,这点文档里藏得很深
用 Docker 拉起本地 MySQL 测试同步逻辑时权限错乱
本地用 docker run -e MYSQL_ROOT_PASSWORD=xxx 启的容器,默认 root 只允许从 localhost 连,但你的同步脚本(比如 Python 的 pymysql)走的是容器外部网络,等价于从 172.17.0.1 连,账号直接被拒。
性能影响:强行开 % 权限虽能通,但容器重启后权限丢失,每次都要手动 GRANT,不可持续。
实操建议:
- 启动时加
-e MYSQL_USER=test -e MYSQL_PASSWORD=123,这个用户默认 host 是%,比 root 更适合脚本连接 - 或者挂载初始化 SQL 文件,内容包含:
CREATE USER 'syncer'@'%' IDENTIFIED BY 'x'; GRANT ALL ON *.* TO 'syncer'@'%'; FLUSH PRIVILEGES; - 别映射宿主机的
/etc/mysql/conf.d,Docker 内 MySQL 8+ 默认启用caching_sha2_password插件,老客户端连不上,加--default-authentication-plugin=mysql_native_password启动参数
事情说清了就结束。真正麻烦的从来不是“怎么同步”,而是每次同步后要不要重置 AUTO_INCREMENT、重置成多少、谁来保证这个数在下次同步前不被业务写穿——这些细节没人帮你记。










