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

# PostgreSQL

> Postgres と ClickHouse の統合方法を説明するページ

export const ExperimentalBadge = () => {
  return <a href="https://clickhouse.com/docs/reference/settings/beta-and-experimental-features#experimental-features" className="experimentalBadge">
            <div className="experimentalIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.25" d="M5.5 2H10.5" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M9.50015 2V6.19625L13.4283 12.7425C13.4738 12.8183 13.4985 12.9049 13.4996 12.9934C13.5008 13.0818 13.4785 13.169 13.435 13.246C13.3914 13.323 13.3283 13.3871 13.2519 13.4317C13.1755 13.4764 13.0886 13.4999 13.0002 13.5H3.00015C2.91164 13.5 2.8247 13.4766 2.74822 13.432C2.67174 13.3874 2.60847 13.3233 2.56487 13.2463C2.52126 13.1693 2.49889 13.082 2.50004 12.9935C2.50119 12.905 2.52582 12.8184 2.5714 12.7425L6.50015 6.19625V2" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M4.47656 9.56754C5.30344 9.41254 6.47656 9.47942 7.99969 10.25C10.0153 11.2707 11.4216 11.0569 12.2184 10.7282" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>
        </div>
            実験的な機能
        </a>;
};

export const CloudNotSupportedBadge = () => {
  return <a href="https://clickhouse.com/docs/products/cloud/guides/cloud-compatibility#list-of-unsupported-features" className="cloudNotSupportedBadge">
            <div className="cloudNotSupportedIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.5" d="M6.33366 12.6666L12.3739 12.6667C13.6593 12.6667 14.7073 11.6187 14.7073 10.3334C14.7073 9.04804 13.6593 8.00003 12.3739 8.00003C12.3739 8.00003 12.3337 7.66659 12.0003 7.33325M10.667 5.33322C8.00033 2.33325 4.45395 4.78537 4.14195 6.68203C2.55728 6.7627 1.29395 8.06203 1.29395 9.6667C1.29395 11.3234 2.66699 12.6666 4.00033 12.6666" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.5" d="M2.66699 14L12.0003 4.66663" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>

        </div>
            ClickHouse Cloud ではサポートされていません
        </a>;
};

> データモデリングや対応する概念に関するアドバイスを含む、PostgreSQL から ClickHouse への完全な移行ガイドは、[こちら](/ja/get-started/migrate/postgres/overview)を参照してください。以下では、ClickHouse と PostgreSQL を接続する方法について説明します。

このページでは、PostgreSQL を ClickHouse と統合するための次の方法について説明します。

* PostgreSQL のテーブルから読み取るために `PostgreSQL` テーブルエンジンを使用する
* PostgreSQL 内のデータベースを ClickHouse 内のデータベースと同期するために、実験的な `MaterializedPostgreSQL` データベースエンジンを使用する

<Tip>
  [ClickHouse Managed Postgres](/ja/products/managed-postgres/overview) サービスもぜひご覧ください。コンピュートと物理的に同じ場所に配置された NVMe ストレージを基盤としており、EBS のようなネットワーク接続型ストレージを使用する代替手段と比べて、ディスク I/O がボトルネックとなるワークロードで最大 10 倍のパフォーマンスを実現します。また、ClickPipes の Postgres CDC (変更データキャプチャ) コネクタを使用して、Postgres のデータを ClickHouse にレプリケートできます。
</Tip>

<div id="using-the-postgresql-table-engine">
  ## PostgreSQL テーブルエンジン を使う
</div>

`PostgreSQL` テーブルエンジンを使用すると、ClickHouse からリモートの PostgreSQL サーバーに保存されているデータに対して **SELECT** および **INSERT** 操作を実行できます。
この記事では、1 つのテーブルを使った基本的なインテグレーション方法を紹介します。

