一、基本环境
源库:
@H_301_9@DB_NAME:racdb(rac) HOSTNAME:note1、@H_301_9@note2PUBLIC IP:172.16.1.7、@H_301_9@172.16.1.8 STORAGE:ASM
@H_301_9@OS_VERSION:RedHat6.5 ORACLE_VERSION:11.2.0.4.0
目标库:
@H_301_9@DB_NAME:testdb(single instance) HOSTNAME:iscsi-asm IP:172.16.1.20 STORAGE:file system OS_VERSION:RedHat6.5 ORACLE_VERSION:11.2.0.4.0
迁移表空间:@H_301_9@MYTEST
@H_301_9@
@H_301_9@二、DATAPUMP迁移表空间
sql>createtablespacemytestdatafile'+data'size100m; Tablespacecreated. sql>createusermytestidentifiedbymytest123defaulttablespacemytest; Usercreated. sql>grantconnect,resourcetomytest; Grantsucceeded. sql>createtablemytest.t1asselect*fromdba_segments; Tablecreated. sql>selectcount(1)frommytest.t1; COUNT(1) ---------- 4795
sql>execdbms_tts.transport_set_check('mytest',true,true); PL/sqlproceduresuccessfullycompleted. sql>select*fromtransport_set_violations; norowsselected
查看检查的结果,无输出说明该表空间是自包含的,也就是说该表空间的对象没有依赖其它表空间。接下来,我在测试表@H_301_9@mytest.t1上建个索引,存储在@H_301_9@users表空间上,再看看查询@H_301_9@transport_set_violations的结果。
sql>alterusermytestquotaunlimitedonusers; Useraltered. sql>createindexmytest.t1_owner_idxonmytest.t1(owner)tablespaceusers; Indexcreated. sql>execdbms_tts.transport_set_check('mytest',true); PL/sqlproceduresuccessfullycompleted. sql>select*fromtransport_set_violations; VIOLATIONS -------------------------------------------------------------------------------- ORA-39907:IndexMYTEST.T1_OWNER_IDXintablespaceUSERSpointstotableMYTEST. T1intablespaceMYTEST.
@H_301_9@
从查询@H_301_9@transport_set_violations的结果中可以看出,该表空间的对象@H_301_9@T1_OWNER_IDX这个索引依赖其它表空间@H_301_9@USERS,所以它不是自包含的,利用@H_301_9@datapump和@H_301_9@rman的方式都是不支持,因此,可使用@H_301_9@alter table/index move的方式不在自包含的表空间的对象移动到同一表空间之后再迁移表空间。这里我将索引@H_301_9@T1_OWNER_IDX先删除。
@H_301_9@3、确认平台是否兼容
sql>selectt.*fromv$transportable_platformt,v$databasedwheret.platform_name=d.platform_name; PLATFORM_IDPLATFORM_NAMEENDIAN_FORMAT ---------------------------------------------------------------- 13Linuxx8664-bitLittle
@H_301_9@
目前源库和目标库都是@H_301_9@RedHat 6.5,相同的@H_301_9@OS,不存在跨平台的情况,所以这里简单的说一下就行,可通过查询@H_301_9@v$transportable_platform视图的@H_301_9@endian_format进行对比,若相同则说明可以进行跨平台的迁移。
补充:源端数据库版本和目标端数据库版本的问题,根据@H_301_9@datapump的特性高进低出,所以高版本到低版本应该是不支持的,而低到高是没问题的。
@H_301_9@4、将表空间置为@H_301_9@read only状态
sql>altertablespacemytestreadonly; Tablespacealtered.
@H_301_9@5、导出表空间@H_301_9@Metadata
sql>createdirectoryzwdiras'/u/app/oracle/zwdir'; Directorycreated. [oracle@note1zwdir]$expdp\'\/assysdba\'directory=zwdirdumpfile=mytest.dmpnologfile=ytransport_tablespaces=mytest
@H_301_9@
@H_301_9@6、将表空间置为@H_301_9@read write状态
sql>altertablespacemytestreadwrite; Tablespacealtered.
@H_301_9@
@H_301_9@7、@H_301_9@cp源库数据文件和@H_301_9@dmp到目标库
这里需要注意的是源库数据文件是存储在@H_301_9@ASM中的,需要从@H_301_9@ASM中先拷贝到本地文件系统上,在此过程中需要将数据文件的所属用户由@H_301_9@grid修改为@H_301_9@oracle。拷贝过程这里就不做记录了。
@H_301_9@8、目标端执行导入
sql>createusermytestidentifiedbymytest123; Usercreated. sql>grantconnect,resourcetomytest; Grantsucceeded.
@H_301_9@ORA-39123: Data Pump transportabletablespace job aborted
@H_301_9@ORA-29342: user MYTEST does not exist inthe database
在导入之前,需要考虑源库与目标库的字符集是否相同,如果不同,则需要修改为相同的字符集;还需要考虑两个数据库之间的@H_301_9@BLOCK_SIZE是否一致,若不一致,需要修改@H_301_9@DB_nK_CACHE_SIZE的大小。
[oracle@iscsi-asm~]$impdp\'\/assysdba\'directory=zwdirdumpfile=mytest.dmpnologfile=ytransport_datafiles='/u/app/oracle/oradata/datafile/MYTEST.279.935793141'
这里是从@H_301_9@ASM到文件系统,读者可以思考下:从文件系统到@H_301_9@ASM的迁移、@H_301_9@ASM到@H_301_9@ASM之间的迁移,其实都是差不多的。
@H_301_9@9、进行验证
sql>selectcount(1)frommytest.t1; COUNT(1) ---------- 4795 sql>altertablespacemytestreadwrite; Tablespacealtered.
@H_301_9@10、@H_301_9@Datapump迁移表空间的总结:
@H_301_9@transport_tablespace是需要满足许多条件的,从上可以知道,需要字符集相同,表空间是自包含的,如果跨平台的话,还需确认@H_301_9@endian_format是否一致。最关键的是需要迁移的表空间需要在@H_301_9@READ ONLY状态,能读不能写,这对于@H_301_9@7*24环境的系统而言,是没有办法接受的,那么是否有办法解决该问题呢?有的,那就是@H_301_9@RMAN TRANSPORT TABLESPACE。
三、RMAN迁移表空间
1、RMAN备份数据库
源库需要备份整库和所有的归档日志,因为除了目标表空间的备份以外,@H_301_9@RMAN还需要@H_301_9@SYSTEM、@H_301_9@SYSAUX以及@H_301_9@UNDO表空间的备份,如果任意一个表空间的备份不存在,则就会导致@H_301_9@RMAN-06019: 无法转换表空间名称的错误。
RMAN>backupdatabaseplusarchivelogformat'/u/app/oracle/zwdir/full_bak_%T_%t.bak'; RMAN>transporttablespacemytesttablespacedestination'/u/app/oracle/zwdir'auxiliarydestination'/u/app/oracle/zwdir/mytest';
此时需要迁移的表空间数据文件,@H_301_9@dmp文件,导入脚本等都在@H_301_9@/u/app/oracle/zwdir目录下,而@H_301_9@/u/app/oracle/zwdir/mytest建立的辅助实例的临时文件都会被删除。观察一下生成的导入脚本文件:
这里可以发现从@H_301_9@ASM存储到文件系统上数据文件使用了@H_301_9@OMF的方式进行管理。
[oracle@note1zwdir]$scp-ro1_mf_mytest_db3jhv2w_.dbfdmpfile.dmpimpscrpt.sql172.16.1.20:/u/app/oracle/zwdir/ oracle@172.16.1.20'spassword: o1_mf_mytest_db3jhv2w_.dbf100%100MB100.0MB/s00:01 dmpfile.dmp100%112KB112.0KB/s00:00 impscrpt.sql100%20942.0KB/s00:00
3、导入目标库
sql>@impscrpt.sql Directorycreated. Directorycreated. PL/sqlproceduresuccessfullycompleted. Directorydropped. Directorydropped.
@H_301_9@4、进行验证
sql>selecttablespace_name,statusfromdba_tablespaceswheretablespace_name='MYTEST'; TABLESPACE_NAMESTATUS ------------------------------------------------ MYTESTREADONLY sql>selectcount(1)frommytest.t1; COUNT(1) ---------- 4795
5、RMAN迁移表空间的总结:
对比@H_301_9@datapump迁移表空间,@H_301_9@rman迁移表空间更加简单实用,可以说是@H_301_9@rman将@H_301_9@datapump迁移的方式进行脚本的集成。虽然,以上我的操作步骤很简单,@H_301_9@datapump该考虑的条件,使用@H_301_9@rman也是一样需要考虑的,字符集相同,表空间是自包含的,如果跨平台的话,还需确认@H_301_9@endian_format一致,两个数据库之间的@H_301_9@BLOCK_SIZE也要一致等。
@H_301_9@
参考官网相关文章:
@H_301_9@TransportingTablespaces Between Databases
http://docs.oracle.com/cd/E11882_01/server.112/e25494/tspaces013.htm
@H_301_9@CreatingTransportable Tablespace Sets
http://docs.oracle.com/cd/E11882_01/backup.112/e10642/rcmttbsb.htm