Datapump in RAC

При импорте или экспорте данных в среде RAC возникает проблема расположения файлов дампов. Они должны быть "видны" всем узлам кластера. Есть конечно возможность положить dmp-файлы на локальный диск одного узла, и далее установить некластерный режим работы Datapump: параметр CLUSTER=N утилит expdp и impdp, либо через параметр SERVICE_NAME=<имя сервиса>.
Где "имя сервиса" - сервис жестко "привязанный" только к одной ноде.

Но если файлы дампов для импорта занимают около 1Тб (уже сжаты с помощью Advanced Compression), и на локальных дисках мало свободного пространства?
Да и объем данных большой, и хотелось бы для импорта использовать все узлы кластера.
В случае Exadata Database Machine именно так и происходит ...

Но у нас есть возможность хранить dmp-файлы DataPump прямо на ASM !
Осталось только перед импортом скопировать dmp-файлы в отдельный каталог на дисковой группе ASM.

Сказано - сделано.
1. Создаем шаблон на ASM для хранения dmp-файлов (отключаем зеркалирование - для экономии места и располагаем файлы на внутренних дорожках диска):

ALTER DISKGROUP FRA ADD TEMPLATE my_dpdump_template ATTRIBUTES (UNPROTECTED COLD FINE); 

2. Создаем каталог на ASM для хранения dmp-файлов:
ALTER DISKGROUP FRA ADD DIRECTORY '+FRA/orcl/dpdump';

3. Создаем каталог (объект directory) в БД:
 CREATE OR REPLACE DIRECTORY MY_DUMP_DIR as '+FRA(my_dpdump_template)/orcl/dpdump';
обратите внимание, что для файлов каталога используется созданный на 1-ом шаге шаблон.

4. Теперь можно скопировать в этот каталог файл с помощью утилиты asmcmd (/u01/dump - это промежуточный каталог на локальном диске узла):
ASMCMD> cd +FRA/orcl/dpdump
ASMCMD> cp /u01/dump/appfull01.dmp ./
copying /u01/dump/appfull01.dmp -> +FRA/orcl/dpdump/appfull01.dmp
ASMCMD> ls -l
Type Redund Striped Time Sys Name
N appfull01.dmp => +FRA/ASM/DUMPSET/appfull01.dmp.260.747620627

как видите реально в каталоге dpdump присутствует ссылка на файл +FRA/ASM/DUMPSET.
Все правильно, но почему в каталоге ASM, а не orcl ?
Утилита asmcmd работает от имени экземпляра ASM и не знает к какому экземпляру относится ваш файл !
И так просто переложить его в правильное место (+FRA/orcl/dumpset) не получится ...

Выход простой: для копирования dmp-файлов нужно использовать пакет dbms_file_transfer:
create or replace directory MY_SRC_DIR  as '/u01/dump';
begin
dbms_file_transfer.copy_file(source_directory_object => 'MY_SRC_DIR',
source_file_name => 'appfull01.dmp',
destination_directory_object => 'MY_DUMP_DIR',
destination_file_name => 'appfull01.dmp');
end;
/

Теперь все нормально:

ASMCMD> cd +FRA/orcl/dpdump
ASMCMD> ls -l
Type Redund Striped Time Sys Name
N appfull01.dmp => +FRA/ORCL/DUMPSET/COPY_FILE_0_0.260.747621645
ASMCMD>

Обратите внимание что системное имя файла на ASM теперь имеет другой "говорящий" вид.

Дальше осталось автоматизировать этот процесс для всех файлов dumpset-а, то есть написать скрипт для правильного копирования всех файлов дампа...

На фотографии запечатлен процесс импорта данных на Exadata X2-8 в центре тестирования в г.Линлитгоу, Шотландия (Linlithgow, Scotland), зеленые лампочки ячеек хранения очень красиво переливаются. :-)

После завершения импорта и построения индексов - БД заняла на дисках ~10Тб, и началось тестирование. Но это уже другая история ...

5 комментариев:

  1. Всегда любил Оракл за интуитивно понятные и логичные пути решения задач!

    ОтветитьУдалить
  2. Анонимный5/4/11 10:41 AM

    правильно ли я понимаю, что в версии oracle ниже 11-й данный механизм не работает?

    ОтветитьУдалить
  3. Какой механизм Вы имеете в виду: хранение dmp-файлов на ASM ?

    Эта возможность была еще в 10g - по крайней мере в 10.2

    ОтветитьУдалить
  4. Анонимный6/4/11 10:44 AM

    я имею ввиду такие команды как cp в утилите asmcmd, их вроде бы в 10-ке еще не было

    ОтветитьУдалить
  5. Да - возможность прямого копирования локальных файлов в/из ASM с помощью утилиты asmcmd появилась только в 11g.

    ОтветитьУдалить