使用可传输表空间的特性复制数据
使用可传输表空间的特性复制数据
可传输表空间的限制:传输表空间技术不能应用于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来传输。
下面给出创建测试环境的脚本(源数据库上面执行的操作)
- USER 为 "SYS"
- SQL> create tablespace tb1 datafile '/u01/app/Oracle/oradata/orcl/tb1.dbf' size 10m;
- 表空间已创建。
- SQL> create tablespace tb2 datafile '/u01/app/oracle/oradata/orcl/tb2.dbf' size 10m;
- 表空间已创建。
- SQL> create user u1 identified by u1 default tablespace tb1;
- 用户已创建。
- SQL> create user u2 identified by u2 default tablespace tb2;
- 用户已创建。
- SQL> grant connect,resource to u1,u2;
- 授权成功。
- SQL> create table u1.t1 as select * from dba_objects where rownum < 100;
- 表已创建。
- SQL> create table u2.t2 as select * from dba_objects where rownum < 200;
- 表已创建。
- SQL> select count(*) from u1.t1;
- COUNT(*)
- ----------
- 99
- SQL> select count(*) from u2.t2;
- COUNT(*)
- ----------
- 199
可传输表空间实战
1.确认要传输表空间的平台是否兼容(源数据库和目标数据库上面都一样,因为都是redhat5.4的OS)
- SQL> select tp.* from v$transportable_platform tp,v$database d where tp.PLATFORM_NAME = d.PLATFORM_NAME;
- PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT
- ----------- ----------------------------------- --------------
- 10 Linux IA (32-bit) Little
2.确认传输的表空间是否自包含(源数据库上面执行的操作)
- SQL> show user
- USER 为 "SYS"
- SQL> exec dbms_tts.transport_set_check('tb1',true); --只检查约束
- PL/SQL 过程已成功完成。
- SQL> exec dbms_tts.transport_set_check('tb2',true); --只检查约束
- PL/SQL 过程已成功完成。
- SQL> exec dbms_tts.transport_set_check('tb1',true,true); --严格检查
- PL/SQL 过程已成功完成。
- SQL> exec dbms_tts.transport_set_check('tb2',true,true); --严格检查
- PL/SQL 过程已成功完成。
- SQL> select * from transport_set_violations; --有记录则不符合要求
- 未选定行
说明:严格方式不只检查表空间集引用的对象(比如表)是否自包含,同时会检查被其它表空间引用的对象(比如索引等),引用者是否在表空间集中。如果待传输表空间是非自包含,可以将多个表空间一起传输。
3.将待传输表空间设置为只读(源数据库上面执行的操作)
- SQL> show user
- USER 为 "SYS"
- SQL> alter tablespace tb1 read only;
- 表空间已更改。
- SQL> alter tablespace tb2 read only;
- 表空间已更改。
4.导出表空间集元数据(源数据库上面执行的操作)
- SQL> show user
- USER 为 "SYS"
- SQL> select * from dba_directories where DIRECTORY_NAME = 'EXP';
- OWNER DIRECTORY_NAME DIRECTORY_PATH
- ------------------------------ ------------------------------ --------------------------------------------------
- SYS EXP /u01/exp
- SQL> !
- [oracle@linux ~]$ cd /u01/exp/
- [oracle@linux exp]$ ll
- 总计 0
- [oracle@linux exp]$ exp \"sys/oracle@orcl as sysdba\" tablespaces=tb1 transport_tablespace=y file=tb1.dmp
- [oracle@linux exp]$ expdp system/oracle@orcl directory=exp dumpfile=tb2.dmp transport_tablespaces=tb2 nologfile=y
- [oracle@linux exp]$ ll
- 总计 96
- -rw-r--r-- 1 oracle oinstall 16384 10-06 12:27 tb1.dmp
- -rw-r----- 1 oracle oinstall 77824 10-06 12:29 tb2.dmp
5.转换字节顺序,如果两个平台的字节顺序不一样,中间需要一个转换过程,可以使用rman。(可选操作,这里并没有执行。)
- RMAN> convert tablespace books to platform 'Microsoft Windows IA (32-bit)' format '/tmp/%N_%F';
- RMAN> convert datafile '/tmp/BOOKS_5' db_file_name_convert '/tmp/BOOKS_5','/tmp/books01.dbf';
说明:这就是第一步检查的目的,虽然这里并不需要转换。这里给出的只是转换的方法。
6.复制元数据和数据文件到目标数据库(目标数据库上面执行的操作)
- [root@linux u01]# chown -R oracle:oinstall tb/
- [root@linux u01]# cd tb/
- [root@linux tb]# ll
- 总计 20624
- -rw-r--r-- 1 oracle oinstall 10493952 10-07 12:40 tb1.dbf
- -rw-r--r-- 1 oracle oinstall 16384 10-07 12:40 tb1.dmp
- -rw-r--r-- 1 oracle oinstall 10493952 10-07 12:40 tb2.dbf
- -rw-r--r-- 1 oracle oinstall 77824 10-07 12:40 tb2.dmp
- [root@linux tb]# pwd
- /u01/tb
7.修改源数据库的表空间为读写(源数据库上面执行的操作)
- SQL> show user
- USER 为 "SYS"
- SQL> alter tablespace tb1 read write;
- 表空间已更改。
- SQL> alter tablespace tb2 read write;
- 表空间已更改。
8.检查源表空间和目标数据库的块大小是否一样
源数据库
- SQL> select block_size from dba_tablespaces where tablespace_name = 'TB1';
- BLOCK_SIZE
- ----------
- 8192
- SQL> select block_size from dba_tablespaces where tablespace_name = 'TB2';
- BLOCK_SIZE
- ----------
- 8192
- SQL> show parameter db_block_size
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- db_block_size integer 8192
目标数据库
- SQL> show parameter db_block_size
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- db_block_size integer 8192
|
评论暂时关闭