需要从 MySQL 迁移到 PostgreSQL,获得更丰富的 SQL 能力、扩展生态或统一数据库栈。迁移难点在数据类型、自增、大小写、存储过程和 SQL 方言。
mysqldump --single-transaction --routines --triggers \
--set-gtid-purged=OFF app > app.sql
grep -nE 'AUTO_INCREMENT|ENGINE=|UNSIGNED|TINYINT|DATETIME|ON UPDATE|`' app.sql | head -50
pgloader mysql://user:***@mysql:3306/app \
postgresql://user:***@postgres:5432/app
TINYINT(1) → booleanDATETIME → timestampAUTO_INCREMENT → generated by default as identityUNSIGNED 需要扩大到更大整数类型迁移存储过程和触发器,改写 MySQL 方言。
校验数据:
psql -c "SELECT count(*) FROM orders;"
mysql -e "SELECT count(*) FROM orders;"
UNSIGNED 溢出,迁移后数据被截断。AUTO_INCREMENT 序列没有同步,插入冲突。ON UPDATE CURRENT_TIMESTAMP 语义不同,需要触发器。LIMIT offset, size 语法不同。pgloader — MySQL 到 PostgreSQL 迁移mysqldump — MySQL 导出psql — PostgreSQL 验证pg_dump / pg_restore — 备份恢复