OCP  
line decor
  Начало  ::  
line decor
   
 
Transport tablespace и dbms_file_transfer Април 2008

Засърбяха ме ръцете да подкарам Transportable tablespace, защото никога не съм го правил, а това е нещо полезно.  Като цяло идеята е да се пренесе много бързо голямо количество информация от една БД на друга. Необходимо е да има набор от един или повече tablespaces, които съдържат всички зависими помежду си сегменти – примерно всички таблици, които са накачени през foreign keys и техните индекси.

Постановката, която си направих, е следната:
Система-източник е машината Quasar64. На нея има инсталиран Oracle Enterprise Linux x64, версия 4 update 6. Създал съм тестова БД с изненадващото име orcl64. Системата, която се очаква да приеме нашите „данни” е машината Quasar, с инсталиран Oracle Enterprise Linux 32-bit, версия 4 update 6. Създал съм тестова БД с име orcl.

За да не ми е скучно, си заложих следните изисквания:
- системите са с различни архитектури, т.е. необходимо е конвертиране
- всички файлове ще пренасям с инструментите на БД, а не с команди на ОС
- ще използвам новите expdp и impdp вместо старите изпитани exp и imp

На кратко трябва да се случи следното:
1. Създавам си тестов tablespace на 64 битовата машина и му правя таблица
2. Подготвяне на файлове за транспорт
3. Копирам файловете
4. Наливам файловете в 32 битовата машина

В даденият пример всички SQL команди съм изпълнил с потребител system на съответната БД, а всички команди на ОС – с потребител oracle. Като цяло всичко тук е дадено само като пример, а не като препоръка.

Ето и самата реализация:

1. Създаване на тестови данни на 64 битовата машина
$ sqlplus system/oracle@orcl64
SQL > create tablespace trans datafile ‘/u01/oradata/orcl64/trans01.dbf’ size 5M;
SQL > create table dryn_dryn (a number, b char(1)) tablespace trans;
SQL > insert into dryn_dryn (a, b) values (1, ‘1’);
SQL > insert into dryn_dryn (a, b) values (2, ‘3’);
SQL > insert into dryn_dryn (a, b) values (3, ‘3’);
SQL > commit;

2. Подготвяне на файлове за транспорт
Подробно описание има в глава 8 на Oracle Database Administrator's Guide.
На кратко стъпките са следните: Първо, всички tablespaces трябва да станат read-only:

SQL > alter tablespace trans read only;

Има и друг начин, ако не е допустимо данните да бъдат read-only, но за сега няма да го изпитвам.След това експортирам метаданните. Това става със следната команда на ОС:

$ expdp system/oracle DUMPFILE=trans.dmp DIRECTORY=data_pump_dir

TRANSPORT_TABLESPACES=trans

Това създава файла trans.dmp в директорията, описана с обекта на БД data_pump_dir. Къде по-точно се разбира със следната заявка:

SQL > select directory_path from dba_directories where directory_name = ‘DATA_PUMP_DIR’;

Следващата стъпка е да конвертирам самия файл с данни. Тук има ограничения при преминаване от RISC към CISC архитектури, но, за щастие, аз не разполагам с RISC тестов сървър. Самото конвертиране го извърших с recovery manager, върху 64 битовата машина:

$ rman target sys/oracle
RMAN > convert tablespace trans to platform ‘Linux IA (32-bit)’ format ‘/u01/trans32.dbf’;

Тук дяволията е да се открие името на платформата, на която ще закачаме данните. Малко объркващо, „Linux IA (32-bit)” е нормален 32-битов linux върху процесори Intel/AMD. 64-битовия вариант, работещ върху „масовите” псевдо-64-битови процесори на Intel и AMD е „Linux 64-bit for AMD”, а „Linux IA (64-bit)” е за системите с процесори Intel Itanium. Съответените Windows имена за 32-бита, х64 и 64-bit Itanium са „Microsoft Windows IA (32-bit)”, „Microsoft Windows 64-bit for AMD” и „Microsoft Windows IA (64-bit)”. Имената на всички поддържани платформи могат да се видят във V$TRANSPORTABLE_PLATFORM, а текущата платформа за дадена работеща БД се вижда в колонката PLATFORM_NAME на V$DATABASE.

В резултат на тази команда на rman се получава един файл, който е готов за плъгване в БД със съответната платформа.

3. Копиране на файловете.
Тук си направих най-голямата веселба. Първо, на 64-битовата платформа създадох един обект тип директория в БД, за да мога да си изтегля създадения от rman файл:

SQL > create directory u01 as ‘/u01’;

От тук нататък всички команди са на 32-битовата машина. Създавам обект тип директория в 32-битовата БД за да докарам генерирания от rman файл:

SQL > create directory oradata as ‘/u01/oradata/orcl’;

Създавам си database link от 32-битовата към 64-битовата БД.

SQL > create database link orcl64 using ‘ORCL64’;

Тук ‘ORCL64’ е TNS алиас на 64-битовата БД, описан в tnsnames.ora на 32-битовата система. След това съм готов да си изтегля файловете:

SQL > DBMS_FILE_TRANSFER.GET_FILE (‘u01’, ‘trans32.dbf’, ‘orcl64’, ‘oradata’, ‘trans01.dbf’);
SQL > DBMS_FILE_TRANSFER.GET_FILE (‘data_pump_dir’, ‘trans.dmp’, ‘orcl64’, ‘data_pump_dir’, ‘trans.dmp’);

Толкова елементарно! Параметрите, в реда на изписване, са:
- директориен обект, който е в БД-източник
- име на файла в директорията-източник
- БД-източник
- директориен обект, който е в БД-приемник
- има не файла, който се приема

Следва последната стъпка.

4. Наливам файловете в 32 битовата машина

Командата е само една и се изпълнява от ОС на 32-битовата машина:

$ IMPDP system/oracle DUMPFILE=trans.dmp DIRECTORY=data_pump_dir
TRANSPORT_DATAFILES=‘/u01/oradata/orcl/trans01.dbf’

Следва проверката:

SQL > select * from dryn_dryn;
A   B
---- ----
1  1
2  2
3  3