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