使用pgloader迁移MySQL至PostgreSQL时遇ERROR mysql:76错误如何解决
解决MySQL迁移PostgreSQL时的"ERROR mysql: 76 fell through ECASE expression"错误
这个错误是pgloader工具在处理MySQL特定对象(数据类型、存储引擎、语法)时,内置模式匹配分支缺失导致的,以下是具体解决步骤:
1. 定位触发错误的具体对象
给pgloader添加 verbose/debug 参数,输出详细运行日志,找到出错的表、字段或存储对象:
pgloader --verbose mysql://[user]:[password]@[mysql-host]/[source-db] postgresql://[user]:[password]@[pg-host]/[target-db]
从日志中重点排查是否有非标准数据类型(如ENUM/SET)、非InnoDB存储引擎的表,或特殊约束/触发器。
2. 预处理MySQL中的问题对象
- 存储引擎转换:将所有非InnoDB表转为InnoDB(pgloader对InnoDB支持更完善):
ALTER TABLE [problem-table] ENGINE=InnoDB; - 特殊数据类型处理:针对MySQL独有的
ENUM/SET类型,可临时转为VARCHAR,或在pgloader配置中添加自定义类型映射:TYPE mysql:enum TO postgresql:varchar(255); TYPE mysql:set TO postgresql:text; - 移除不兼容对象:暂时禁用MySQL中的自定义触发器、特殊索引(如FULLTEXT),迁移完成后再重新实现为PostgreSQL兼容版本。
3. 更新pgloader至最新版本
该错误多为旧版pgloader的已知bug,更新到最新版本可修复大部分匹配分支缺失问题:
- Debian/Ubuntu系统:
sudo apt update && sudo apt upgrade pgloader - 其他系统可从官方源码编译或下载预编译包。
4. 使用自定义配置文件细化迁移规则
编写pgloader配置文件(如migrate.conf),明确指定迁移规则、类型映射和忽略对象,避免默认规则的局限性:
LOAD DATABASE FROM mysql://[user]:[password]@localhost/mysql_source INTO postgresql://[user]:[password]@localhost/pg_target WITH include drop, create tables, create indexes, reset sequences SET work_mem to '64MB', maintenance_work_mem to '512MB' TYPE mysql:longtext TO postgresql:text, mysql:enum TO postgresql:varchar(255), mysql:set TO postgresql:text EXCLUDE TABLES LIKE 'temp_%', 'test_%' ;
运行配置文件启动迁移:
pgloader migrate.conf
内容的提问来源于stack exchange,提问作者GanesH RahuL
相关产品推荐
相关产品推荐

