Содержание

DataPump

Перенос данных с 11g на 10g.

Экспорт данных.
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.

Возникла на днях проблема. Надо перенести несколько схем с одного сервера на другой, но на исходном сервере нет места для дампа. В качестве решения выбрал импорт данных через database link средствами DataPump. Моя задача разложилась на следующие шаги:

  1. Формируем команды создания табличных пространств
    select 'create tablespace '
        || tablespace_name
        || ' datafile '''
        || regexp_replace(file_name,'ONE','TWO')
        || ''' size 500M autoextend on next 500M;'
    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'))
    /

    На обоих серверах одинаковый 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 500M autoextend on next 500M;
  2. На целевой системе :
    • выполняем команды создания табличных пространств, полученные в п.1;
    • создаём database link в исходную систему:
      create database link dlsrc connect to system identified by <PASSWORD> using '<SRCTNS>';
    • создаём oracle directory (предварительно создав в ОС соответствующий каталог):
      create directory ddump as 'D:\dump';
  3. Ну, и импортируем схемы, используя database link:
    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

На дампах большого размера возможно выполняться будет долго.

Перенос схем через database link.

Т.к. для переноса схемы табличное пространство уже должно быть создано, формируем команды создания табличных пространств:

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'))
/

Далее. На целевой системе (на той, куда переносим схемы) выполняем следующее:

Экспорт partitions.

Экспорт конкретных партиций таблицы можно выполнить следующим образом:

expdp system@db directory=DP tables=SCHEMA.TABLE_NAME:PARTITION dumpfile=dump.dmp logfile=dump_exp.log

Экспорт с делением на несколько dump-файлов.

Для выполнения экспорта с делением на несколько 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