> ## 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.

# Обработка TOAST-столбцов

> Узнайте, как обрабатывать TOAST-столбцы при репликации данных из PostgreSQL в ClickHouse.

При репликации данных из PostgreSQL в ClickHouse важно понимать ограничения и особенности, связанные с TOAST-столбцами (The Oversized-Attribute Storage Technique). Это руководство поможет вам определить TOAST-столбцы и правильно обрабатывать их в процессе репликации.

<div id="what-are-toast-columns-in-postgresql">
  ## Что такое TOAST-столбцы в PostgreSQL?
</div>

TOAST (The Oversized-Attribute Storage Technique) — это механизм PostgreSQL для работы с большими значениями полей. Когда строка превышает максимальный размер строки (обычно 2 КБ, хотя это зависит от версии PostgreSQL и конкретных настроек), PostgreSQL автоматически перемещает большие значения полей в отдельную TOAST-таблицу, сохраняя в основной таблице только указатель.

Важно отметить, что при CDC (фиксация изменений данных) неизменённые TOAST-столбцы не включаются в поток репликации. Если это не учитывать, репликация данных может оказаться неполной.

Во время начальной загрузки (снимка) все значения столбцов, включая TOAST-столбцы, будут корректно реплицированы независимо от их размера. Ограничения, описанные в этом руководстве, в первую очередь относятся к непрерывному процессу CDC после начальной загрузки.

Подробнее о TOAST и его реализации в PostgreSQL можно прочитать здесь: [https://www.postgresql.org/docs/current/storage-toast.html](https://www.postgresql.org/docs/current/storage-toast.html)

<div id="identifying-toast-columns-in-a-table">
  ## Определение TOAST-столбцов в таблице
</div>

Чтобы определить, есть ли в таблице TOAST-столбцы, можно использовать следующий SQL-запрос:

```sql theme={null}
SELECT a.attname, pg_catalog.format_type(a.atttypid, a.atttypmod) AS data_type
FROM pg_attribute a
JOIN pg_class c ON a.attrelid = c.oid
WHERE c.relname = 'your_table_name'
  AND a.attlen = -1
  AND a.attstorage != 'p'
  AND a.attnum > 0;
```

Этот запрос вернёт имена и типы данных столбцов, которые потенциально могут храниться в TOAST. Однако важно отметить, что этот запрос лишь определяет столбцы, пригодные для хранения в TOAST на основе их типа данных и атрибутов хранения. Чтобы определить, действительно ли эти столбцы содержат данные, помещённые в TOAST, нужно учитывать, превышают ли значения в этих столбцах допустимый размер. Фактическое помещение данных в TOAST зависит от конкретного содержимого, хранящегося в этих столбцах.

<div id="ensuring-proper-handling-of-toast-columns">
  ## Обеспечение корректной обработки TOAST-столбцов
</div>

Чтобы TOAST-столбцы корректно обрабатывались при репликации, следует установить для таблицы параметр `REPLICA IDENTITY` в значение `FULL`. Это указывает PostgreSQL включать в WAL полную предыдущую строку для операций UPDATE и DELETE, чтобы все значения столбцов (включая TOAST-столбцы) были доступны для репликации.

Установить `REPLICA IDENTITY` в значение `FULL` можно с помощью следующей SQL-команды:

```sql theme={null}
ALTER TABLE your_table_name REPLICA IDENTITY FULL;
```

См. [эту статью в блоге](https://xata.io/blog/replica-identity-full-performance), где рассматриваются особенности производительности при использовании `REPLICA IDENTITY FULL`.

<div id="replication-behavior-when-replica-identity-full-is-not-set">
  ## Поведение репликации, если `REPLICA IDENTITY FULL` не установлен
</div>

Если для таблицы с TOAST-столбцами не установлен `REPLICA IDENTITY FULL`, при репликации в ClickHouse могут возникнуть следующие проблемы:

1. Для операций INSERT все столбцы (включая TOAST-столбцы) будут реплицироваться корректно.

2. Для операций UPDATE:
   * Если TOAST-столбец не изменяется, в ClickHouse его значение будет NULL или пустым.
   * Если TOAST-столбец изменяется, он будет реплицироваться корректно.

3. Для операций DELETE значения TOAST-столбцов в ClickHouse будут NULL или пустыми.

Такое поведение может привести к расхождениям в данных между исходной базой PostgreSQL и пунктом назначения ClickHouse. Поэтому для таблиц с TOAST-столбцами крайне важно устанавливать `REPLICA IDENTITY FULL`, чтобы обеспечить точную и полную репликацию данных.

<div id="conclusion">
  ## Заключение
</div>

Корректная обработка TOAST-столбцов крайне важна для сохранения целостности данных при репликации из PostgreSQL в ClickHouse. Определив TOAST-столбцы и задав соответствующий `REPLICA IDENTITY`, вы сможете обеспечить точную и полную репликацию данных.
