使用可传输表空间的特性复制数据


可传输表空间的限制:传输表空间技术不能应用于system表空间或sys用户拥有的对象。在传输表空间中,要求表空间为自包含的,自包含表示用于传输的内部表空间集没有引用指向外部表空间集。  

可传输表空间实验环境
  OS IP SID 存储方式 表空间 用户
源数据库 RedHat5.4 10.10.10.8 orcl 文件系统 tb1,tb2 u1,u2

t1,t2

目标数据库 redhat5.4 10.10.10.7 orcl ASM —— u1,u2 ——

说明:在源数据库上用户u1使用的是tb1表空间,里面有一张t1表。使用exp/imp来传输;在源数据库上用户u2使用的是tb2表空间,里面有一张t2表。使用expdp/impdp来传输。

下面给出创建测试环境的脚本(源数据库上面执行的操作)

  1. USER 为 "SYS"  
  2. SQL> create tablespace tb1 datafile '/u01/app/Oracle/oradata/orcl/tb1.dbf' size 10m;  
  3.   
  4. 表空间已创建。  
  5.   
  6. SQL> create tablespace tb2 datafile '/u01/app/oracle/oradata/orcl/tb2.dbf' size 10m;  
  7.   
  8. 表空间已创建。  
  9.   
  10. SQL> create user u1 identified by u1 default tablespace tb1;  
  11.   
  12. 用户已创建。  
  13.   
  14. SQL> create user u2 identified by u2 default tablespace tb2;  
  15.   
  16. 用户已创建。  
  17.   
  18. SQL> grant connect,resource to u1,u2;  
  19.   
  20. 授权成功。  
  21.   
  22. SQL> create table u1.t1 as select * from dba_objects where rownum < 100;  
  23.   
  24. 表已创建。  
  25.   
  26. SQL> create table u2.t2 as select * from dba_objects where rownum < 200;  
  27.   
  28. 表已创建。  
  29.   
  30. SQL> select count(*) from u1.t1;  
  31.   
  32.   COUNT(*)  
  33. ----------   
  34.         99  
  35.   
  36. SQL> select count(*) from u2.t2;  
  37.   
  38.   COUNT(*)  
  39. ----------   
  40.        199  

可传输表空间实战

1.确认要传输表空间的平台是否兼容(源数据库和目标数据库上面都一样,因为都是redhat5.4的OS)

  1. SQL> select tp.* from v$transportable_platform tp,v$database d where tp.PLATFORM_NAME = d.PLATFORM_NAME;  
  2.   
  3. PLATFORM_ID PLATFORM_NAME                       ENDIAN_FORMAT  
  4. ----------- ----------------------------------- --------------   
  5.          10 Linux IA (32-bit)                   Little  

2.确认传输的表空间是否自包含(源数据库上面执行的操作)

  1. SQL> show user  
  2. USER 为 "SYS"  
  3. SQL> exec dbms_tts.transport_set_check('tb1',true);     --只检查约束   
  4.   
  5. PL/SQL 过程已成功完成。  
  6.   
  7. SQL> exec dbms_tts.transport_set_check('tb2',true);     --只检查约束   
  8.   
  9. PL/SQL 过程已成功完成。  
  10.   
  11. SQL> exec dbms_tts.transport_set_check('tb1',true,true);   --严格检查   
  12.   
  13. PL/SQL 过程已成功完成。  
  14.   
  15. SQL> exec dbms_tts.transport_set_check('tb2',true,true);   --严格检查   
  16.   
  17. PL/SQL 过程已成功完成。  
  18.   
  19. SQL> select * from transport_set_violations;           --有记录则不符合要求   
  20.   
  21. 未选定行  

说明:严格方式不只检查表空间集引用的对象(比如表)是否自包含,同时会检查被其它表空间引用的对象(比如索引等),引用者是否在表空间集中。如果待传输表空间是非自包含,可以将多个表空间一起传输。

