Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

ClickPipes のデータソースを使用した PostgreSQL データの移行

ベータ

ClickHouse Cloud では、外部の PostgreSQL データベースを Managed Postgres サービスに移行するための ClickPipes をご利用いただけるようになりました。この組み込みインテグレーションにより、ソースデータベースへの接続、スキーマのエクスポート、Managed Postgres へのインポート、継続的なレプリケーションの設定をスムーズに行えます。

前提条件

移行前の注意事項

  • DDL の伝播: 継続的レプリケーション (CDC) は、DML 操作と ADD COLUMN を取り込みます。DROP COLUMNALTER COLUMN など、その他の DDL 変更は伝播されないため、ターゲット側で手動で適用する必要があります。

Step 1: ソースデータベースに接続する

ClickHouse Cloud console を開き、Managed Postgres サービスを選択します。

ClickHouse Cloud のサービス一覧に表示される Managed Postgres のサービスカード

左側のサイドバーで、データソース をクリックします。

Managed Postgres サービスのサイドバーにある データソース エントリ

Start import をクリックします。

Start import ボタンが表示された データソース ページ

ソース PostgreSQL データベースの接続情報 (ホスト、ポート、ユーザー名、パスワード、データベース名) を入力します。ソース側で必要な場合は、TLS を有効にします。

ソースデータベースへのプライベート接続が必要な場合は、SSH トンネリング を選択し、必要な SSH 情報を入力できます。これにより、公開されていないデータベースにも移行処理から安全に接続できます。

インジェスト方法を選択します。

  • 初期ロード + CDC — 既存データをコピーした後、継続的な変更を反映してターゲットを同期し続けます。
  • 初期ロード only — 一回限りのコピーで、継続的なレプリケーションは行いません。
  • CDC only — 初期コピーをスキップし、この時点以降の新しい変更だけをレプリケートします。
ステップ 1: インジェスト方法のオプションを含むソースデータベース接続フォーム

Next をクリックします。

自動スキーマ移行

ステップ 2: 宛先データベースセレクターを使用した自動スキーマ移行

このオプションを選択すると、ClickPipe の作成後、Setup フェーズ中にソースデータベースのスキーマが自動的に取得され、Managed Postgres サービスに適用されます。

この機能では、後でウィザードで選択するテーブルにかかわらずソースデータベース内のすべてのデータベースオブジェクトを取得するため、空の宛先データベースが前提となります。宛先データベースに既存のデータがある場合や、より細かく設定したい場合は、代わりに手動モードを選択する必要があります。

ドロップダウンから宛先データベースを選択するか、新しいデータベースを作成をクリックして作成します。

新しい Postgres データベースを作成するダイアログ

監視

ClickPipes の詳細ビューで、スキーマ移行の進行状況を確認できます。ログにはスキーマ移行のステータスが表示され、発生したエラーも表示されます。

このモードには、次の制限があります。

手動スキーマ移行

移行先データベースにすでにデータが存在する場合や、自動モードで想定されるクリーンな状態ではなく、よりカスタマイズしたセットアップを行う場合は、ここで手動モードを選択できます。

ステップ2: pg_dumpエクスポートコマンドによる手動スキーマ移行

データベーススキーマをエクスポートする

ウィザードには、ソースへの接続情報があらかじめ入力された pg_dump コマンドが表示されます。これをターミナルで実行します。

ステップ 2: スキーマのエクスポート用 `pg_dump` コマンド
pg_dump \
  -h <source_host> \
  -U <source_user> \
  -d <source_database> \
  --schema-only \
  -f pg.sql

これにより、pg.sql が現在のディレクトリに作成されます。

`pg_dump` 実行後のターミナル出力

Next をクリックします。

Managed Postgres サービスにスキーマをインポートする

ドロップダウンから宛先データベースを選択するか、新しいデータベースを作成 をクリックして新しく作成します。

ウィザードには、スキーマダンプを Managed Postgres サービスに適用するための psql コマンドが表示されます。これをターミナルで実行します。

ステップ 3: スキーマのインポート用 `psql` コマンド
psql \
  -h <target_host> \
  -p 5432 \
  -U <target_user> \
  -d <target_database> \
  -f pg.sql
