После переноса схемы с Data Pump последовательность отстаёт от импортированных данных
Пробую перенести одну схему с новым именем пользователя. То есть делаю экспорт схемы, и затем её импорт:
dbconn=system/pass@server/service
$ expdp $dbconn schemas=me \
directory=data_pump_dir dumpfile=melast.dmp logfile=expdp.log
$ impdp $dbconn remap_schema=me:me2 \
directory=data_pump_dir dumpfile=melast.dmp logfile=impdp.log
Всё хорошо, ошибок или предупреждений в логах нет. Запускаю приложение, но появляются ошибки:
insert into me2.mytab values (me2.myseq.nextval, 'me2 first row');
Error report -
ORA-00001: unique constraint (ME2.PKMYTAB) violated
И действительно, последовательность отстаёт от импортированных данных:
select max (id) maxid from me2.mytab
/
MAXID
----------
77
select sequence_name, last_number
from all_sequences where sequence_owner = 'ME2'
/
SEQUENCE_NAME LAST_NUMBER
---------------- -----------
MYSEQ 62
Как тут быть? Выше, для примера показана одна таблица, на самом деле их больше.
Ответы (1 шт):
Причина
Сначала экспортируется последовательность, включая текущее значение, а затем таблицы с их данными. В логе эксопрта это можно увидеть:
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
. . exported "ME"."MYTAB" 7.265 KB 77 rows
Это значит, что в промежутке какая-то сессия могла вставить новые записи в таблицу, но в дампе сохранено уже старое заначение последовательности.
Решение
Даже если БД не в режиме - только для чтения, можно получить консистентный дамп данных с параметром для экспорта FLASHBACK_TIME:
2.4.23 FLASHBACK_TIME
Finds the SCN that most closely matches the specified time. This SCN is used to enable the Flashback utility. The export operation is performed with data that is consistent up to this SCN.
Добавте этот параметр так:
$ expdp $dbconn schemas=me flashback_time=systimestamp \
directory=data_pump_dir dumpfile=melast.dmp logfile=expdp.log
После завершения импорта, всё будет работать:
insert into me2.mytab values (me2.myseq.nextval, 'me2 first row');
1 row inserted.