expdp system@db02_11g version=10.0.2.4 schemas=user_01 directory=EXPBKP dumpfile=dump.dmp logfile=dump_exp.log
где:
impdp system@db02_10g directory=DP dumpfile=dump.dmp logfile=dump_imp.log remap_tablespace=TEMP0:TEMP
где:
Возникла на днях проблема. Надо перенести несколько схем с одного сервера на другой, но на исходном сервере нет места для дампа. В качестве решения выбрал импорт данных через database link средствами DataPump. Моя задача разложилась на следующие шаги:
select 'create tablespace ' || tablespace_name || ' datafile ''' || regexp_replace(file_name,'ONE','TWO') || ''' size '||bytes||decode(AUTOEXTENSIBLE,'YES',' autoextend on next '||INCREMENT_BY,'') || ' maxsize '||decode(maxbytes,34359721984,'unlimited',maxbytes)||';' from dba_data_files where tablespace_name in ( select default_tablespace ts from dba_users where username in ('SCHEMA1','SCHEMA2','SCHEMA2') union select tablespace_name ts from dba_ts_quotas where username in ('SCHEMA1','SCHEMA2','SCHEMA2') ) order by 1; /
На обоих серверах одинаковый ORACLE_HOME
и данный запрос из
D:\ORACLE\PRODUCT\10G\ORADATA\ONE
делал
D:\ORACLE\PRODUCT\10G\ORADATA\TWO
Получалось что-то в виде:
create tablespace TS1 datafile 'D:\ORACLE\PRODUCT\10G\ORADATA\TWO\TS1.DBF' size 524288000 autoextend on next 12800 maxsize 524288000;
create database link dlsrc connect to system identified by <PASSWORD> using '<SRCTNS>';
create directory ddump as 'D:\dump';
impdp system@<DSTTNS> directory=DDUMP schemas=SCHEMA1,SCHEMA2,SCHEMA2 network_link=dlsrc
При выполнение импорта от имени system, пользователей можно не создавать — они создадутся автоматически.
Как всегда, у Oracle есть ложка дёгтя в бочке мёда, а именно: при переносе таким образом данных может всплыть ошибка, приведённая ниже.
ORA-31679: Table data object "SCHEMA1"."TABLE_NAME" has long columns, and longs can not be loaded/unloaded using a network link
Это вынуждает нас не пользоваться database link? Возможно. Но я перенёс только указанную таблицу тем же DataPump, но без database link. Для этого места оказалось достаточно.
Бывает, что необходимо выяснить, какие схемы включены в дамп-файл созданный DataPump'ом. В *nix-системах это можно сделать так:
strings DUMP.DMP | grep OWNER_NAME | sed -e 's/.*<OWNER_NAME>\([^<]*\)<\/OWNER_NAME>.*/\1/g' | sort -u
результат выглядит примерно так:
SCHEMA1 MDSYS SYSTEM
На дампах большого размера возможно выполняться будет долго.
Т.к. для переноса схемы табличное пространство уже должно быть создано, формируем команды создания табличных пространств:
select 'create tablespace '|| tablespace_name|| ' datafile '''|| regexp_replace(file_name,'ONE','TWO')|| ''' size '||bytes||' autoextend on next '||increment_by||' maxsize '||maxbytes||';' from dba_data_files where tablespace_name in ( select default_tablespace ts from dba_users where username in ('SCHEMA1','SCHEMA2') union select tablespace_name ts from dba_ts_quotas where username in ('SCHEMA1','SCHEMA2')) /
regexp_replace(file_name,'ONE','TWO')
замените под свои нужны. У меня пути размещения файлов данных выглядели так:D:\ORACLE\PRODUCT\10.2.0\ORADATA\ONE\
D:\ORACLE\PRODUCT\10.2.0\ORADATA\TWO\
username in ('SCHEMA1','SCHEMA2'))
тоже поменяйте под свои схемы.Далее. На целевой системе (на той, куда переносим схемы) выполняем следующее:
create public database link dlone connect to system identified by <PASSWORD> using 'one';
create directory ddump as 'D:\dump';
impdp system@two directory=DDUMP schemas=SCHEMA1,SCHEMA2 network_link=dlone
Экспорт конкретных партиций таблицы можно выполнить следующим образом:
expdp system@db directory=DP tables=SCHEMA.TABLE_NAME:PARTITION dumpfile=dump.dmp logfile=dump_exp.log
Для выполнения экспорта с делением на несколько dump-файлов выполняется такая команда:
expdp system@db directory=DP schemas=SCHEMA1 dumpfile=schema1_%U.dmp filesize=2G logfile=schema_exp.log
В этом случае dump-файлы будут выглядеть так:
schema1_01.dmp schema1_02.dmp schema1_03.dmp ...
Импорт в этом случае должен выполняться с указанием dump-файла в том же формате:
impdp system@db01 directory=DP dumpfile=schema1_%U.dmp logfile=schema_imp.log