Задача:
в СУБД Oracle есть две схемы, работающие на одном инстансе (RAC) — OLD_DB и NEW_DB, требуется соорудить одностороннюю репликацию из OLD_DB в NEW_DB, на время длительной миграции ~2-3 мес.
Реплика может быть realtime или с задержкой в 1-2 минуты.
Таблиц ~100, большинство повторяет друг-друга, только с заменой названий или отдельных столбцов, и порядка 6 таблиц для которых нужна серьезная трансформация, разделение одной таблицы на две (всегда или по значению одно поля) и наоборот слив 2 таблиц в одну.
Есть ли для такой задачи готовые инструменты (маппинг понятное дело самому придется делать) и насколько это сложная задача в целом?
Спасибо за ответ.
Триггеры один из рассматриваемых вариантов сейчас, но есть камни — если делать update или insert прямо из триггера, аля insert into select from — тогда oracle справедливо ругается, что таблица сейчас мутирует.
Если писать изменения в некий лог, а потом его выгребать, например джобой — проблема с выборкой записей в том порядке, в котором они пришли в лог, сиквенсы из-за RAC не гарантируют правильную последовательность, со слов админов.
Еще одна проблема с самодельным решением, особенно асинхронным, риск нарушения целостности данных из-за того, что система многопользовательская, и возможна ситуация:
юзер А запускает длинную транзакцию, которая делает пачку апдейтов/инсертов:
1 запрос…
2 запрос insert into user_picture (user_id, picture_id) values (10, 100)
3 запрос…
Одновременно юзер Б начинает короткую транзакцию delete from picture where id = 100
Соответственно в репликации будет:
delete from picture where id = 100
insert into user_picture (user_id, picture_id) values (10, 100)
и исключение на 2 запросе child not found.
P.S. я не очень хорошо знаю, как работают блокировки в oracle, может такая ситуация не возможна, или она в принципе не решаема в многопользовательской системе?