<Steps>
  <Step title="PostgreSQL の設定" id="1-setting-up-postgresql">
    1. PostgreSQL がネットワークインターフェイスで待ち受けるよう、`postgresql.conf` に次のエントリを追加します:

    ```text theme={null}
    listen_addresses = '*'
    ```

    2. ClickHouse から接続するためのユーザーを作成します。説明用として、この例ではスーパーユーザー権限をすべて付与します。

    ```sql theme={null}
    CREATE ROLE clickhouse_user SUPERUSER LOGIN PASSWORD 'ClickHouse_123';
    ```

    3. PostgreSQL で新しいデータベースを作成します:

    ```sql theme={null}
    CREATE DATABASE db_in_psg;
    ```

    4. 新しいテーブルを作成します:

    ```sql theme={null}
    CREATE TABLE table1 (
        id         integer primary key,
        column1    varchar(10)
    );
    ```

    5. テスト用に数行追加しましょう:

    ```sql theme={null}
    INSERT INTO table1
      (id, column1)
    VALUES
      (1, 'abc'),
      (2, 'def');
    ```

    6. レプリケーションのために、新しいユーザーによる新しいデータベースへの接続を許可するよう PostgreSQL を設定するには、次のエントリを `pg_hba.conf` ファイルに追加します。アドレス行は、PostgreSQL サーバーのサブネットまたは IP アドレスに合わせて更新してください。

    ```text theme={null}
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    host    db_in_psg             clickhouse_user 192.168.1.0/24          password
    ```

    7. `pg_hba.conf` の設定を再読み込みします (このコマンドは、使用しているバージョンに応じて調整してください) :

    ```text theme={null}
    /usr/pgsql-12/bin/pg_ctl reload
    ```

    8. 新しい `clickhouse_user` でログインできることを確認します:

    ```text theme={null}
    psql -U clickhouse_user -W -d db_in_psg -h <your_postgresql_host>
    ```

    <Note>
      この機能を ClickHouse Cloud で使用する場合は、ClickHouse Cloud の IP アドレスから PostgreSQL インスタンスへアクセスできるよう許可が必要になることがあります。
      外向きトラフィックの詳細については、ClickHouse の [Cloud Endpoints API](/ja/products/cloud/guides/sql-console/query-endpoints) を確認してください。
    </Note>
  </Step>

  <Step title="ClickHouse でテーブルを定義する" id="2-define-a-table-in-clickhouse">
    1. `clickhouse-client` にログインします:

    ```bash theme={null}
    clickhouse-client --user default --password ClickHouse123!
    ```

    2. 新しいデータベースを作成します:

    ```sql theme={null}
    CREATE DATABASE db_in_ch;
    ```

    3. `PostgreSQL` を使用するテーブルを作成します:

    ```sql theme={null}
    CREATE TABLE db_in_ch.table1
    (
        id UInt64,
        column1 String
    )
    ENGINE = PostgreSQL('postgres-host.domain.com:5432', 'db_in_psg', 'table1', 'clickhouse_user', 'ClickHouse_123');
    ```

    必要な最小限のパラメータは次のとおりです:

    | パラメータ     | 説明                        | 例                             |
    | --------- | ------------------------- | ----------------------------- |
    | host:port | ホスト名または IP アドレスとポート       | postgres-host.domain.com:5432 |
    | database  | PostgreSQL データベース名        | db\_in\_psg                   |
    | user      | PostgreSQL への接続に使用するユーザー名 | clickhouse\_user              |
    | password  | PostgreSQL への接続に使用するパスワード | ClickHouse\_123               |

    <Note>
      パラメータの完全な一覧については、[PostgreSQL table engine](/ja/reference/engines/table-engines/integrations/postgresql) のドキュメントを参照してください。
    </Note>
  </Step>

  <Step title="インテグレーションをテストする" id="3-test-the-integration">
    1. ClickHouse で最初の行を表示します:

    ```sql theme={null}
    SELECT * FROM db_in_ch.table1
    ```

    ClickHouse テーブルには、PostgreSQL のテーブルにすでに存在していた2行が自動的に取り込まれます:

    ```response theme={null}
    Query id: 34193d31-fe21-44ac-a182-36aaefbd78bf

    ┌─id─┬─column1─┐
    │  1 │ abc     │
    │  2 │ def     │
    └────┴─────────┘
    ```

    2. PostgreSQL に戻り、テーブルに数行を追加します:

    ```sql theme={null}
    INSERT INTO table1
      (id, column1)
    VALUES
      (3, 'ghi'),
      (4, 'jkl');
    ```

    4. 新しい 2 行が ClickHouse テーブルに表示されるはずです:

    ```sql theme={null}
    SELECT * FROM db_in_ch.table1
    ```

    応答は次のようになります:

    ```response theme={null}
    Query id: 86fa2c62-d320-4e47-b564-47ebf3d5d27b

    ┌─id─┬─column1─┐
    │  1 │ abc     │
    │  2 │ def     │
    │  3 │ ghi     │
    │  4 │ jkl     │
    └────┴─────────┘
    ```

    5. ClickHouse テーブルに行を追加するとどうなるか見てみましょう:

    ```sql theme={null}
    INSERT INTO db_in_ch.table1
      (id, column1)
    VALUES
      (5, 'mno'),
      (6, 'pqr');
    ```

    6. ClickHouse で追加した行が PostgreSQL のテーブルに表示されます:

    ```sql theme={null}
    db_in_psg=# SELECT * FROM table1;
    id | column1
    ----+---------
      1 | abc
      2 | def
      3 | ghi
      4 | jkl
      5 | mno
      6 | pqr
    (6 rows)
    ```
  </Step>
