Data Pump Export и целостный экспорт (consistent export)
By: Date: 14.02.2012 Categories: !RUS,DataPump Export,ORACLE

Если делать экспорт схемы или всей БД с помощью 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