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

ClickPipes для Postgres: Обработка колонок TOAST

При репликации данных из PostgreSQL в ClickHouse важно понимать ограничения и особые условия для колонок TOAST (Метод Хранения Больших Атрибутов). Это руководство поможет вам определить и правильно обработать колонки TOAST в процессе репликации.

Что такое колонки TOAST в PostgreSQL?

TOAST (Метод Хранения Больших Атрибутов) — это механизм PostgreSQL для обработки больших значений полей. Когда строка превышает максимальный размер строки (обычно 2КБ, но это может варьироваться в зависимости от версии PostgreSQL и конкретных настроек), PostgreSQL автоматически перемещает большие значения полей в отдельную таблицу TOAST, храня только указатель в главной таблице.

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

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

Вы можете прочитать больше о TOAST и его реализации в PostgreSQL здесь: https://www.postgresql.org/docs/current/storage-toast.html

Идентификация колонок TOAST в таблице

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

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

Обеспечение правильной обработки колонок TOAST

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

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

Обратитесь к этому блогу для учета производительности при установке REPLICA IDENTITY FULL.

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

Если REPLICA IDENTITY FULL не установлен для таблицы с колонками TOAST, вы можете столкнуться со следующими проблемами при репликации в 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, вы можете гарантировать, что ваши данные будут реплицированы точно и полностью.