oracle的传输表空间是指,可以将一个数据库上的一个或多个表空间的全部数据文件拷贝到另一个数据库服务器上,通过导入的方式将表空间加载当目标数据库。
使用这种方法的最大好处是速度快,所需要的时间和拷贝数据文件差不多,比执行EXP/IMP的导入导出要快得多。

传输表空间的限制条件:
源和目标数据库必须使用相同的字符集和国家字符集(分别对应nls_database_parameters视图的NLS_CHARACTERSET与NLS_NCHAR_CHARACTERSET值)
如果要传输到其它os平台,compatible必须要设置为10.0以上。

Oracle提供了过程dbms_tts.transport_set_check来检查一个表空间集合是否是自包含的。这个过程有三个参数,第一个是表空间名字的列表,用逗号分隔,第二个参数指出是否检查完整性约束,第三个参数指出检查集合内参考集合外的同时是否反过来检查集合外是否参考了集合内的对象。
执行完过程后,查询视图transport_set_violations查看检查结果 ,如果为空,说明是自包含的,可以进行传输表空间。

实验:

  1. --源端创建测试表空间与测试用户 
  2. SQL> create tablespace t_tbs datafile  'G:\oracle\product\10.2.0\oradata\orcl\t_tbs01.dbf' 
  3.   2  size 10M; 
  4.  
  5. 表空间已创建。 
  6.  
  7. SQL> create user test identified by test; 
  8.  
  9. 用户已创建。 
  10.  
  11. SQL> grant connect,resource to test; 
  12.  
  13. 授权成功。 
  14.  
  15. SQL> conn test/test@orcl 
  16. 已连接。 
  17. SQL> create table t_t (id int) tablespace t_tbs; 
  18.  
  19. 表已创建。 
  20.  
  21. SQL> insert into t_t select level from dual  connect by level<100; 
  22.  
  23. 已创建99行。 
  24.  
  25. SQL> commit
  26.  
  27. 提交完成。 
  28.  
  29. --1.源端检查自包含 
  30. SQL> show user 
  31. USER 为 "SYS" 
  32. SQL>  execute dbms_tts.transport_set_check('t_tbs',true); 
  33.  
  34. PL/SQL 过程已成功完成。 
  35.  
  36. SQL>  select * from transport_set_violations; 
  37.  
  38. 未选定行 
  39.  
  40.  
  41. --2.源端在导出之前置表空间为只读 
  42. SQL> alter tablespace t_tbs read only
  43.  
  44. 表空间已更改。 
  45.  
  46. --3.执行导出 ,需sysdba
  47. SQL> ho exp 'sys/oracle@orcl as sysdba' transport_tablespace=y tablespaces=t_tbs file=d:t_tbs.dmp 
  48.  
  49. Export: Release 10.2.0.1.0 - Production on 星期四 8月 30 22:16:12 2012 
  50.  
  51. Copyright (c) 1982, 2005, Oracle.  All rights reserved. 
  52.  
  53.  
  54. 连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production 
  55. With the Partitioning, OLAP and Data Mining options 
  56. 已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集 
  57. 注: 将不导出表数据 (行) 
  58. 即将导出可传输的表空间元数据... 
  59. 对于表空间 T_TBS... 
  60. . 正在导出簇定义 
  61. . 正在导出表定义 
  62. . . 正在导出表                             T_T 
  63. . 正在导出引用完整性约束条件 
  64. . 正在导出触发器 
  65. . 结束导出可传输的表空间元数据 
  66. 成功终止导出, 没有出现警告。 
  67.  
  68. --4.拷表空间对应的数据文件到目标端 
  69. SQL> ho copy G:\oracle\product\10.2.0\oradata\orcl\t_tbs01.dbf G:\oracle\product\10.2.0\oradata\oralife\T_TBS1.DBF 
  70. 已复制         1 个文件。 
  71.  
  72. --5.拷完表空间对应的数据文件后,将此表空间置为读写 
  73. SQL> alter tablespace t_tbs read write; 
  74.  
  75. 表空间已更改。 
  76.  
  77. /** 目标端操作...*/
  78.  
  79. --6.目标端导入元数据 ,需sysdba
  80. SQL> ho imp 'sys/oracle@oralife as sysdba' transport_tablespace=y file=d:\t_tbs.dmp datafiles=G:\oracle\product\10.2.0\ 
  81. radata\oralife\T_TBS1.DBF 
  82.  
  83. Import: Release 10.2.0.1.0 - Production on 星期四 8月 30 22:28:48 2012 
  84.  
  85. Copyright (c) 1982, 2005, Oracle.  All rights reserved. 
  86.  
  87.  
  88. 连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production 
  89. With the Partitioning, OLAP and Data Mining options 
  90.  
  91. 经由常规路径由 EXPORT:V10.02.01 创建的导出文件 
  92. 即将导入可传输的表空间元数据... 
  93. 已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入 
  94. . 正在将 SYS 的对象导入到 SYS 
  95. . 正在将 SYS 的对象导入到 SYS 
  96. IMP-00017: 由于 ORACLE 错误 29342, 以下语句失败: 
  97.  "BEGIN   sys.dbms_plugts.checkUser('TEST'); END;" 
  98. IMP-00003: 遇到 ORACLE 错误 29342 
  99. ORA-29342: 数据库中不存在用户 TEST 
  100. ORA-06512: 在 "SYS.DBMS_PLUGTS", line 1895 
  101. ORA-06512: 在 line 1 
  102. IMP-00000: 未成功终止导入 
  103.  
  104. --由于目标端没有test用户,导入失败,在目标端新建ttt用户,然后导入到该用户中 
  105. SQL> create user ttt identified by ttt; 
  106.  
  107. 用户已创建。 
  108.  
  109. SQL> grant connect,resource to ttt; 
  110.  
  111. 授权成功。 
  112.  
  113. --7.目标端执行导入 
  114. SQL> ho imp 'sys/oracle@oralife as sysdba' transport_tablespace=y file=d:\t_tbs.dmp datafiles=G:\oracle\product\10.2.0\ 
  115. radata\oralife\T_TBS1.DBF fromuser=test touser=ttt; 
  116.  
  117. Import: Release 10.2.0.1.0 - Production on 星期四 8月 30 22:32:15 2012 
  118.  
  119. Copyright (c) 1982, 2005, Oracle.  All rights reserved. 
  120.  
  121.  
  122. 连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production 
  123. With the Partitioning, OLAP and Data Mining options 
  124.  
  125. 经由常规路径由 EXPORT:V10.02.01 创建的导出文件 
  126. 即将导入可传输的表空间元数据... 
  127. 已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入 
  128. . 正在将 TEST 的对象导入到 TTT 
  129. . . 正在导入表                           "T_T" 
  130. 成功终止导入, 没有出现警告。 
  131.  
  132. SQL> select count(*) from ttt.t_t; 
  133.  
  134.   COUNT(*) 
  135. ---------- 
  136.         99 
  137.  
  138. --8.置表空间为读写 
  139. SQL> alter tablespace t_tbs read write; 
  140.  
  141. 表空间已更改。 
  142.  
  143. SQL> select name from v$datafile; 
  144.  
  145. NAME 
  146. -------------------------------------------------------------- 
  147. G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\SYSTEM01.DBF 
  148. G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\UNDOTBS01.DBF 
  149. G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\SYSAUX01.DBF 
  150. G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\USERS01.DBF 
  151. G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\EXAMPLE01.DBF 
  152. G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORALIFE\T_TBS1.DBF