</Steps>

この例では、`PostrgeSQL` テーブルエンジン を使用した、PostgreSQL と ClickHouse の基本的なインテグレーションを紹介しました。
スキーマの指定、一部のカラムのみを返す設定、複数のレプリカへの接続など、さらに多くの機能については、[PostgreSQL テーブルエンジン のドキュメントページ](/ja/reference/engines/table-engines/integrations/postgresql)をご覧ください。あわせて、ブログ記事 [ClickHouse and PostgreSQL - a match made in data heaven - part 1](https://clickhouse.com/blog/migrating-data-between-clickhouse-postgres) もご覧ください。

<div id="using-the-materializedpostgresql-database-engine">
  ## MaterializedPostgreSQL データベースエンジンを使用する
</div>

<CloudNotSupportedBadge />

<ExperimentalBadge />

PostgreSQL データベースエンジンは、PostgreSQL のレプリケーション機能を使用して、データベース全体、またはその一部のスキーマやテーブルを含むデータベースのレプリカを作成します。
この記事では、1 つのデータベース、1 つのスキーマ、1 つのテーブルを使った基本的なインテグレーション方法を説明します。

***以下の手順では、PostgreSQL CLI (psql) と ClickHouse CLI (clickhouse-client) を使用します。PostgreSQL サーバーは Linux にインストールされています。以下は、PostgreSQL データベースが新規のテストインストールである場合の最小構成です。***

<Steps>
  <Step title="PostgreSQL で" id="1-in-postgresql">
    1. `postgresql.conf` で、最小の listen レベル、レプリケーション用の WAL レベル、およびレプリケーションスロットを設定します。

    次のエントリを追加します。

    ```text theme={null}
    listen_addresses = '*'
    max_replication_slots = 10
    wal_level = logical
    ```

    \**ClickHouse には、最低でも `logical` の WAL レベルと、`2` つ以上のレプリケーションスロットが必要です*

    2. 管理者アカウントを使用して、ClickHouse から接続するためのユーザーを作成します:

    ```sql theme={null}
    CREATE ROLE clickhouse_user SUPERUSER LOGIN PASSWORD 'ClickHouse_123';
    ```

    \**説明のため、完全なスーパーユーザー権限を付与しています。*

    3. 新しいデータベースを作成します:

    ```sql theme={null}
    CREATE DATABASE db1;
    ```

    4. `psql` で新しいデータベースに接続します：

    ```text theme={null}
    \connect db1
    ```

    5. 新しいテーブルを作成します:

    ```sql theme={null}
    CREATE TABLE table1 (
        id         integer primary key,
        column1    varchar(10)
    );
    ```

    6. 初期データを追加します:

    ```sql theme={null}
    INSERT INTO table1
    (id, column1)
    VALUES
    (1, 'abc'),
    (2, 'def');
    ```

    7. レプリケーション用の新しいユーザーによる新しいデータベースへの接続を許可するように、PostgreSQL を設定します。以下は、`pg_hba.conf` ファイルに追加する最小限のエントリです。

    ```text theme={null}
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    host    db1             clickhouse_user 192.168.1.0/24          password
    ```

    \**説明用の例として、ここでは平文パスワードによる認証方式を使用しています。PostgreSQL のドキュメントに従って、address 行はサブネットまたはサーバーのアドレスに更新してください*

    8. 次のように `pg_hba.conf` の設定を再読み込みします (お使いのバージョンに応じて調整してください) :

    ```text theme={null}
    /usr/pgsql-12/bin/pg_ctl reload
    ```

    9. 新しい`clickhouse_user`でログインを確認します:

    ```text theme={null}
     psql -U clickhouse_user -W -d db1 -h <your_postgresql_host>
    ```
  </Step>

  <Step title="ClickHouse で" id="2-in-clickhouse">
    1. ClickHouse CLI にログインします

    ```bash theme={null}
    clickhouse-client --user default --password ClickHouse123!
    ```

    2. データベースエンジン向けの PostgreSQL 実験的機能を有効にします:

    ```sql theme={null}
    SET allow_experimental_database_materialized_postgresql=1
    ```

    3. レプリケートする新しいデータベースを作成し、初期テーブルを定義します:

    ```sql theme={null}
    CREATE DATABASE db1_postgres
    ENGINE = MaterializedPostgreSQL('postgres-host.domain.com:5432', 'db1', 'clickhouse_user', 'ClickHouse_123')
    SETTINGS materialized_postgresql_tables_list = 'table1';
    ```

    最小オプション:

    | parameter | 説明                        | 例                                                 |
    | --------- | ------------------------- | ------------------------------------------------- |
    | host:port | ホスト名または IP アドレスとポート       | postgres-host.domain.com:5432                     |
    | database  | PostgreSQL データベース名        | db1                                               |
    | user      | PostgreSQL への接続に使用するユーザー名 | clickhouse\_user                                  |
    | password  | PostgreSQL への接続に使用するパスワード | ClickHouse\_123                                   |
    | settings  | エンジンの追加設定                 | materialized\_postgresql\_tables\_list = 'table1' |

    <Info>
      PostgreSQL データベースエンジンの完全なガイドについては、[https://clickhouse.com/docs/engines/database-engines/materialized-postgresql/#settings](https://clickhouse.com/docs/engines/database-engines/materialized-postgresql/#settings) を参照してください
    </Info>

    4. 初期テーブルにデータがあることを確認します:

    ```sql theme={null}
    ch_env_2 :) select * from db1_postgres.table1;

    SELECT *
    FROM db1_postgres.table1
    ```

    ```response theme={null}
    Query id: df2381ac-4e30-4535-b22e-8be3894aaafc

    ┌─id─┬─column1─┐
    │  1 │ abc     │
    └────┴─────────┘
    ┌─id─┬─column1─┐
    │  2 │ def     │
    └────┴─────────┘
    ```
  </Step>

  <Step title="基本的なレプリケーションをテストする" id="3-test-basic-replication">
    1. PostgreSQL で、新しい行を追加します:

    ```sql theme={null}
    INSERT INTO table1
    (id, column1)
    VALUES
    (3, 'ghi'),
    (4, 'jkl');
    ```

    2. ClickHouse で、新しい行が表示されていることを確認します:

    ```sql theme={null}
    ch_env_2 :) select * from db1_postgres.table1;

    SELECT *
    FROM db1_postgres.table1
    ```

    ```response theme={null}
    Query id: b0729816-3917-44d3-8d1a-fed912fb59ce

    ┌─id─┬─column1─┐
    │  1 │ abc     │
    └────┴─────────┘
    ┌─id─┬─column1─┐
    │  4 │ jkl     │
    └────┴─────────┘
    ┌─id─┬─column1─┐
    │  3 │ ghi     │
    └────┴─────────┘
    ┌─id─┬─column1─┐
    │  2 │ def     │
    └────┴─────────┘
    ```
  </Step>

  <Step title="まとめ" id="4-summary">
    このインテグレーションガイドでは、テーブルを含むデータベースをレプリケートする簡単な例を紹介しましたが、データベース全体をレプリケートしたり、既存のレプリケーションに新しいテーブルやスキーマを追加したりする、より高度なオプションもあります。このレプリケーションでは DDL コマンドはサポートされていませんが、構造変更を検出してテーブルを再読み込みするようにエンジンを設定できます。

    <Info>
      高度なオプションで利用できるその他の機能については、[リファレンスドキュメント](/ja/reference/engines/database-engines/materialized-postgresql)を参照してください。
    </Info>
  </Step>
</Steps>
