DataPump

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

Экспорт данных
expdp system@db02_11g version=10.0.2.4 schemas=user_01 directory=EXPBKP dumpfile=dump.dmp logfile=dump_exp.log

где:

  • schemas - список экспортируемых схем, разделённых запятой;
  • directory - Oracle-директория, в которой нужно создать файл экспорта;
  • dumpfile - имя файла экспорта;
  • logfile - имя файла-журнала;
  • version - версия базы данных, в которую будет осуществлён перенос данных.
Импорт данных
impdp system@db02_10g directory=DP dumpfile=dump.dmp logfile=dump_imp.log remap_tablespace=TEMP0:TEMP

где:

  • directory - Oracle-директория, в которой нужно искать файл для импорта;
  • dumpfile - имя файла для импорта;
  • logfile - имя файла-журнала;
  • remap_tablespace - переназначение табличного пространства, может быть перечислено несколько табличных пространств по принципу OLD_TS:NEW_TS,OLD_TS1:NEW_TS1.

Импорт данных через 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

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

 
Rambler's Top100 бесплатная музыка mp3
Recent changes RSS feed Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki Donate