Засърбяха ме ръцете да подкарам 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. Като цяло всичко тук е дадено само като пример, а не като препоръка.
$ 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;
Подробно описание има в глава 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 се получава един файл, който е готов за плъгване в БД със съответната платформа.
Тук си направих най-голямата веселба. Първо, на 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’);
Толкова елементарно! Параметрите, в реда на изписване, са:
- директориен обект, който е в БД-източник
- име на файла в директорията-източник
- БД-източник
- директориен обект, който е в БД-приемник
- има не файла, който се приема
Следва последната стъпка.
Командата е само една и се изпълнява от ОС на 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
|