Сверка таблиц в PostgreSQL, или О том, нужны ли для этого специальные утилиты
danolivo 1 час назад Объяснить с Сверка таблиц в PostgreSQL, или О том, нужны ли для этого специальные утилиты Средний 10 мин 1.2K Блог компании Тантор Лабс PostgreSQL * Распределённые системы * Базы данных *...
Will Anthropic have the best AI model at the end of October 2026?
Значимый прорыв формирует отрасль ИИ: danolivo 1 час назад Объяснить с Сверка таблиц в PostgreSQL, или О том, нужны ли для этого специальные утилиты Средний 10 мин 1. 2K Блог компании Тантор Лабс PostgreSQL * Распределённые системы * Базы данных * Высоконагруженные системы * Аналитика Лет десять назад я делал инструмент сверки таблиц для мультимастера. И делал это крайне неэффективным способом: брал снапшот и под ним просто шёл по таблице сверяя строки.
Для того времени и размеров баз данных это было ОК. Однако с тех пор задача видоизменилась и стала только актуальнее: логическая репликация PostgreSQL развивается, одни и те же данные всё чаще живут в разных дата-центрах, на разных инстансах с надёжным failover’ом, и рано или поздно приходится задумываться о проверке их идентичности. Готовые инструменты для сравнения таблиц в мире Postgres есть — pg_comparator, pgCompare, ACE, и т.
Технические детали
Однако давайте сегодня поразмышляем, стоит ли ради большей эффективности городить огород с дополнительным софтом. Может быть, хватит простого golang-скрипта, выполняющего SQL на обоих инстансах? В статье Fabien Coelho, DBKDA’2011 необходимость такой технологии обосновывается нагрузкой на сеть: при простом сравнении по сети уходит двойной объём данных.
Это, в общем-то, верно. Однако при современных скоростях сети ещё большой вопрос, что обходится дороже: передать данные или нагрузить процессор сериализацией, вычислением хэш-сумм (типовая техника инструментов сравнения) и спиллингом на диск. Соберём методикуИтак, наша задача — сравнить две таблицы на разных серверах.
Ограничимся простым и понятным (с точки зрения реляционной теории) кейсом: у обеих таблиц одинаковый primary key. Тогда простейший алгоритм сравнения — потоковое слияние строк из двух источников, а сортировку обеспечивает сам primary key. Первая задача — выставить одинаковые настройки сессий, чтобы обе стороны одинаково представляли данные.
Отраслевые последствия
Для корректной сериализации строк на обеих сторонах должны совпадать TimeZone, DateStyle, IntervalStyle, bytea_output, extra_float_digits, quote_all_identifiers, client_encoding и, на всякий пожарный, search_path. Распараллелить работу проще всего по гистограмме одной из таблиц, которую назовём опорной. Каждая сессия получает свой диапазон по границам бина, стартует с его начала и выполняет слияние полностью независимо от остальных.
Поскольку даже свежая гистограмма не знает точных минимума и максимума, то границы диапазонов нужно держать открытыми: у первого бина левая граница, а у последнего — правая. Само собой, все параллельные сессии должны видеть одни и те же данные, для чего есть инструменты экспорта/импорта снапшота. Порядок колонок в реляционной СУБД не гарантирован, поэтому перед сравнением нужно составить точный список колонок и их типов для каждой таблицы.
Более того, логическая репликация Postgres позволяет ограничить реплицируемые атрибуты, ввести фильтр строк и даже реплицировать в другой (но совместимый) тип: например, timestamp в timestamptz.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.



