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

ClickPipes для PostgreSQL: Обработка столбцов TOAST

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

Что такое столбцы TOAST в PostgreSQL?

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

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

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

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

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

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

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

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