Должно ли оно быть в точно таких же таблицах? Вы можете создать набор таблиц «моментальных снимков», куда идут все эти записи, вам понадобится только одна вставка + выбор, например
insert into snapshots_source1 (user,col1, col2, ..., colN)
select 'john', col1, col2, ..., colN from source1
и так далее.
Вы можете сделать snapshots_*
, чтобы иметь столбец IDENTITY, который создаст «новый PK» и который также может сохранить старый, если вы того пожелаете.
Это (почти) не имеет проблем с блокировкой и выглядит более разумно.
Это требует изменения кода, но не должно быть слишком сложно заставить приложение указывать на таблицу моментальных снимков, когда это уместно.
Это также облегчает вопросы очистки и обслуживания
---8<------8<------8<---outdated answer---8<---8<------8<------8<------8<---
Почему бы вам просто не создать резервную копию в реальном времени и не выполнить манипуляции с данными (смена ключа) на целевом клоне?
Теперь, вообще, этот снимок с новой идеей первичных ключей звучит подозрительно. Если вам нужна реплика, у вас есть служба доставки журналов и кластера, если вы хотите, чтобы копия данных генерировала «новый экземпляр приложения», процесса резервного копирования / восстановления / манипуляции должно быть достаточно.
Вы не говорите, сколько займет ваша БД, но вы, безусловно, можете сделать резервную копию 20 миллионов строк (800 МБ?) Примерно за 10 секунд, в зависимости от того, насколько быстро работает ваша дисковая подсистема ...