После переноса схемы с 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 шт):

Автор решения: 0xdb

Причина
Сначала экспортируется последовательность, включая текущее значение, а затем таблицы с их данными. В логе эксопрта это можно увидеть:

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.
→ Ссылка