前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >传输表空间TTS操作

传输表空间TTS操作

作者头像
bisal
发布2019-01-29 15:42:35
1.2K0
发布2019-01-29 15:42:35
举报
文章被收录于专栏:bisal的个人杂货铺

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

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

代码语言:javascript
复制
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)是否自包含,是否符合使用传输表空间的前提条件

代码语言:javascript
复制
SQL> EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('DCSOPEN_TBS',TRUE);
PL/SQL procedure successfully completed.
这里写图片描述
这里写图片描述

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

代码语言:javascript
复制
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
no rows selected

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

代码语言:javascript
复制
SQL> alter tablespace dcsopen_tbs read only;
Tablespace altered.

3.导出元数据

代码语言:javascript
复制
[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至目标库,此时执行了:

代码语言:javascript
复制
SQL> alter tablespace dcsopen_tbs read write;
Tablespace altered.

则执行导入会报错:

代码语言:javascript
复制
[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

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

代码语言:javascript
复制
[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:若目标库没有和源库相同的用户,则报错:

代码语言:javascript
复制
[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参数:

代码语言:javascript
复制
[oracle@emrep66 tts]$ impdp system/oracle dumpfile=dcsopen_tbs.dmp directory=tts transport_datafiles=dcsopen_tbs01.dbf sqlfile=ddl.sql

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

代码语言:javascript
复制
BEGIN
 sys.dbms_plugts.checkUser('DCSOPEN');
COMMIT;
END;
/

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

代码语言:javascript
复制
[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.导入完成后,此时查看目标表的表空间

代码语言:javascript
复制
SYS@EMREP> select tablespace_name, status from dba_tablespaces;
TABLESPACE_NAME         STATUS
-----------------------------------------------------------
DCSOPEN_TBS                    READ ONLY

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

代码语言:javascript
复制
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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年07月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档