MySQL 8.0 的 mysqldump --no-data 跨版本同步失败,因低版本不支持 JSON 默认值、utf8mb4_0900_as_cs 排序规则、ALGORITHM=INSTANT 等新语法;需用 --compatible=mysql40 或人工清理不兼容子句。
MySQL 8.0 的 mysqldump --no-data 在跨版本同步时为什么导出的 CREATE TABLE 语句会失败?
因为低版本 mysql(如 5.7)不识别高版本新增的语法特性,比如 json 字段默认值写法 default (json_object())、utf8mb4_0900_as_cs 排序规则、或 algorithm=instant 子句。直接导入会报 error 1064 或 error 1231。
实操建议:
- 用
mysqldump --no-data --skip-routines --skip-triggers --compact --compatible=mysql40降低语法兼容性(但会丢失部分语义,如显式ENGINE可能被省略) - 更稳妥的做法是:先在目标实例上运行
SELECT VERSION(),再用源实例的mysqldump --no-data --set-gtid-purged=OFF --skip-extended-insert导出,人工删掉目标不支持的子句(如ALGORITHM、COMMENT后长文本、非标准排序规则) - 注意
DEFINER和SQL SECURITY在视图/存储过程里也会触发权限错误,跨实例迁移前建议统一替换为SQL SECURITY DEFINER并确保用户存在
PostgreSQL 中 pg_dump -s 导出的 DDL 怎么安全应用到另一台集群?
pg_dump -s 默认包含 SET 指令和注释,可能在目标库执行时报错(如 SET default_tablespace 失败),且不会自动处理依赖顺序(比如先建 TYPE 再建引用它的表)。
实操建议:
- 加
--no-owner --no-privileges --clean --if-exists参数,避免权限和所有权干扰;--clean会生成DROP TABLE IF EXISTS,但要注意它不递归删依赖对象(如SEQUENCE需单独处理) - 如果目标库已有数据,别直接
psql -f schema.sql,先用pg_restore -l dumpfile | grep -E "(TABLE|TYPE|DOMAIN)" | sort检查对象类型和顺序,必要时拆成两步:先删旧结构(用pg_dump -s --schema-only+ 手动过滤),再导入新 DDL -
CREATE EXTENSION必须提前在目标库执行,pg_dump -s不包含扩展安装语句,漏掉会导致ERROR: type "hstore" does not exist类报错
Redis 数据结构同步:SCAN + TYPE + DUMP 脚本为什么在大 key 场景下卡住?
因为 DUMP 对 hash / zset 等复合结构是全量序列化,若单个 key 超过 1MB,网络传输+反序列化会阻塞客户端连接,且目标端 RESTORE 若遇到同名 key,默认不覆盖(RESTORE 缺失 REPLACE 参数)导致失败。
实操建议:
- 改用
redis-cli --scan --pattern "*"获取 key 列表后,并发分批处理(例如每 100 个 key 启一个子进程),避免单点耗时过长 - 对
hash用HGETALL+HSET替代DUMP/RESTORE,虽慢但可控;对超大zset,用ZRANGE key 0 -1 WITHSCORES分片拉取(配合COUNT和OFFSET) - 务必在
RESTORE命令末尾加REPLACE,否则遇到已存在 key 直接报(error) BUSYKEY Target key name already exists.
跨云厂商 RDS 实例比对:用 pt-table-checksum 为什么连不上阿里云 RDS?
阿里云 RDS 默认禁用 SUPER 权限,而 pt-table-checksum 默认需要该权限来设置 binlog_format=STATEMENT 和创建临时 checksum 表。即使加了 --no-check-binlog-format,仍可能因无法创建 percona.checksums 表失败。
实操建议:
- 手动在目标库建好
percona.checksums表(结构见 Percona Toolkit 文档),并给运行账号INSERT/UPDATE/SELECT权限,然后加--create-replication-table --no-check-plan - 更轻量的方式是绕过 pt 工具:用
SELECT MD5(GROUP_CONCAT(CONCAT_WS('|', col1, col2) ORDER BY id)) FROM tbl对关键表手工校验,适合字段少、主键明确的场景 - 注意
pt-table-checksum的--chunk-size默认 1000 行,若表无合适索引,会退化为全表扫描——务必确认主键或唯一索引列名,用--where "id > ? AND id 手动分块
结构差异往往藏在默认值、字符集隐式转换、索引类型(BTREE vs HASH)、甚至 SQL mode 设置里,比对不能只看 DDL 文本是否一致。










