传输表空间TTS操作



迁移或备份数据库可以采用传输表空间技术TTS,优点是操作较简便,只需要将元数据进行导出导入,数据文件可以使用FTP方式从源库拷贝至目标库;缺点是数据文件传输至目标库之前,需要将源库表空间置为只读,相当于停业务,所以需要根据业务要求来判断是否可以采用这种方式,下面就针对TTS做一个简单的实验,感性地体会下其操作过程。增强版的XTTS未来有机会再做实验。

实验环境: 
为了处理简单,源库和目标库均采用了11.2.0.4的版本,且字节序相同(其实TTS强大的一点就是可以借助RMAN做不同字节序、平台的转换,这点可以参考eygle大师的《深入浅出Oracle》一书,专门有一章介绍了这部分内容)。

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 x86 64-bit          Little

1.源库验证待传输表空间(dcsopen_tbs)是否自包含,是否符合使用传输表空间的前提条件

SQL> EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('DCSOPEN_TBS',TRUE);
PL/SQL procedure successfully completed.

这里写图片描述
如果待传输的表空间有对象引用了其他非要传输的表空间的对象,例如索引,则需要事先解决这个问题,也就是要传输的表空间对象必须是自包含的。执行上述包,若存在违反约束的情况,则下面这条SQL会返回错误信息:

SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
no rows selected

2.将待传输表空间置为只读

SQL> alter tablespace dcsopen_tbs read only;
Tablespace altered.

3.导出元数据

[oracle@emrep11 ~]$ expdp system/oracle dumpfile=dcsopen_tbs.dmp directory=tts transport_tablespaces=dcsopen_tbs logfile=tts_export.log
Export: Release 11.2.0.4.0 - Production on Fri Jul 8 09:01:42 2016
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01":  system/******** 
dumpfile=dcsopen_tbs.dmp directory=tts transport_tablespaces=dcsopen_tbs logfile=tts_export.log 
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/INDEX/INDEX
Processing object type TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
Processing object type TRANSPORTABLE_EXPORT/INDEX_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/COMMENT
Processing object type TRANSPORTABLE_EXPORT/TABLE_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Master table "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully loaded/unloaded ****************************************************************************** 
Dump file set for SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 is:
  /home/oracle/tts/dcsopen_tbs.dmp ****************************************************************************** 
Datafiles required for transportable tablespace DCSOPEN_TBS:
  /u01/app/oracle/11.2.0.4/oradata/DCSOPEN/dcsopen_tbs01.dbf
Job "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" 
successfully completed at Fri Jul 8 09:01:59 2016 elapsed 0 00:00:14

4.目标库导入元数据 
这其中可能有一些容易犯错的地方: 
错误1:若dcsopen_tbs01.dbf还未拷贝FTP至目标库,此时执行了:

SQL> alter tablespace dcsopen_tbs read write;
Tablespace altered.

则执行导入会报错:

[oracle@emrep66 tts]$ impdp system/oracle dumpfile=dcsopen_tbs.dmp directory=tts transport_datafiles=/home/oracle/tts/dcsopen_tbs01.dbf logfile=tts_import.log 
... 
ORA-39123: Data Pump transportable tablespace job aborted
ORA-19722: datafile /home/oracle/tts/dcsopen_tbs01.dbf is an incorrect version

因为表空间置为只读,是为了保证数据的一致性,所以需要在拷贝完成后才能将其置为可读写状态。

[oracle@emrep11 ~]$ oerr ora 19722 19722, 00000, "datafile %s is an incorrect version" 
// *Cause:   The datafile is an incorrect version. It contains either less or 
//           more changes then the desired version.
// *Action:  Make sure the right datafiles are transported. Make sure the
//           datafile is copied while its tablespace is read only.

https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1424004061629

错误2:若目标库没有和源库相同的用户,则报错:

[oracle@emrep66 tts]$ impdp system/oracle dumpfile=dcsopen_tbs.dmp directory=tts transport_datafiles=dcsopen_tbs01.dbf logfile=tts_import.log 
... 
ORA-39123: Data Pump transportable tablespace job aborted
ORA-29342: user DCSOPEN does not exist in the database

当然,既然使用数据泵,应该可以使用remap_schema参数做映射替换,感兴趣的朋友可以尝试。 
另外,如果不知道目标库使用了什么用户导出的,可以使用sqlfile参数:

[oracle@emrep66 tts]$ impdp system/oracle dumpfile=dcsopen_tbs.dmp directory=tts transport_datafiles=dcsopen_tbs01.dbf sqlfile=ddl.sql

他会生成一个ddl.sql文件,显示了这份dmp文件的内容,其中有一部分就会检查用户,这样你就可以知道是什么用户了:

BEGIN 
sys.dbms_plugts.checkUser('DCSOPEN'); 
COMMIT; 
END; 
/

错误3:如果第二次导入,未删除第一次旧的dump文件,则会报错:

[oracle@emrep11 tts]$ expdp system/oracle dumpfile=dcsopen_tbs.dmp directory=tts transport_tablespaces=dcsopen_tbs logfile=tts_export.log 
... 
ORA-39001: invalid argument value
ORA-39000: bad dump file specification
ORA-31641: unable to create dump file "/home/oracle/tts/dcsopen_tbs.dmp" 
ORA-27038: created file already exists
Additional information: 1

这点你不能说不好,还未探究是否有参数可以跳过了。

5.导入完成后,此时查看目标表的表空间

SYS@EMREP> select tablespace_name, status from dba_tablespaces; 
TABLESPACE_NAME         STATUS
----------------------------------------------------------- 
DCSOPEN_TBS             READ ONLY

状态是只读,需要手工打开,

SYS@EMREP> alter tablespace dcsopen_tbs read write;

Tablespace altered. SYS@EMREP> select tablespace_name, status from dba_tablespaces; 
TABLESPACE_NAME         STATUS
----------------------------------------------------------- 
DCSOPEN_TBS             ONLINE

这样就完成了表空间的迁移过程,当然这实验省略了很多内容,例如字节序、跨平台等等,实际情况可能会更复杂。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7192724/viewspace-2121923/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7192724/viewspace-2121923/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值