TTS—03-跨平台传输

终于要进入实践了,我们假设现有数据库a:SID=jssweb 做为源数据库,数据库b:SID=jsstts 做为目标数据库。从数据库a 复制表空间jssweb 到数据库b。下面是具体操作步骤:

一、确认平台是否支持(Determine if Platforms are Supported and Endianness)

检查平台版本以及Endian,确认是否支持我们的传输条件。如果是不同平台间的传输,本步操作必不可少。
例如:
E:\ORA10G>set oracle_sid=jssweb
首先连接到源数据库。

E:\ORA10G>sqlplus "/ as sysdba"
SQL> col name heading '实例名' for a10
SQL> col version heading '数据库版本' for a15
SQL> col platform_name heading '操作系统平台' for a30
SQL> col endian_format heading '字节顺序' for a15

执行查询,获取平台信息

SQL> SELECT d.NAME, i.VERSION, d.PLATFORM_NAME, ENDIAN_FORMAT
2 FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d, V$INSTANCE i
3 WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME
4 and d.DB_UNIQUE_NAME = i.INSTANCE_NAME;

实例名数据库版本操作系统平台字节顺序
---------- --------------- ------------------------------ ---------------
JSSWEB 10.2.0.1.0 Microsoft Windows IA (32-bit) Little

然后连接到目标数据库,执行同样的查询。

[oracle@jsslinux ~]$ echo $ORACLE_SID
jsstts
[oracle@jsslinux ~]$ sqlplus "/ as sysdba"
SQL> col name heading '实例名' for a10
SQL> col version heading '数据库版本' for a15
SQL> col platform_name heading '操作系统平台' for a30
SQL> col endian_format heading '字节顺序' for a15
SQL> SELECT d.NAME, i.VERSION, d.PLATFORM_NAME, ENDIAN_FORMAT
2 FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d, V$INSTANCE i
3 WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME
4 and d.DB_UNIQUE_NAME = i.INSTANCE_NAME;

实例名数据库版本操作系统平台字节顺序
---------- --------------- ------------------------------ ---------------
JSSTTS 10.2.0.1.0 Linux IA (32-bit) Little
SQL>

上述查询可以得到数据库版本、操作系统平台以及ENDIAN。结合我们上节提供的传输版本对照表确认是否满足我们的传输要求。呵呵,这里我们运气不错,虽然是两个不同的操作系统平台,但由于都采用了oracle10g,并且字节顺序相同,不仅支持跨平台传输而且还可以省掉字节转换的操作。

二、选择自包含的表空间集(Pick a Self-Contained Set of Tablespaces)

待传输的表空间集中对象可能会存在与其它对象逻辑或物理上的关联,但这里我们要强调的就是可传输的表空间集必须是自包含的,前面我们提到使用DBMS_TTS 包的TRANSPORT_SET_CHECK 过程来验证待传输表空间集是否自包含,TRANSPORT_SET_CHECK 过程可以以两种方式执行:非严格方式和严格方式。

提示,使用sys 用户执行DBMS_TTS 包的过程,或者是被赋于EXECUTE_CATALOG_ROLE 角色的用户。

严格方式验证就是在调用TRANSPORT_SET_CHECK 过程时指定FULL_CHECK 参数为TRUE。严格方式不只检查表空间集引用的对象是否自包含,同时会检查被其它表空间引用的对象,引用者是否在表空间集中。

文字太绕口,以本次演示中要传输的表空间为例。
表空间jssweb 有表DEPT,其索引DEPT.IDX_DEPT_DEPTNO 在users 表空间。

SQL> exec dbms_tts.transport_set_check('jssweb', TRUE);
PL/SQL 过程已成功完成。
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
未选定行

如果表空间集满足自包含检查,则视图返回空记录。
执行严格方式的检查:

