Если делать экспорт схемы или всей БД с помощью Data Pump Export (expdp), то по умолчанию делает не целостный экспорт (inconsistent). Т.е. если ничего специально не указывать и сделать дамп, а потом попытаться его импортировать, то есть большая вероятность что получим:
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
ORA-39083: Object type REF_CONSTRAINT failed to create with error:
ORA-02298: cannot validate (SSS.FK_XXX) - parent keys not found
Failing sql is:
ALTER TABLE "SSS"."REF_ID" ADD CONSTRAINT "FK_XXX" FOREIGN KEY ("REF_ID") REFERENCES "SSS"."SCALE" ("ID") ENABLE
В старой версии утилиты (exp) был специальный ключ consistent=Y. В новой версии (expdp) этого ключа нет и для получения целостного экспорта нужно использовать ключи FLASHBACK_SCN и FLASHBACK_TIME (оба ключа использовать одновременно нельзя, либо один либо другой).
Мне удобнее использовать ключ
flashback_time=systimestamp
Можно так же писать
flashback_time="to_timestamp('25-08-2008 14:35:00', 'dd-mm-yyyy hh24:mi:ss')"
Пример:
expdp user/pass@db dumpfile=exp.dmp logfile=exp.log directory=exp_dir full=y parallel=2 flashback_time=systimestamp
Примечание: Начиная с 11.2 появился режим наследования — т.е. можно использовать старые ключи exp и imp в том числе и consistent=Y (на самом деле oracle сам подставляет flashback_time=systimestamp). Подробнее в документации Data Pump Legacy Mode.
================================================================
На некоторых системах я получил ошибку
ORA-39001: invalid argument value
ORA-39150: bad flashback time
ORA-01841: (full) year must be between -4713 and +9999, and not be 0
Очень похоже что причина в установках NLS_DATE_FORMAT и NLS_TIMESTAMP_FORMAT (OERR: ORA 1841 «(full) year must be between -4713 and +XXXX» [ID 19165.1]). Нужно явно указывать все преобразования типов, т.е. явно определить переменные окружения и само преобразование делать с явной маской (см.далее пример батника).
И еще напоролся на
LRM-00116: syntax error at ')' following 'DD.MM.YYYY HH24:'
Оказалось что параметр нужно заключить в двойные кавычки, а сами кавычки терминировать слэшем (Datapump Export With FLASHBACK_TIME Fails With LRM-116 [ID 806839.1]).
Короче, вот батник — делает целостный экспорт на текущий момент времени.
REM Для использования EXPDP нужно предварительно создать директорию в oracle с имененем backupdir rem Имя и Пароль пользователя SYS set psys=sys set pswsys=sys rem Имя соединения с БД (tnsnames.ora) set ptns=s11 rem Путь к корневой папке резервирование rem (ЗДЕСЬ ДОЛЖНЫ БЫТЬ ПОДПАПКИ temp и backups) set ppath=e:backup rem Имя директории Oracle (должна указывать на %ppath%temp) set poradir=backupdir rem Путь к исполняемому файлу winrar.exe set prar="c:Program FilesWinRARWinRAR.exe" rem Очистка временной папки del /f /s /q %ppath%temp*.* if not %errorlevel% EQU 0 exit rem Экспорт БД в дамп (EXPDP) set NLS_TIMESTAMP_FORMAT=DD.MM.YYYY HH24:MI:SS set NLS_DATE_FORMAT=DD.MM.YYYY HH24:MI:SS expdp '%psys%/%pswsys%@%ptns% as sysdba' DUMPFILE=%ptns%_%DATE:~0,2%.dmp logfile=%ptns%_%DATE:~0,2%.log DIRECTORY=%poradir% FULL=y parallel=2 flashback_time="to_timestamp(sysdate,'DD.MM.YYYY HH24:MI:SS')" if not %errorlevel% EQU 0 exit rem Создание архива %prar% m -ep %ppath%backups%ptns%_%DATE:~0,2%.rar %ppath%temp*.* if not %errorlevel% EQU 0 exit rem Копирование созданой резервной копии на сетевой ресурс rem copy /Y %ppath%backups%ptns%_%DATE:~0,2%.rar \ХХХ.ХХХ.ХХХ.ХХХbackup rem if not %errorlevel% EQU 0 exit
Чтобы не заморачиваться с NLS параметрами, можно использовать SCN. Вот батник — делает целостный экспорт на текущий SCN (к нему еще нужен дополнительный файл getexpdpcmd.sql — положить в папку где лежит батник).
REM Для использования EXPDP нужно предварительно создать директорию oracle с имененем backupdir rem Имя и Пароль пользователя SYS set psys=sys set pswsys=sys rem Имя соединения с БД (tnsnames.ora) set ptns=s11 rem Путь к корневой папке резервирование rem (ЗДЕСЬ ДОЛЖНЫ БЫТЬ ПОДПАПКИ temp и backups) set ppath=e:backup rem Имя директории Oracle (должна указывать на %ppath%temp) set poradir=backupdir rem Путь к исполняемому файлу winrar.exe set prar="c:Program FilesWinRARWinRAR.exe" rem Очистка временной папки del /f /s /q %ppath%temp*.* if not %errorlevel% EQU 0 exit rem Получение батника для выполнения EXPDP с посленим SCN sqlplus "%psys%/%pswsys%@%ptns% as sysdba" @%ppath%getexpdpcmd.sql %ppath%tempexpdpcmd.cmd if not %errorlevel% EQU 0 exit rem Экспорт БД в дамп (EXPDP) call %ppath%tempexpdpcmd.cmd if not %errorlevel% EQU 0 exit rem Создание архива %prar% m -ep %ppath%backups%ptns%_%DATE:~0,2%.rar %ppath%temp*.* if not %errorlevel% EQU 0 exit rem Копирование созданой резервной копии на сетевой ресурс rem copy /Y %ppath%backups%ptns%_%DATE:~0,2%.rar \ХХХ.ХХХ.ХХХ.ХХХbackup rem if not %errorlevel% EQU 0 exit
getexpdpcmd.sql
set echo off set heading off set linesize 2000 spool &1 select 'expdp ''%psys%/%pswsys%@%ptns% as sysdba'' DUMPFILE=%ptns%_%DATE:~0,2%.dmp logfile=%ptns%_%DATE:~0,2%.log DIRECTORY=%poradir% SCHEMAS=reg_rt,ig parallel=2 flashback_scn='||(select current_scn from v$database) from dual; exit