传输表空间TTS操作

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 传输表空间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_t
bs.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

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

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 传输表空间TTS操作


 上一篇
11g Grid Control安装过程的一些“坑” 11g Grid Control安装过程的一些“坑”
这是我的微信个人公众号的第一篇杂文,这个公众号仅代表个人观点,只是想分享一些技术文章、生活感悟,希望也可以帮助到一些朋友,谢谢各位! Oracle提供的图形化管理工具目前主要有三个版本: EMDC:Enterprise Manager Da
下一篇 
sqlplus登录报ORA-06502错误的问题排查和解决 sqlplus登录报ORA-06502错误的问题排查和解决
  最近碰见了一个sqlplus登陆报错的问题,我一开始排查问题的方向就错了,不得已,还是请教了dbsnake大师,对于这么一个小问题,就像“小罗的不看人传球”般解决了问题,有因才有果,对于任何事情都成立。当然,我也不是第一次受挫了,归根结