> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-vortex-format.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" />

`TOAST` カラム、replication slots、publications、スキーマ変更、型マッピングなど、Postgres のレプリケーションの仕組みに関する多くの疑問は、[ClickPipes for Postgres よくある質問](/ja/integrations/clickpipes/postgres/faq)で扱っています。そこに記載されている情報は、ClickHouse Managed Postgres の移行にも当てはまります。

<div id="invalid-enum-value">
  ### レプリケーション中に「enum に対する無効な入力値」エラーが表示される
</div>

このエラーは、ソース側の Postgres に存在する enum 値が、ターゲットの ClickHouse Managed Postgres には存在しない場合に発生します。logical replication では `ALTER TYPE ... ADD VALUE` コマンドは自動的に伝播されないため、初回のスキーマ設定後にソース側で追加された新しい enum 値があると、ターゲット側で insert が失敗します。

これを修正するには、ターゲットの Postgres で enum 型に不足している値を追加します。

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

`your_enum_type` はご使用の enum 型名に、`'new_value'` はエラーメッセージに表示されている不足値に置き換えてください。

<div id="constraint-violation">
  ### レプリケーション中に一意制約またはチェック制約違反エラーが発生する
</div>

logical replicationでは、レプリケーションの順序がターゲットに既存の制約と競合すると、制約違反が発生することがあります。

* **一意制約**: 変更は、主キーごとの最新の値を書き込むバッチ `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` として定義されている場合に発生します。logical replicationではソースから明示的な値が渡されますが、`GENERATED ALWAYS` カラムは `DEFAULT` 以外の値を受け付けないため、insertは次のエラーで失敗します。

```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">
  ### 移行中に「extension is not available」エラーが発生する
</div>

このエラーは、自動スキーマ移行 (`pg_dump`) 中に、ソーススキーマがターゲットの Managed Postgres にインストールされていない、または利用できない 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` を、エラーメッセージに記載されている拡張機能名に置き換えます。

この問題を解決するには、次のいずれかを実行します。

* 手動スキーマダンプモードでパイプを再作成し、スキーマを調整してサポートされていない拡張機能への依存関係を削除または置換します。
* ターゲットの Managed Postgres で拡張機能を有効にするため、サポートチケットを起票します。
