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

Обработка 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 = 'your_table_name'
  AND a.attlen = -1
  AND a.attstorage != 'p'
  AND a.attnum > 0;

Этот запрос вернет имена и типы данных колонок, которые потенциально могут быть TOAST'd. Однако важно отметить, что этот запрос лишь определяет колонки, которые подходят для хранения 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:

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

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

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

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

Заключение

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