Комментарии 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 DATE → PostgreSQL timestamp(0), всегда
Время в основном храните в едином часовом поясе, не UTC ?


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