Перейти к основному содержанию
Перейти к основному содержанию

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

При репликации данных из 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 = 'имя_вашей_таблицы'
  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 имя_вашей_таблицы REPLICA IDENTITY FULL;

См. эту запись в блоге о нюансах производительности при использовании REPLICA IDENTITY FULL.

Поведение репликации, когда REPLICA IDENTITY FULL не задан

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

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

  2. Для операций UPDATE:

    • Если TOAST-столбец не изменён, его значение в ClickHouse будет отображаться как NULL или пустое.
    • Если TOAST-столбец изменён, он будет реплицирован корректно.
  3. Для операций DELETE значения TOAST-столбцов в ClickHouse будут отображаться как NULL или пустые.

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

Заключение

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