WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606
全部博文(599)
分类: Oracle
2009-12-07 13:06:12
终于要进入实践了,我们假设现有数据库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 tables
pace 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 成功完成
这里简单介绍一下本例中调用的参数:
l DUMPFILE:表示导出文件的文件名
l DIRECTORY:这个DIRECTORY所指可并不是实际的物理目录哟,它是物理路径在中的一个别名,这样一旦你需要调用路径就非常方便,不需要写繁长的路径,修改路径的时候也同样很方便,只需要修改directory别名这一处即可。在10g中默认创建了一个名为DATA_PUMP_DIR,其路径指向到:$ORACLE_BASE\10.2.0\admin\SID NAME\dpdump,此处我们直接引用。
l TRANSPORT_TABLESPACES:对于TTS操作这是个必须指定的参数,指定要传输的表空间。
l 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.