При репликации данных из PostgreSQL в ClickHouse важно понимать ограничения и особенности, связанные с TOAST-столбцами (The Oversized-Attribute Storage Technique). Это руководство поможет вам определить TOAST-столбцы и правильно обрабатывать их в процессе репликации.
Что такое TOAST-столбцы в PostgreSQL?
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
Определение TOAST-столбцов в таблице
Чтобы определить, есть ли в таблице TOAST-столбцы, можно использовать следующий SQL-запрос:
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 зависит от конкретного содержимого, хранящегося в этих столбцах.
Обеспечение корректной обработки TOAST-столбцов
Чтобы TOAST-столбцы корректно обрабатывались при репликации, следует установить для таблицы параметр REPLICA IDENTITY в значение FULL. Это указывает PostgreSQL включать в WAL полную предыдущую строку для операций UPDATE и DELETE, чтобы все значения столбцов (включая TOAST-столбцы) были доступны для репликации.
Установить REPLICA IDENTITY в значение FULL можно с помощью следующей SQL-команды:
ALTER TABLE your_table_name REPLICA IDENTITY FULL;
См. эту статью в блоге, где рассматриваются особенности производительности при использовании REPLICA IDENTITY FULL.
Поведение репликации, если REPLICA IDENTITY FULL не установлен
Если для таблицы с TOAST-столбцами не установлен REPLICA IDENTITY FULL, при репликации в ClickHouse могут возникнуть следующие проблемы:
-
Для операций INSERT все столбцы (включая TOAST-столбцы) будут реплицироваться корректно.
-
Для операций UPDATE:
- Если TOAST-столбец не изменяется, в ClickHouse его значение будет NULL или пустым.
- Если TOAST-столбец изменяется, он будет реплицироваться корректно.
-
Для операций DELETE значения TOAST-столбцов в ClickHouse будут NULL или пустыми.
Такое поведение может привести к расхождениям в данных между исходной базой PostgreSQL и пунктом назначения ClickHouse. Поэтому для таблиц с TOAST-столбцами крайне важно устанавливать REPLICA IDENTITY FULL, чтобы обеспечить точную и полную репликацию данных.
Корректная обработка TOAST-столбцов крайне важна для сохранения целостности данных при репликации из PostgreSQL в ClickHouse. Определив TOAST-столбцы и задав соответствующий REPLICA IDENTITY, вы сможете обеспечить точную и полную репликацию данных. Последнее изменение 10 июня 2026 г.