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Тб, и началось тестирование. Но это уже другая история ...
Всегда любил Оракл за интуитивно понятные и логичные пути решения задач!
ОтветитьУдалитьправильно ли я понимаю, что в версии oracle ниже 11-й данный механизм не работает?
ОтветитьУдалитьКакой механизм Вы имеете в виду: хранение dmp-файлов на ASM ?
ОтветитьУдалитьЭта возможность была еще в 10g - по крайней мере в 10.2
я имею ввиду такие команды как cp в утилите asmcmd, их вроде бы в 10-ке еще не было
ОтветитьУдалитьДа - возможность прямого копирования локальных файлов в/из ASM с помощью утилиты asmcmd появилась только в 11g.
ОтветитьУдалить