Skip to main content
关于 Postgres 复制工作机制的许多问题——包括 TOAST 列、replication slot、publication、schema 变更和数据类型映射——都可在 ClickPipes for Postgres FAQ 中找到解答。其中的信息同样适用于 ClickHouse Managed Postgres 迁移。

复制期间出现“枚举 输入值无效”错误

当源 Postgres 中存在目标 ClickHouse Managed Postgres 上没有的 枚举 值时,就会出现此错误。逻辑复制不会自动传播 ALTER TYPE ... ADD VALUE 命令,因此,如果在初始 schema 设置完成后,源端新增了 枚举 值,就会导致目标端插入失败。 要解决此问题,请在目标 Postgres 上为该 枚举 类型补上缺失的值:
your_enum_type 替换为你的枚举类型名称,并将 'new_value' 替换为错误消息中缺少的值。

复制期间出现唯一约束或检查约束冲突错误

当复制顺序与目标端现有约束冲突时,逻辑复制过程中可能发生约束冲突。
  • 唯一约束:我们以批次 MERGE/UPSERT 操作应用更改,为每个主键写入最新值。因此,特定键的操作顺序可能与唯一索引预期的顺序不一致。即使 MERGE 完成后约束能够满足,事务过程中也可能暂时违反 UNIQUE 约束。Postgres 无法像延迟外键检查那样延迟唯一索引检查,因此无法将检查推迟到事务结束时。这不会影响数据一致性:行身份由主键定义,MERGE 逻辑也基于同一主键。
  • 检查约束:目标端的检查约束可能比源端更严格,或者批次 MERGE 期间的中间状态可能不满足该约束,即使最终状态满足。与唯一约束一样,这不会影响数据一致性,因为 MERGE 基于定义行身份的主键。
要解除复制阻塞,请删除目标 Postgres 上导致冲突的约束:
您可以根据错误消息中的名称查找约束的详细信息:
复制完成且源端不再处于活动状态后,在切换期间重新添加约束:

复制期间出现 “cannot insert a non-DEFAULT value into column” 错误

当目标端的某一列 (通常是主键) 被定义为 GENERATED ALWAYS AS IDENTITY 时,会出现此错误。逻辑复制会携带源端的显式值,但 GENERATED ALWAYS 列会拒绝 DEFAULT 以外的任何值,因此插入操作会失败,并显示:
要解决此问题,请修改目标 Postgres 中的列,使其接受用户提供的值。您可以将 identity 列改为 GENERATED BY DEFAULT AS IDENTITY
GENERATED BY DEFAULT AS IDENTITY (或 serial/bigserial 列) 在未提供值时仍会自动生成值,但与 GENERATED ALWAYS 不同,它也接受从源端复制的显式值。

迁移期间出现“扩展 不可用”错误

在自动 schema 迁移 (pg_dump) 过程中,如果源 schema 依赖的 Postgres 扩展 未安装在目标 Managed Postgres 上,或目标服务不提供该 扩展,便会出现此错误。错误可能显示为以下其中一种:
your_extension 替换为错误消息中指定的扩展名称。 要解决此问题,可采取以下任一方法:
  • 使用手动 schema 转储模式重新创建管道,以便调整 schema,移除或替换对不受支持扩展的依赖;或者
  • 提交支持工单,请求在目标 Managed Postgres 上启用该扩展。
最后修改于 2026年8月26日