3.将待传输表空间设置为只读(源数据库上面执行的操作)

  1. SQL> show user  
  2. USER 为 "SYS"  
  3. SQL> alter tablespace tb1 read only;  
  4.   
  5. 表空间已更改。  
  6.   
  7. SQL> alter tablespace tb2 read only;  
  8.   
  9. 表空间已更改。  

4.导出表空间集元数据(源数据库上面执行的操作)

  1. SQL> show user  
  2. USER 为 "SYS"  
  3. SQL> select * from dba_directories where DIRECTORY_NAME = 'EXP';  
  4.   
  5. OWNER                          DIRECTORY_NAME                 DIRECTORY_PATH  
  6. ------------------------------ ------------------------------ --------------------------------------------------   
  7. SYS                            EXP                            /u01/exp  
  8.   
  9. SQL> !  
  10. [oracle@linux ~]$ cd /u01/exp/  
  11. [oracle@linux exp]$ ll  
  12. 总计 0  
  13. [oracle@linux exp]$ exp \"sys/oracle@orcl as sysdba\" tablespaces=tb1 transport_tablespace=y file=tb1.dmp  
  14. [oracle@linux exp]$ expdp system/oracle@orcl directory=exp dumpfile=tb2.dmp transport_tablespaces=tb2 nologfile=y  
  15. [oracle@linux exp]$ ll  
  16. 总计 96  
  17. -rw-r--r-- 1 oracle oinstall 16384 10-06 12:27 tb1.dmp   
  18. -rw-r----- 1 oracle oinstall 77824 10-06 12:29 tb2.dmp  

5.转换字节顺序,如果两个平台的字节顺序不一样,中间需要一个转换过程,可以使用rman。(可选操作,这里并没有执行。)

  1. RMAN> convert tablespace books to platform 'Microsoft Windows IA (32-bit)' format '/tmp/%N_%F';  
  2. RMAN> convert datafile '/tmp/BOOKS_5' db_file_name_convert '/tmp/BOOKS_5','/tmp/books01.dbf';  

说明:这就是第一步检查的目的,虽然这里并不需要转换。这里给出的只是转换的方法。

6.复制元数据和数据文件到目标数据库(目标数据库上面执行的操作)

  1. [root@linux u01]# chown -R oracle:oinstall tb/  
  2. [root@linux u01]# cd tb/  
  3. [root@linux tb]# ll  
  4. 总计 20624  
  5. -rw-r--r-- 1 oracle oinstall 10493952 10-07 12:40 tb1.dbf   
  6. -rw-r--r-- 1 oracle oinstall    16384 10-07 12:40 tb1.dmp   
  7. -rw-r--r-- 1 oracle oinstall 10493952 10-07 12:40 tb2.dbf   
  8. -rw-r--r-- 1 oracle oinstall    77824 10-07 12:40 tb2.dmp   
  9. [root@linux tb]# pwd  
  10. /u01/tb  

7.修改源数据库的表空间为读写(源数据库上面执行的操作)

  1. SQL> show user  
  2. USER 为 "SYS"  
  3. SQL> alter tablespace tb1 read write;  
  4.   
  5. 表空间已更改。  
  6.   
  7. SQL> alter tablespace tb2 read write;  
  8.   
  9. 表空间已更改。  

8.检查源表空间和目标数据库的块大小是否一样

源数据库

  1. SQL> select block_size from dba_tablespaces where tablespace_name = 'TB1';  
  2.   
  3. BLOCK_SIZE  
  4. ----------   
  5.       8192  
  6.   
  7. SQL> select block_size from dba_tablespaces where tablespace_name = 'TB2';  
  8.   
  9. BLOCK_SIZE  
  10. ----------   
  11.       8192  
  12.   
  13. SQL> show parameter db_block_size  
  14.   
  15. NAME                                 TYPE        VALUE  
  16. ------------------------------------ ----------- ------------------------------   
  17. db_block_size                        integer     8192  

目标数据库

  1. SQL> show parameter db_block_size  
  2.   
  3. NAME                                 TYPE        VALUE  
  4. ------------------------------------ ----------- ------------------------------   
  5. db_block_size                        integer     8192  
  • 1
  • 2
  • 下一页

相关内容