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

# ClickHouse を PostgreSQL に接続する

> PostgreSQL を ClickHouse に接続するさまざまな方法について説明するページ

export const ExperimentalBadge = () => {
  return <div 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>
            実験的な機能です。 <u><a href="/docs/beta-and-experimental-features#experimental-features">詳細を見る。</a></u>
        </div>;
};

export const CloudNotSupportedBadge = () => {
  return <div 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 では利用できません
        </div>;
};

このページでは、PostgreSQL を ClickHouse と統合するための以下のオプションについて説明します。

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

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

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

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

<div id="1-setting-up-postgresql">
  ### 1. PostgreSQL の設定
</div>

1. `postgresql.conf` に、PostgreSQL がネットワークインターフェイスで待ち受けるよう、次の設定項目を追加します:

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

2. ClickHouse から接続するためのユーザーを作成します。ここではデモ用に、この例では superuser の全権限を付与します。

```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>

<div id="2-define-a-table-in-clickhouse">
  ### 2. ClickHouseでテーブルを定義する
</div>

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');
```

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

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

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

<div id="3-test-the-integration">
  ### 3 インテグレーションをテストする
</div>

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)
```

この例では、`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>

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

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

<div id="1-in-postgresql">
  ### 1. PostgreSQL で
</div>

1. `postgresql.conf` で、最小の listen レベル、レプリケーション用の wal level、および replication slots を設定します。

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

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

\**ClickHouse では、`wal level` が少なくとも `logical` であり、レプリケーションスロットが少なくとも `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>
```

<div id="2-in-clickhouse">
  ### 2. ClickHouse で
</div>

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 | Description           | example                                           |
| --------- | --------------------- | ------------------------------------------------- |
| 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     │
└────┴─────────┘
```

<div id="3-test-basic-replication">
  ### 3. 基本的なレプリケーションをテストする
</div>

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     │
└────┴─────────┘
```

<div id="4-summary">
  ### 4. まとめ
</div>

このインテグレーションガイドでは、テーブルを含むデータベースをレプリケートするシンプルな例を中心に説明しましたが、データベース全体をレプリケートしたり、既存のレプリケーションに新しいテーブルやスキーマを追加したりする、より高度なオプションもあります。このレプリケーションでは DDL コマンドはサポートされていませんが、構造変更が行われた際に変更を検出し、テーブルを再読み込みするようにエンジンを設定できます。

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