> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# PostgreSQL

> Страница с описанием интеграции Postgres с 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/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, включая рекомендации по моделированию данных и сопоставлению аналогичных понятий, доступно [здесь](/docs/ru/get-started/migrate/postgres/overview). Ниже описано, как настроить подключение ClickHouse к PostgreSQL.

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

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

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

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

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

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

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

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

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

<CloudNotSupportedBadge />

<ExperimentalBadge />

Движок базы данных 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>
  Дополнительные возможности, доступные в расширенных сценариях, см. в [справочной документации](/docs/ru/reference/engines/database-engines/materialized-postgresql).
</Info>
