TOAST カラム、replication slots、publications、スキーマ変更、型マッピングなど、Postgres のレプリケーションの仕組みに関する多くの疑問は、ClickPipes for Postgres よくある質問で扱っています。そこに記載されている情報は、ClickHouse Managed Postgres の移行にも当てはまります。
レプリケーション中に「enum に対する無効な入力値」エラーが表示される
ALTER TYPE ... ADD VALUE コマンドは自動的に伝播されないため、初回のスキーマ設定後にソース側で追加された新しい enum 値があると、ターゲット側で insert が失敗します。
これを修正するには、ターゲットの Postgres で enum 型に不足している値を追加します。
your_enum_type はご使用の enum 型名に、'new_value' はエラーメッセージに表示されている不足値に置き換えてください。
レプリケーション中に一意制約またはチェック制約違反エラーが発生する
- 一意制約: 変更は、主キーごとの最新の値を書き込むバッチ
MERGE/UPSERT操作として適用されるため、特定のキーに対する操作順序が一意索引で想定される順序と一致しない場合があります。そのため、MERGEの完了後には制約が満たされていても、トランザクション内で一時的にUNIQUE制約に違反することがあります。Postgres では外部キーの場合とは異なり、一意索引のチェックを遅延できないため、チェックをトランザクションの終了時まで延期することはできません。これはデータ整合性には影響しません。行の識別は主キーによって定義され、MERGEロジックも同じ主キーに基づいているためです。 - チェック制約: ターゲットのチェック制約がソースより厳しい場合や、バッチ
MERGE中の中間状態が、最終状態では制約を満たすにもかかわらず、一時的に制約を満たさない場合があります。一意制約と同様に、MERGEは行の識別を定義する主キーに基づいているため、これはデータ整合性には影響しません。
レプリケーション中に “cannot insert a non-DEFAULT value into column” エラーが発生する
GENERATED ALWAYS AS IDENTITY として定義されている場合に発生します。logical replicationではソースから明示的な値が渡されますが、GENERATED ALWAYS カラムは DEFAULT 以外の値を受け付けないため、insertは次のエラーで失敗します。
GENERATED BY DEFAULT AS IDENTITY に変更できます。
GENERATED BY DEFAULT AS IDENTITY (または serial/bigserial カラム) は、値が指定されていない場合は自動的に値を生成しますが、GENERATED ALWAYS とは異なり、複製元から明示的に複製された値も受け入れます。
移行中に「extension is not available」エラーが発生する
pg_dump) 中に、ソーススキーマがターゲットの Managed Postgres にインストールされていない、または利用できない Postgres 拡張機能に依存している場合に発生します。次のいずれかの形で表示されます。
your_extension を、エラーメッセージに記載されている拡張機能名に置き換えます。
この問題を解決するには、次のいずれかを実行します。
- 手動スキーマダンプモードでパイプを再作成し、スキーマを調整してサポートされていない拡張機能への依存関係を削除または置換します。
- ターゲットの Managed Postgres で拡張機能を有効にするため、サポートチケットを起票します。