如何将MySQL的current时间戳字段通过pgloader迁移至PostgreSQL
问题根因
报错是因为pgloader迁移时对MySQL的DATETIME字段默认值表达式解析异常:
- MySQL支持
current_timestamp() + interval 10 year作为datetime默认值,pgloader解析该表达式时错误转换为PostgreSQL不识别的current常量值,触发0A000错误 - MySQL的
DATETIME类型对应PostgreSQL的timestamp without time zone或timestamp with time zone类型,默认值表达式的interval语法也存在差异,PostgreSQL中等价的默认值写法为CURRENT_TIMESTAMP + INTERVAL '10 years'
解决方法
方案1:修改pgloader配置,增加类型与默认值映射(无需修改原MySQL库)
编辑你的scenario.load配置文件,增加字段转换规则,针对tariff表的start_date字段单独指定类型和默认值,配置示例如下:
LOAD DATABASE FROM mysql://user:password@127.0.0.1/database1 INTO postgresql://postgres:postgres@127.0.0.1:5432/database2 CAST type datetime to timestamp drop default drop not null using zero-dates-to-null, column tariff.start_date to timestamp with time zone default 'CURRENT_TIMESTAMP + INTERVAL ''10 years''' ;
配置规则说明:
- 先将所有datetime类型默认转换为PG的timestamp类型,丢弃原默认值避免解析错误
- 单独指定tariff表的start_date字段的类型和正确的PG格式默认值
方案2:提前在PostgreSQL侧建表,pgloader仅迁移数据
如果表结构不多,你可以先在目标PostgreSQL库手动建好tariff表,再调整pgloader配置让它跳过建表步骤,只迁移数据:
- 先在PostgreSQL的目标库执行建表语句:
CREATE SCHEMA IF NOT EXISTS yamalkernel; CREATE TABLE yamalkernel.tariff ( -- 其他字段按实际业务需求补全 start_date TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP + INTERVAL '10 years' -- 其他字段按实际业务需求补全 );
- 修改
scenario.load配置,增加跳过建表的配置:
LOAD DATABASE FROM mysql://user:password@127.0.0.1/database1 INTO postgresql://postgres:postgres@127.0.0.1:5432/database2 WITH no schema creation, create tables no ALTER TABLE NAMES MATCHING 'tariff' SET SCHEMA 'yamalkernel' ;
配置规则说明:
no schema creation:禁止pgloader自动创建schemacreate tables no:禁止pgloader自动建表,只会把数据写入已存在的对应表中
内容的提问来源于stack exchange,提问作者uBaH
相关产品推荐
相关产品推荐

