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

# Подключение ClickHouse к PostgreSQL

> Страница с описанием различных способов подключения ClickHouse к PostgreSQL

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>
            Experimental feature. <u><a href="/docs/beta-and-experimental-features#experimental-features">Learn more.</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>
            Not supported in ClickHouse Cloud
        </div>;
};

На этой странице рассматриваются следующие варианты интеграции PostgreSQL с ClickHouse:

* использование движка таблицы `PostgreSQL` для чтения данных из таблицы PostgreSQL
* использование экспериментального движка базы данных `MaterializedPostgreSQL` для синхронизации базы данных PostgreSQL с базой данных в ClickHouse

<Tip>
  Ознакомьтесь с нашим сервисом [Managed Postgres](/ru/products/managed-postgres/overview). Благодаря NVMe-хранилищу, физически расположенному рядом с вычислительными ресурсами, он обеспечивает производительность до 10 раз выше для рабочих нагрузок, упирающихся в производительность диска, по сравнению с альтернативами на сетевом хранилище, такими как EBS, а также позволяет реплицировать данные из Postgres в ClickHouse с помощью коннектора Postgres CDC в ClickPipes.
</Tip>

<div id="using-the-postgresql-table-engine">
  ## Использование движка таблицы PostgreSQL
</div>

Движок таблицы `PostgreSQL` позволяет выполнять из ClickHouse операции **SELECT** и **INSERT** с данными, хранящимися на удалённом сервере PostgreSQL.
В этой статье на примере одной таблицы показаны базовые способы интеграции.

<div id="1-setting-up-postgresql">
  ### 1. Настройка PostgreSQL
</div>

1. В `postgresql.conf` добавьте следующую запись, чтобы PostgreSQL прослушивал сетевые интерфейсы:

```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`. В строке адреса укажите подсеть или IP-адрес вашего сервера PostgreSQL:

```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, вам может потребоваться разрешить IP-адресам ClickHouse Cloud доступ к вашему экземпляру PostgreSQL.
  Сведения об исходящем трафике см. в ClickHouse [Cloud Endpoints API](/ru/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');
```

Минимально необходимые параметры:

| параметр  | Описание                                      | пример                        |
| --------- | --------------------------------------------- | ----------------------------- |
| host:port | имя хоста или IP-адрес и порт                 | postgres-host.domain.com:5432 |
| database  | имя базы данных PostgreSQL                    | db\_in\_psg                   |
| user      | имя пользователя для подключения к PostgreSQL | clickhouse\_user              |
| password  | пароль для подключения к PostgreSQL           | ClickHouse\_123               |

<Note>
  Полный список параметров см. на странице документации [движка таблицы PostgreSQL](/ru/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:

```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. Эти две новые строки должны появиться в таблице 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)
```

В этом примере показана базовая интеграция между PostgreSQL и ClickHouse с использованием движка таблицы `PostrgeSQL`.
Дополнительные возможности, такие как указание схем, выборка только части столбцов и подключение к нескольким репликам, описаны на [странице документации о движке таблицы PostgreSQL](/ru/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 для создания реплики базы данных со всеми схемами и таблицами или их подмножеством.
В этой статье показаны базовые способы интеграции на примере одной базы данных, одной схемы и одной таблицы.

***В следующих процедурах используются PostgreSQL CLI (`psql`) и ClickHouse CLI (`clickhouse-client`). Сервер PostgreSQL установлен на Linux. Ниже приведены минимальные настройки, если PostgreSQL используется в новой тестовой установке***

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

1. В `postgresql.conf` задайте минимальные уровни прослушивания, уровень WAL для репликации и слоты репликации:

добавьте следующие параметры:

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

\**Для ClickHouse требуется уровень wal не ниже `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
```

\**в демонстрационных целях здесь используется метод аутентификации с паролем в открытом виде. обновите строку address, указав либо подсеть, либо адрес сервера в соответствии с документацией PostgreSQL*

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

минимальные параметры:

| параметр  | описание                                    | пример                                            |
| --------- | ------------------------------------------- | ------------------------------------------------- |
| host:port | имя хоста или IP-адрес и порт               | postgres-host.domain.com:5432                     |
| database  | имя базы данных PostgreSQL                  | db1                                               |
| user      | имя пользователя для подключения к Postgres | clickhouse\_user                                  |
| password  | пароль для подключения к Postgres           | 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>
  Дополнительные возможности расширенной настройки описаны в [справочной документации](/ru/reference/engines/database-engines/materialized-postgresql).
</Info>
