Transportable Tablespace Example

jarodwang, 05 May 2008, No comments
Categories: Oracle
Tags: ,

在Oracle Database Administrator’s Guide 11g Release 1 (11.1)里面有专门的一节介绍使用Transportable Tablespace的过程和一个例子:

Transporting Tablespaces Between Databases: A Procedure and Example

简单来说有下面几个步骤:

  1. 对于跨平台的传输,可以通过查询v$transportable_platform视图来确定两个平台的字节序(endian)。如果表空间的传输是在同一个平台上进行的可以忽略这一步。
  2. 选取一个独立的(self-contained)表空间集合。
  3. 生成一个可传输的表空间集合。一个可传输表空间集合(或者可传输集合)由需要传输的表空间的数据文件(datafile)和一个包含了表空间集合的结构化信息(元数据(metadata))的导出文件。可以使用数据泵(Data Pump)来进行导出。
  4. 传输表空间集合。将数据文件和导出文件拷贝到目标数据库可见的地方。
  5. 导入表空间集合。使用数据泵工具将表空间集合的元数据导入到目标数据库。

例子

传输表空间的步骤在下面的例子中将完整描述,假设存在如下的数据文件和表空间:

表空间 数据文件

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;

至此,整个表空间传输的例子完毕。

Comments

Leave a Reply:

Name *

Mail (hidden) *

Website