SQL> exec dbms_tts.transport_set_check('jssweb', TRUE , TRUE);
PL/SQL 过程已成功完成。
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
VIOLATIONS
--------------------------------------------------------------------------------
Index JSS.IDX_DEPT_DEPTNO in tablespace USERS points to table JSS.DEPT in tablespace JSSWEB

不满足自包含验证,SELECT 语句返回违反的信息,你可以根据其提示进行修正。
提示:如果要检查的表空间有多个,相互之间以逗号分隔即可。

三、生成可传输表空间集(Generate a Transportable Tablespace Set)
执行export操作的用户需要被赋于EXP_FULL_DATABASE角色。

再次提示,生成可传输表空间集之前,必须将要传输的表空间置为read-only,不然你就得选择通过RMAN备份生成表空间集了。

确认所选择的表空间都是自包含之后,按照下列步骤进行操作。
1、将表空间置为READ-ONLY;

SQL> ALTER TABLESPACE JSSWEB READ ONLY;
表空间已更改。

2、使用Data Dump 导出表空间集元数据

SQL> host

进入操作系统命令行

E:\ORA10G>expdp system/verysafe DUMPFILE=expdp_jssweb.dmp DIRECTORY=DATA_PUMP_DIR TRANSPORT_TABLESPACES=jssweb
..........................................................................
启动"SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01": system/********
DUMPFILE=expdp_jssweb.dmp DIRECTORY=DA
TA_PUMP_DIR TRANSPORT_TABLESPACES=jssweb
处理对象类型TRANSPORTABLE_EXPORT/PLUGTS_BLK
处理对象类型TRANSPORTABLE_EXPORT/TABLE
处理对象类型TRANSPORTABLE_EXPORT/INDEX
处理对象类型TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
处理对象类型TRANSPORTABLE_EXPORT/COMMENT
处理对象类型TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
已成功加载/卸载了主表"SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01"
******************************************************************************
SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 的转储文件集为:
E:\ORA10G\PRODUCT\10.2.0\ADMIN\JSSWEB\DPDUMP\EXPDP_JSSWEB.DMP
作业"SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" 已于10:54:43 成功完成

这里简单介绍一下本例中调用的参数:
DUMPFILE:表示导出文件的文件名
DIRECTORY:这个DIRECTORY 所指可并不是实际的物理目录哟,它是物理路径在oracle 中的一个别名,这样一旦你需要调用路径就非常方便,不需要写繁长的路径,修改路径的时候也同样很方便,只需要修改directory 别名这一处即可。在10g 中默认创建了一个名为DATA_PUMP_DIR,其路径指向到:$ORACLE_BASE\10.2.0\admin\SID NAME\dpdump,此处我们直接引用。
TRANSPORT_TABLESPACES:对于TTS 操作这是个必须指定的参数,指定要传输的表空间。
TRANSPORT_FULL_CHECK:如果你希望执行严格自包含导出的话,可以指定本参数值为Y。EXPDP 的参数还有很多,要查看其全部参数,可以通过调用expdp help=y 的方式获得,如果想明确各参数的详细解释,可以参考Oracle? Database Utilities。

提示:EXPDP 只是导出的待传输表空间的目录结构信息(元数据),并不包含实际数据,因此导出的速度非常快,而且文件也很小,所以千万表看到它很小,就以为导出的文件有问题。

3、如果两平台间的字节顺序不一致的话,中间需要有个转换过程,前章操作步骤里也曾深入分析过,我们此次演示中不存在字节顺序不一致的问题,所以此步跳过,留待后续展现。

四、传输表空间集到目标库(Transport the Tablespace Set)

复制表空间对应的数据文件以及表空间元数据导出文件到目标库,这个技术含量是黑低的嘛,ftp(使用二进制方式传输)、网络共享或拿个u 盘等等都可行,条条大路通目标嘛。但是复制的时候需要注意路径,复制目的地应该以目标库为准,

比如DIRECTORY 的指向路径,如果你仍然想使用DATA_PUMP_DIR 的话就得先确认目标库是否存在这个对象,以及这个对象在目标库中对应的物理路径是什么,表空间的元数据导出文件应该复制到这个路径下:

SQL> select * from dba_directories where directory_name='DATA_PUMP_DIR';
OWNER      DIRECTORY_NAME  DIRECTORY_PATH
---------- --------------- ----------------------------------------
SYS        DATA_PUMP_DIR   /opt/ora10g/admin/jsstts/dpdump/

数据文件复制完之后,千万表忘将源库中的表空间状态置为read-write,切记切记。

SQL> alter tablespace JSSWEB read write;
表空间已更改。
SQL> select tablespace_name,status from dba_tablespaces;
TABLESPACE_NAME     STATUS
------------------- ---------
SYSTEM              ONLINE
UNDOTBS1            ONLINE
SYSAUX              ONLINE
TEMP                ONLINE
USERS               ONLINE
JSSWEB              ONLINE
已选择6 行。

五、导入表空间集(Import the Tablespace Set)

注意,如果传输的表空间集block_size 与目标库的默认block_size 不同,那你的第一步就得是设置目标库中DB_nK_CACHE_SIZE 的初始化参数。

1、导入元数据

[oracle@jsslinux ~]$ impdp system/verysafe DUMPFILE=EXPDP_JSSWEB.DMP DIRECTORY=DATA_PUMP_DIR TRANSPORT_DATAFILES=/opt/ora10g/oradata/jsstts/jssweb.dbf REMAP_SCHEMA=(jss:jssl)
Import: Release 10.2.0.1.0 - Production on 星期一, 05 11 月, 2007 14:02:33
Copyright (c) 2003, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已成功加载/卸载了主表"SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01"
启动"SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01": system/********
DUMPFILE=EXPDP_JSSWEB.DMP DIRECTORY=DATA_PUMP_DIR
TRANSPORT_DATAFILES=/opt/ora10g/oradata/jsstts/jssweb.dbf REMAP_SCHEMA=(jss:jssl)
处理对象类型TRANSPORTABLE_EXPORT/PLUGTS_BLK
处理对象类型TRANSPORTABLE_EXPORT/TABLE
处理对象类型TRANSPORTABLE_EXPORT/INDEX
处理对象类型TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
处理对象类型TRANSPORTABLE_EXPORT/COMMENT
处理对象类型TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
作业"SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" 已于14:02:40 成功完成

IMPDP 的命令形式与EXPDP 完成相同,只是有个别参数不同。以上述为例:
DUMPFILE:与前文EXPDP 介绍相同
DIRECTORY:与前文EXPDP 介绍相同
TRANSPORT_DATAFILES:被传输的数据文件路径,如果有多个,以逗号分隔。
REMAP_SCHEMA:此参数并非必须。参数的功能是指定传输的表空间中对象的归属。白话点说就是源库中对象属于schema A,对目标库后你想将其对象归属于schema B,则可以通过此参数指定。如果不指定参数的话,则表空间中对象在目标库中仍然属于schema A,前提是存在A 用户,如果不存在的话导入会报错,提醒你要么更改所属对象要么创建用户A。如果有多个schema 的归属需要转移,那就指定多个REMAP_SCHEMA 参数即可。

2、如果需要,将刚导入的表空间状态置为read-write刚导入的表空间默认是read-only 状态(因为你在源库将其置为read-only 啦),如果需要,别忘了更改其状态。

SQL> alter tablespace JSSWEB read write;
表空间已更改。

注:前文中生成导入导出文件也可由EXP/IMP 命令生成,具体EXP/IMP 的命令语法与EXPDP/IMPDP 非常类似这里就不详述了,大家可以通过调用HELP=Y 参数获取其帮助信息。需要注意的是,如果表空间中包含XMLTypes,那你只能使用EXP/IMP 命令执行导出/导入,并确认CONSTRAINTS 和TRIGGERS 参数被设置为Y。

传输成功!

Trackback

no comment untill now

Add your comment now

切换到手机版