
Миграция MariaDB → PostgreSQL без даунтайма: почему обычные утилиты не подошли и как мы сделали это через Debezium CDC
WrongName 7 минут назад Миграция MariaDB → PostgreSQL без даунтайма: почему обычные утилиты не подошли и как мы сделали это через Debezium CDC Средний 9 мин 45 MySQL * PostgreSQL * DevOps * Кейс Перед командой, выросшей...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: WrongName 7 минут назад Миграция MariaDB → PostgreSQL без даунтайма: почему обычные утилиты не подошли и как мы сделали это через Debezium CDC Средний 9 мин 45 MySQL * PostgreSQL * DevOps * Кейс Перед командой, выросшей на MySQL/MariaDB, встаёт вопрос перехода на PostgreSQL: лицензии, экосистема расширений, более предсказуемое поведение при конкурентных нагрузках - причин достаточно. Проблема в другом: как перенести боевую базу, которая не останавливается ни на минуту, без часов простоя и без риска потерять данные, записанные во время переноса. В этой статье - как мы решали эту задачу для интернет-магазина на MariaDB, почему готовые консольные конвертеры не годятся для «живой» миграции, и как выглядит рабочая схема на Debezium + Kafka Connect, включая Ansible-роль для повторяемого запуска.
Все имена хостов, баз, топиков и учётные данные в примерах - вымышленные. Почему не подошли готовые утилитыПервая мысль при слове «миграция MySQL → PostgreSQL» - взять один из известных конвертеров и прогнать через него дамп. Мы попробовали несколько вариантов, и у всех обнаружился один и тот же фундаментальный недостаток: это утилиты одноразового переноса, а не репликации.
Технические детали
Они снимают снепшот на момент запуска и не умеют донакатывать изменения, случившиеся в источнике после начала работы. Для базы, которая не останавливается, это означает окно даунтайма на время переноса - для нас неприемлемое. Плюс к этому у каждой утилиты нашлись собственные болячки:pgloader - самый популярный вариант, но в его issue-трекере регулярно всплывают падения по памяти (heap exhaustion) на больших таблицах, ошибки парсинга (ESRAP-PARSE-ERROR), проблемы с «нулевыми» датами MySQL, конфликты имён при превышении лимита PostgreSQL в 63 символа и дублирующимися именами индексов, которые MySQL допускает неявно, а PostgreSQL - нет (пример, ещё один, и ещё).
На части наших таблиц миграция просто зависала на середине. pg_chameleon - ближе к тому, что нам было нужно (реальная репликация через чтение бинлогов), но требует binlog_format=ROW, обязательного primary key на каждой таблице, а при ошибке загрузки строки просто выбрасывает конфликтную таблицу из репликации - то есть часть данных молча перестаёт синхронизироваться, и это легко пропустить. Кроме того, направление «PostgreSQL → MySQL» у него экспериментальное и сильно ограниченное - жизнеспособна только миграция в одну сторону.
py-mysql2pgsql - по сути, заброшенный проект: релизов нет уже несколько лет, поддержка неактивна, для рабочей нагрузки не рассматривали. Ни один из этих инструментов не даёт того, что было нужно: непрерывной синхронизации источника и приёмника, чтобы можно было мигрировать данные заранее, дать таблицам «дореплицироваться» и в момент отключения приложения от MariaDB переключить его на PostgreSQL буквально с разницей в секунды. Решение: Debezium как CDC-платформаDebezium - это набор коннекторов для Kafka Connect, реализующих Change Data Capture (CDC).
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





