---
title: 'Слоты логической репликации PostgreSQL TimescaleDB'
sidebar_label: 'Слоты логической репликации'
sidebar_position: 21
description: 'Как создать слот репликации и настроить с помощью него логическую репликацию'
---

import Formbricks from '@theme/MDXComponents/Formbricks'
import TrashIcon from 'docs-kit/icons/trash'
import {CustomTable} from 'docs-kit/components'

# Слоты логической репликации PostgreSQL TimescaleDB

Чтобы постоянно реплицировать данные из одной базы данных в другую, вы можете [настроить логическую репликацию с помощью слота логической репликации](#configure-logical-replication).

У слотов репликации всегда должен быть потребитель. Если потребителя нет, то объем данных в слоте будет расти. Вы можете проверить, есть ли у слотов репликации потребитель с помощью [SQL-запроса](#check-consumers-of-logical-replication-slots) или [статуса слота репликации](#replication-slot-statuses).

Если вы больше не используете слот репликации, [удалите его](#delete-logical-replication-slot).

Подробнее о логической репликации в разделе [Logical Replication](https://www.postgresql.org/docs/current/logical-replication.html) документации PostgreSQL.

## Настроить логическую репликацию \{#configure-logical-replication}

1. [Создать слот логической репликации](#create-logical-replication-slot).
2. [Настроить слот логической репликации](#configure-logical-replication-using-slot)

### 1. Создать слот логической репликации \{#create-logical-replication-slot}

Мы рекомендуем создавать слоты логической репликации через панель управления или через [API облачных баз данных](/api/managed-databases/). Если вы создаете слот через клиент, подключенный к базе данных, мы не гарантируем работоспособность слота.

Максимальное количество слотов логической репликации — 26.

Создавать слоты может только пользователь с ролью `dbaas_replication` — эта роль автоматически выдается [владельцу базы данных](/managed-databases/timescaledb/manage-users.mdx#database-owner), назначить ее другим пользователям нельзя.

1. В [панели управления](https://my.selectel.ru/vpc/default/dbaas/) в верхнем меню нажмите **Продукты** и выберите **Облачные базы данных**.
2. Откройте вкладку **Активные**.
3. Откройте страницу кластера → вкладка **Базы данных**.
4. Откройте карточку базы данных.
5. В блоке **Слоты репликации** нажмите **Добавить слот репликации**.
6. Введите имя слота или оставьте имя по умолчанию.
7. Нажмите **Создать**.

### 2. Настроить логическую репликацию с помощью слота \{#configure-logical-replication-using-slot}

После создания слота нужно настроить логическую репликацию между исходной базой данных и принимающей базой данных. Принимающая база данных может находиться в облачных базах данных Selectel или во внешнем хранилище.

1. Создайте публикацию в исходной базе данных:

   ```sql
   CREATE PUBLICATION <publication_name> FOR TABLE <table_name>;
   ```

   Укажите:

   * `<publication_name>` — имя публикации;
   * `<table_name>` — имя таблицы.

2. Опционально: если требуется, добавьте дополнительные таблицы в публикацию:

   ```sql
   ALTER PUBLICATION <publication_name> ADD TABLE <extra_table_name>;
   ```

   Укажите `<extra_table_name>` — имя таблицы.

3. Создайте схему данных всех реплицируемых таблиц в принимающей базе данных и выполните дамп схемы в исходной базе данных с помощью утилиты [pg\_dump](https://www.postgresql.org/docs/current/app-pgdump.html):

   ```bash
   pg_dump \
   "host=<host> \
   port=<port> \
   dbname=<database_name> \
   user=<user_name>" \
   --schema-only \
   --no-privileges \
   --no-subscriptions \
   --no-publications \
   -Fd -f <dump_directory>
   ```

   Укажите:

   * `<host>` — IP-адрес или DNS-имя мастер-ноды кластера, где находится исходная база данных;
   * `<port>` — порт;
   * `<database_name>` — имя исходной базы данных;
   * `<user_name>` — имя владельца исходной базы данных;
   * `<dump_directory>` — директория для дампа.

4. Восстановите схему из дампа в принимающей базе данных с помощью утилиты [pg\_restore](https://www.postgresql.org/docs/current/app-pgrestore.html):

   ```bash
   pg_restore \
   -Fd -v \
   --single-transaction -s \
   --no-privileges -O \
   -h <host> \
   -U <user_name> \
   -p <port> \
   -d <database_name> \
   <dump_directory>
   ```

   Укажите:

   * `<host>` — IP-адрес или DNS-имя мастер-ноды кластера, в котором находится принимающая база данных;
   * `<user_name>` — имя пользователя принимающей базы данных;
   * `<database_name>` — имя принимающей базы данных;
   * `<port>` — порт кластера, в котором находится принимающая база данных;
   * `<dump_directory>` — директория с дампом.

5. Создайте подписку в принимающей базе данных от имени пользователя с ролью `dbaas_replication`:

   ```sql
   CREATE SUBSCRIPTION <subscription_name> CONNECTION
      'host=<host>
      port=<port>
      dbname=<database_name>
      user=<user_name>
      password=<password>
      sslmode=verify-ca'
   PUBLICATION <publication_name>
   WITH (copy_data=true, create_slot=false, enabled=true, slot_name=<logical_slot_name>);
   ```

   Укажите:

   * `<subscription_name>` — имя подписки;
   * `<host>` — IP-адрес или DNS-имя мастер-ноды кластера, в котором находится исходная база данных;
   * `<port>` — порт кластера, в котором находится исходная база данных;
   * `<user_name>` — имя пользователя исходной базы данных;
   * `<password>` — пароль пользователя;
   * `<database_name>` — имя исходной базы данных;
   * `<logical_slot_name>` — имя слота логической репликации.

6. В таблице принимающей базы данных появятся существующие данные.

   Если в таблицу исходной базы данных добавятся новые данные, они автоматически реплицируются.

7. Чтобы остановить логическую репликацию, выключите подписку, отвяжите от нее слот и удалите подписку:

   ```sql
   ALTER SUBSCRIPTION <subscription_name> DISABLE;
   ALTER SUBSCRIPTION <subscription_name> SET (slot_name=NONE);
   DROP SUBSCRIPTION <subscription_name>;
   ```

   Если вы отключите от слота все подписки, то информация будет накапливаться в слоте и занимать место на диске. Если слот не нужен, [удалите его](#delete-logical-replication-slot).

## Посмотреть статус слотов логической репликации \{#replication-slot-statuses}

1. В [панели управления](https://my.selectel.ru/vpc/default/dbaas/) в верхнем меню нажмите **Продукты** и выберите **Облачные базы данных**.
2. Откройте вкладку **Активные**.
3. Откройте страницу кластера → вкладка **Базы данных**.
4. Откройте карточку базы данных.
5. В блоке **Слоты репликации** в строке слота посмотрите статус.

   <CustomTable>
     <table>
       <tbody>
         <tr>
           <th>CREATING</th>
           <td>Слот создается</td>
         </tr>

         <tr>
           <th>ACTIVE</th>
           <td>Слот используется — у слота есть потребитель, данные передаются в принимающую базу данных</td>
         </tr>

         <tr>
           <th>UNUSED</th>
           <td>Слот не используется — у слота нет потребителя, данные не передаются в принимающую базу данных, накапливаются в слоте репликации и занимают дополнительное место на диске. Если вы больше не будете использовать слот репликации, [удалите его](#delete-logical-replication-slot).</td>
         </tr>

         <tr>
           <th>DELETING</th>
           <td>Слот удаляется</td>
         </tr>
       </tbody>
     </table>
   </CustomTable>

## Проверить потребителей слотов логической репликации с помощью SQL-запроса \{#check-consumers-of-logical-replication-slots}

Чтобы проверить, есть ли у слотов логической репликации потребители, отправьте SQL-запрос к представлению `pg_replication_slots`:

```sql
SELECT slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),restart_lsn)) AS replicationSlotLag,active
FROM pg_replication_slots;
```

Пример вывода:

```bash
slot_name        | replicationslotlag | active
-----------------+--------------------+--------
myslot1          | 129 GB             | f
myslot2          | 704 MB             | t
myslot3          | 624 MB             | t
```

Здесь:

* `slot_name` — имя слота логической репликации;
* `replicationslotlag` — размер WAL-файлов, которые не будут автоматически удаляться при контрольных точках и которые потребители слота логической репликации могут использовать;
* `active` — булево значение показывает, используется ли слот логической репликации:
  * `f` — у слота нет потребителя;
  * `t` — у слота есть потребитель.

Если у вас версия PostgreSQL 13 и выше, вы можете ограничить максимальный размер хранимых WAL-файлов с помощью параметра [`max_slot_wal_keep_size`](https://www.postgresql.org/docs/current/runtime-config-replication.html#GUC-MAX-SLOT-WAL-KEEP-SIZE). Учтите, что при использовании этого параметра журнал транзакций может быть удален раньше, чем потребитель прочитает изменения в слоте логической репликации.

## Удалить слот логической репликации \{#delete-logical-replication-slot}

Мы рекомендуем удалять слоты логической репликации через панель управления или через [API облачных баз данных](/api/managed-databases/). При удалении слота через клиент, подключенный к базе данных, слот может удалиться некорректно.

1. В [панели управления](https://my.selectel.ru/vpc/default/dbaas/) в верхнем меню нажмите **Продукты** и выберите **Облачные базы данных**.
2. Откройте вкладку **Активные**.
3. Откройте страницу кластера → вкладка **Базы данных**.
4. Откройте карточку базы данных.
5. В блоке **Слоты репликации** в строке слота нажмите <TrashIcon />.

<Formbricks />
