Обновить

Oracle → PostgreSQL без даунтайма: как мы перевозили терабайт банковской базы и где всё ломалось

Уровень сложностиСложный
Время на прочтение11 мин
Охват и читатели7.8K
Всего голосов 13: ↑13 и ↓0+18
Комментарии7

Комментарии 7

Круто! У меня вопрос как вы справлялись с FK при синхронизации через кафку? Очередность insert-ов для разных таблиц не гарантирована, теоретически запись в дочернюю таблицу прийти раньше, чем родительскую. Или у вас 1 топик на все? Тогда как соблюдался порядок при экспорте в кафку?

Скорее всего FK включили после синхронизации данных и переключения.

Порядок между таблицами через Kafka мы не гарантировали: топики по таблицам, ключ партиции — PK строки, так что гарантирован только порядок по одной строке.

Спасало то, что на фазе initial load и догона FK были выключены — включали и валидировали уже после сведения лага к нулю. Так что «дочерний INSERT раньше родительского» на этой фазе ломать было нечего (vtevdo выше угадал верно). Плюс идемпотентное применение: полный снапшот строки, INSERT через ON CONFLICT DO UPDATE, DELETE не падает на отсутствующей строке — событие «не в том порядке» всё равно сходится к правильному состоянию при переигрывании.

После переключения записи проблема снимается сама: пишет одно приложение в одну базу транзакционно. А если бы FK нужно было держать включёнными во время догона — пришлось бы гнать связанные таблицы в одну партицию по корню агрегата или буферизовать «сирот», но это дороже, и нам не понадобилось.

Boolean. Если вы мапнули NUMBER(1) в boolean (проблема 1), то весь PL/SQL с IF flag = 1 THEN перестаёт компилироваться. Это не сложно, но объёмно.

Это как раз делается вообще тривиально, даже без отлова/переписывания таких запросов. Достаточно определить оператор =(int,bool) и при необходимости симметричный <>() - проблема полностью закрыта: все такие сравнения работают с нативной скоростью, т.е. полностью аналогично записи, например, if/where (not) flag, к чему подлежащими функциями и сводятся; они и светятся в explain (и точно так же оптимизируются, соответственно, потому что это оно уже для планировщика и есть).

Из документации:

Ну и примеры добавлю

На строке null=null кидает предупреждение:

И еще момент, на данном этапе ничего не потеряли? Не исключаю отличий в версиях Oracle

Правило: Oracle DATE → PostgreSQL timestamp(0), всегда

Время в основном храните в едином часовом поясе, не UTC ?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации