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

Обработка 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-запрос:

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

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

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

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

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