> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-detect-table-modification.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# ClickHouse Managed Postgres 迁移常见问题解答

> 有关将数据迁移到 ClickHouse Managed Postgres 的常见问题解答。

export const PrivatePreviewBadge = () => {
  return <div className="privatePreviewBadge">
            <div className="privatePreviewIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path d="M5.33301 6.66667V4.66667V4.66667C5.33301 3.194 6.52701 2 7.99967 2V2C9.47234 2 10.6663 3.194 10.6663 4.66667V4.66667V6.66667" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path d="M8.00033 9.33337V11.3334" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path fillRule="evenodd" clipRule="evenodd" d="M11.333 14H4.66634C3.92967 14 3.33301 13.4033 3.33301 12.6666V7.99996C3.33301 7.26329 3.92967 6.66663 4.66634 6.66663H11.333C12.0697 6.66663 12.6663 7.26329 12.6663 7.99996V12.6666C12.6663 13.4033 12.0697 14 11.333 14Z" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>
        </div>
            {'ClickHouse Cloud 私有预览'}
        </div>;
};

<PrivatePreviewBadge link="https://clickhouse.com/cloud/postgres" galaxyTrack={true} slug="migrations-faq" />

关于 Postgres 复制工作机制的许多问题——包括 `TOAST` 列、replication slot、publication、schema 变更和数据类型映射——都可在 [ClickPipes for Postgres FAQ](/zh/integrations/clickpipes/postgres/faq) 中找到解答。其中的信息同样适用于 ClickHouse Managed Postgres 迁移。

<div id="invalid-enum-value">
  ### 复制期间出现“枚举 输入值无效”错误
</div>

当源 Postgres 中存在目标 ClickHouse Managed Postgres 上没有的 枚举 值时，就会出现此错误。逻辑复制不会自动传播 `ALTER TYPE ... ADD VALUE` 命令，因此，如果在初始 schema 设置完成后，源端新增了 枚举 值，就会导致目标端插入失败。

要解决此问题，请在目标 Postgres 上为该 枚举 类型补上缺失的值：

```sql theme={null}
ALTER TYPE your_enum_type ADD VALUE 'new_value';
```

将 `your_enum_type` 替换为你的枚举类型名称，并将 `'new_value'` 替换为错误消息中缺少的值。

<div id="constraint-violation">
  ### 复制期间出现唯一约束或检查约束冲突错误
</div>

当复制顺序与目标端现有约束冲突时，逻辑复制过程中可能发生约束冲突。

* **唯一约束**：我们以批次 `MERGE`/`UPSERT` 操作应用更改，为每个主键写入最新值。因此，特定键的操作顺序可能与唯一索引预期的顺序不一致。即使 `MERGE` 完成后约束能够满足，事务过程中也可能暂时违反 `UNIQUE` 约束。Postgres 无法像延迟外键检查那样延迟唯一索引检查，因此无法将检查推迟到事务结束时。这不会影响数据一致性：行身份由主键定义，`MERGE` 逻辑也基于同一主键。
* **检查约束**：目标端的检查约束可能比源端更严格，或者批次 `MERGE` 期间的中间状态可能不满足该约束，即使最终状态满足。与唯一约束一样，这不会影响数据一致性，因为 `MERGE` 基于定义行身份的主键。

要解除复制阻塞，请删除目标 Postgres 上导致冲突的约束：

```sql theme={null}
-- Drop a unique constraint
ALTER TABLE your_table DROP CONSTRAINT your_constraint_name;

-- Drop a check constraint
ALTER TABLE your_table DROP CONSTRAINT your_check_constraint_name;
```

您可以根据错误消息中的名称查找约束的详细信息：

```sql theme={null}
SELECT conname, conrelid::regclass, contype
FROM pg_constraint
WHERE conname = 'your_constraint_name';
```

复制完成且源端不再处于活动状态后，在切换期间重新添加约束：

```sql theme={null}
ALTER TABLE your_table ADD CONSTRAINT your_constraint_name UNIQUE (column1, column2);
ALTER TABLE your_table ADD CONSTRAINT your_check_constraint_name CHECK (column1 > 0);
```

<div id="generated-always-column">
  ### 复制期间出现 "cannot insert a non-DEFAULT value into column" 错误
</div>

当目标端的某一列 (通常是主键) 被定义为 `GENERATED ALWAYS AS IDENTITY` 时，会出现此错误。逻辑复制会携带源端的显式值，但 `GENERATED ALWAYS` 列会拒绝 `DEFAULT` 以外的任何值，因此插入操作会失败，并显示：

```text theme={null}
cannot insert a non-DEFAULT value into column "id"
```

要解决此问题，请修改目标 Postgres 中的列，使其接受用户提供的值。您可以将 identity 列改为 `GENERATED BY DEFAULT AS IDENTITY`：

```sql theme={null}
ALTER TABLE your_table ALTER COLUMN id SET GENERATED BY DEFAULT;
```

`GENERATED BY DEFAULT AS IDENTITY` (或 `serial`/`bigserial` 列) 在未提供值时仍会自动生成值，但与 `GENERATED ALWAYS` 不同，它也接受从源端复制的显式值。

<div id="extension-not-available">
  ### 迁移期间出现“扩展 不可用”错误
</div>

在自动 schema 迁移 (`pg_dump`) 过程中，如果源 schema 依赖的 Postgres 扩展 未安装在目标 Managed Postgres 上，或目标服务不提供该 扩展，便会出现此错误。错误可能显示为以下其中一种：

```text theme={null}
ERROR: extension "your_extension" is not available
ERROR: could not open extension control file ".../your_extension.control": No such file or directory
```

将 `your_extension` 替换为错误消息中指定的扩展名称。

要解决此问题，可采取以下任一方法：

* 使用手动 schema 转储模式重新创建管道，以便调整 schema，移除或替换对不受支持扩展的依赖；或者
* 提交支持工单，请求在目标 Managed Postgres 上启用该扩展。