`psql` によるスキーマのインポート実行後のターミナル出力

Next をクリックします。

Step 4: インジェスト設定を構成する

論理レプリケーションに使用するパブリケーションを指定します。空欄のままにすると、パブリケーションは自動的に作成されます。

スループットを調整するには、高度なレプリケーション設定を展開します。

設定 デフォルト 説明
同期間隔 (秒) 10 レプリケーションスロットをポーリングする間隔
初期ロードの並列スレッド数 4 bulk copy フェーズで使用するスレッド数
Pull バッチサイズ 100,000 レプリケーションの各バッチで取得する行数
スナップショットのパーティションあたりの行数 100000 大規模なテーブルスナップショットのパーティションサイズ
並列でスナップショットを作成するテーブル数 1 同時実行でスナップショットを作成するテーブル数
ステップ 4: パブリケーションと高度なレプリケーションオプションを含むインジェスト設定フォーム

Next をクリックします。

ステップ5: テーブルを選択

レプリケートするテーブルを選択します。テーブルはスキーマごとにグループ化されています。個別にテーブルを選択するか、スキーマを展開してその中のすべてのテーブルを選択します。

ステップ5: スキーマごとにグループ化されたテーブル選択画面。[移行を作成]ボタン付き

移行を作成 をクリックします。

移行を監視する

移行を作成すると、データソースにステータスが 実行中 として表示されます。

実行中の移行が表示されたデータソース一覧

移行をクリックすると、詳細ビューが開きます。テーブル タブには、処理済み行数、パーティション数、パーティションあたりの平均時間など、各テーブルの初期ロードの進行状況が表示されます。メトリクス タブには、CDC が開始されるとレプリケーションラグとスループットが表示されます。

テーブルごとの初期ロード統計を表示する移行詳細ビュー

移行後のタスク

初期ロードが完了し、CDC を使用している場合はレプリケーションラグがほぼゼロになったら、次の作業を行います。

行数を確認します。 トラフィックを切り替える前に、移行元と移行先の両方で重要なテーブルを抜き取りで確認してください。

SELECT COUNT(*) FROM public.orders;

移行元への書き込みを停止します。 アプリケーションからの書き込みを一時停止します。切り替え中に読み取り専用モードを強制するには:

ALTER DATABASE <source_db> SET default_transaction_read_only = on;

レプリケーションが追いついていることを確認します。 ソース側とターゲット側の最新行を比較します。

-- ソースとターゲットの両方で実行
SELECT MAX(id), MAX(updated_at) FROM public.orders;

シーケンスをリセットします。 各テーブルの現在の最大値に合わせて、シーケンスを調整します:

DO $$
DECLARE r RECORD;
BEGIN
    FOR r IN
        SELECT
            n.nspname AS schema_name,
            c.relname AS table_name,
            a.attname AS column_name,
            pg_get_serial_sequence(format('%I.%I', n.nspname, c.relname), a.attname) AS seq_name
        FROM pg_class c
        JOIN pg_namespace n ON n.oid = c.relnamespace
        JOIN pg_attribute a ON a.attrelid = c.oid
        WHERE c.relkind = 'r'
            AND a.attnum > 0
            AND NOT a.attisdropped
            AND n.nspname NOT IN ('pg_catalog', 'information_schema')
    LOOP
        IF r.seq_name IS NOT NULL THEN
            EXECUTE format(
                'SELECT setval(%L, COALESCE((SELECT MAX(%I) FROM %I.%I), 0) + 1, false)',
                r.seq_name, r.column_name, r.schema_name, r.table_name
            );
        END IF;
    END LOOP;
END $$;

アプリケーショントラフィックを切り替えます。 読み取り先と書き込み先を Managed Postgres サービスに切り替え、エラー、制約違反、レプリケーションの健全性を監視します。

クリーンアップ。 切り替え後、新しいサービスが正常に稼働していることを確認したら、データソース から移行を削除します。CDC を使用した場合は、リソースを解放するために移行元からレプリケーションスロットを削除します:

SELECT pg_drop_replication_slot('<slot_name>');

次のステップ

Navigation