在Oracle Database Administrator’s Guide 11g Release 1 (11.1)里面有专门的一节介绍使用Transportable Tablespace的过程和一个例子:
Transporting Tablespaces Between Databases: A Procedure and Example
简单来说有下面几个步骤:
例子
传输表空间的步骤在下面的例子中将完整描述,假设存在如下的数据文件和表空间:
表空间 数据文件
soe +DG/orcldb/datafile/soe.dbf
soeindex +DG/orcldb/datafile/soeindex.dbf
步骤一:确定源和目标平台是否被支持和确定字节序
分别在源和目标平台上执行下面的查询。如果查询返回了一行结果,则这个平台就支持跨平台的表空间传输。
select d.platform_name, endian_format from v$transportable_platform tp, v$database d where tp.platform_name = d.platform_name;
在测试平台上返回的查询结果如下:
PLATFORM_NAME ENDIAN_FORMAT
—————————— —————————-
Linux IA (32-bit) Little
由于测试中的源和目标平台是同一台机器,所以不必进行字节序的转换。
步骤二:选取一个独立的表空间集合
传输集合内部的对象(object)可能和集合以外的对象存在物理或者逻辑上的依赖关系。可是只有独立的表空间集合才可以进行传输。在这里“独立的”意味着表空间集合的内部没有任何对集合以外的对象的引用(reference)。可以使用由Oracle提供的包DBMS_TTS中的transport_set_check过程来进行独立性检查:
SQL> execute dbms_tts.transport_set_check('soe,soeindex', TRUE);
在执行了这个PL/SQL过程之后,可以通过查询transport_set_violations视图来检查:
SQL> select * from transport_set_violations;
no rows selected.
没有结果返回说明了soe和soeindex组成的表空间集合是独立的。
步骤三:生成一个可传输表空间集合
使得集合中的所有表空间成为只读(read-only):
SQL> alter tablespace soe read only;
SQL> alter tablespace soeindex read only;
在源平台上使用数据泵导出工具导出表空间集合
SQL> create directory dpump_dir as '/scratch/jarod/dpump_dir';
SQL> host
$ expdp system/oracle dumpfile=expdat.dmp directory=dpump_dir transport_tablespace=soe,soeindex
由于这里数据泵只是导出了表空间的元数据,而没有任何数据被卸载(unload),所以即使是对于较大的表空间集合这个过程也进行得相当快。
步骤四:传输表空间集合
这里选择了使用由Oracle提供的DBMS_FILE_TRANSFER包中的copy_file过程,因为它能支持源和目标是ASM或者文件系统路径。
SQL> create directory asm_dir as '+DG/orcldb/datafile';
SQL> create directory datafile_dir as '/scratch/jarod/datafile_dir';
从ASM中将数据文件拷贝到文件系统的目录datafile_dir中:
SQL> begin
dbms_file_transfer.copy_file(
source_directory_object => ‘asm_dir’,
source_file_name => ‘soe.dbf’,
destination_directory_object => ‘datafile_dir’,
destination_file_name => ‘soe.dbf’);
end;
SQL> /
SQL> begin
dbms_file_transfer.copy_file(
source_directory_object => ‘asm_dir’,
source_file_name => ‘soeindex.dbf’,
destination_directory_object => ‘datafile_dir’,
destination_file_name => ‘soeindex.dbf’);
end;
SQL> /
此时,在/scratch/jarod/datafile_dir目录中就会生成soe.dbf和soeindex.dbf两个文件。这两个文件接下来就将被传输到目标平台上去。但由于测试环境中源和目标平台是同一台机器,所以现在为了模拟目标平台,首先应当把soe和soeindex两个表空间连同其对应的数据文件删除掉:
SQL> drop tablespace soe including contents and datafiles cascade constraints;
现在,把导出的数据文件拷贝到ASM中去,仍然使用copy_file过程,注意这次源是存放数据文件的文件系统路径,而目标是ASM。值得注意的是,如果是真实的目标平台,则目标数据库中必须存在和源数据中相同的schema和directory对象。
SQL> begin
dbms_file_transfer.copy_file(
source_directory_object => ‘datafile_dir’,
source_file_name => ‘soe.dbf’,
destination_directory_object => ‘asm_dir’,
destination_file_name => ‘soe.dbf’);
end;
SQL> /
SQL> begin
dbms_file_transfer.copy_file(
source_directory_object => ‘datafile_dir’,
source_file_name => ‘soeindex.dbf’,
destination_directory_object => ‘asm_dir’,
destination_file_name => ‘soeindex.dbf’);
end;
SQL> /
成功执行之后,可以使用ASMCMD工具来验证数据文件是否被拷贝到了磁盘组中。
步骤五:导入表空间集合
使用impdp工具来导入表空间集合的元数据
$impdp system/oracle dumpfile='expdat.dmp' directory=dpump_dir transport_datafiles='+DG/orcldb/datafile/soe.dbf, +DG/orcldb/datafile/soeindex.dbf'
导入完毕之后,再将表空间重新设置为可读写:
SQL> alter tablespace soe read write;
SQL> alter tablespace soeindex read write;
至此,整个表空间传输的例子完毕。