Обработка 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:
-
Для операций INSERT все колонки (включая TOAST-колонки) будут реплицированы корректно.
-
Для операций UPDATE:
- Если TOAST-колонка не изменяется, ее значение будет отображаться как NULL или пустое в ClickHouse.
- Если TOAST-колонка изменяется, она будет реплицирована корректно.
-
Для операций DELETE значения TOAST-колонок будут отображаться как NULL или пустые в ClickHouse.
Эти поведения могут привести к несоответствиям данных между источником PostgreSQL и местом назначения ClickHouse. Поэтому крайне важно установить REPLICA IDENTITY FULL
для таблиц с TOAST-колонками, чтобы гарантировать точную и полную репликацию данных.
Заключение
Правильная обработка TOAST-колонок имеет решающее значение для поддержания целостности данных при репликации из PostgreSQL в ClickHouse. Идентифицируя TOAST-колонки и устанавливая соответствующий REPLICA IDENTITY
, вы можете гарантировать, что ваши данные реплицируются точно и полностью.