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

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

 

可传输表空间实验环境
 OSIPSID存储方式表空间用户
源数据库redhat5.410.10.10.8orcl文件系统tb1,tb2u1,u2

t1,t2

目标数据库redhat5.410.10.10.7orclASM——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


9.把数据文件放到ASM磁盘(因为目标数据库是使用的asm磁盘,这一步也不是必须的,在目标数据库上面操作。)

[oracle@linux tb]$ rman target /

恢复管理器: Release 10.2.0.4.0 - Production on 星期五 10月 7 13:15:00 2011

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

连接到目标数据库: ORCL (DBID=1290103567)

RMAN> convert datafile '/u01/tb/tb1.dbf' format '+datadg';

启动 backup 于 07-10月-11
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=154 devtype=DISK
通道 ORA_DISK_1: 启动数据文件转换
输出文件名=/u01/tb/tb1.dbf
已转换的数据文件 = +DATADG/orcl/datafile/tb1.267.763910145
通道 ORA_DISK_1: 数据文件转换完毕, 经过时间: 00:00:03
完成 backup 于 07-10月-11

RMAN> convert datafile '/u01/tb/tb2.dbf' format '+datadg';

启动 backup 于 07-10月-11
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 启动数据文件转换
输出文件名=/u01/tb/tb2.dbf
已转换的数据文件 = +DATADG/orcl/datafile/tb2.268.763910201
通道 ORA_DISK_1: 数据文件转换完毕, 经过时间: 00:00:01
完成 backup 于 07-10月-11

 

10.在目标数据库上面也要创建和源数据库一样名字和路径的directory目录(在目标数据库上面操作,前面是由于源数据库存在一个directory没有创建。)

SQL> show user
USER 为 "SYS"
SQL> ! mkdir -p /u01/exp

SQL> ! cp /u01/tb/*.dmp /u01/exp

SQL> create directory exp as '/u01/exp';

目录已创建。


11.在目标数据库导入表空间集(在目标数据库上面操作)

u1用户的导入

SQL> show user
USER 为 "SYS"
SQL> create user u1 identified by u1;       --首先要创建u1用户

用户已创建。

SQL> grant connect,resource to u1;

授权成功。
[oracle@linux exp]$ pwd
/u01/exp
[oracle@linux exp]$ imp \"sys/oracle@orcl as sysdba\" tablespaces=tb1 transport_tablespace=y file=tb1.dmp datafiles='+DATADG/orcl/datafile/tb1.267.763910145';      --导入

Import: Release 10.2.0.4.0 - Production on 星期五 10月 7 13:28:39 2011

Copyright (c) 1982, 2007, Oracle.  All rights reserved.


连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

经由常规路径由 EXPORT:V10.02.01 创建的导出文件
即将导入可传输的表空间元数据...
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
. 正在将 SYS 的对象导入到 SYS
. 正在将 SYS 的对象导入到 SYS
. 正在将 U1 的对象导入到 U1
. . 正在导入表                            "T1"
. 正在将 SYS 的对象导入到 SYS
成功终止导入, 没有出现警告。
SQL> conn /as sysdba
已连接。

SQL> alter user u1 default tablespace tb1;

用户已更改。

SQL> conn u1/u1
已连接。
SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
T1                             TABLE

SQL> select count(*) from t1;

  COUNT(*)
----------
        99

u2用户的导入

SQL> conn /as sysdba
已连接。
SQL> show user
USER 为 "SYS"
SQL> create user u2 identified by u2;

用户已创建。

SQL> grant connect,resource to u2;

授权成功。
[oracle@linux exp]$ pwd
/u01/exp
[oracle@linux exp]$ impdp system/oracle@orcl directory=exp dumpfile=tb2.dmp transport_datafiles='+DATADG/orcl/datafile/tb2.268.763910201' nologfile=y;

Import: Release 10.2.0.4.0 - Production on 星期五, 07 10月, 2011 13:33:56

Copyright (c) 2003, 2007, Oracle.  All rights reserved.

连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
已成功加载/卸载了主表 "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" 
启动 "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01":  system/********@orcl directory=exp dumpfile=tb2.dmp transport_datafiles=+DATADG/orcl/datafile/tb2.268.763910201 nologfile=y 
处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK
处理对象类型 TRANSPORTABLE_EXPORT/TABLE
处理对象类型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
作业 "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" 已于 13:34:01 成功完成
SQL> show user
USER 为 "SYS"
SQL> alter user u2 default tablespace tb2;

用户已更改。

SQL> conn u2/u2
已连接。
SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
T2                             TABLE

SQL> select count(*) from t2;

  COUNT(*)
----------
       199

注意:这里导入没有指定schema就默认还是源数据库导出时候的用户。可以指定remap_schema=ing:test这样的参数来转到其他用户下面。如果使用的是imp,就使用fromuser、touser来转换schema。

 

12. 刚导入的表空间默认是read-only 状态,将表空间更改为read write(目标数据库执行)

SQL> show user
USER 为 "SYS"
SQL> select tablespace_name,status from dba_tablespaces where TABLESPACE_NAME like 'TB%';

TABLESPACE_NAME                STATUS
------------------------------ ---------
TB1                            READ ONLY
TB2                            READ ONLY

SQL> alter tablespace tb1 read write;

表空间已更改。

SQL> alter tablespace tb2 read write;

表空间已更改。

SQL> select tablespace_name,status from dba_tablespaces where TABLESPACE_NAME like 'TB%';

TABLESPACE_NAME                STATUS
------------------------------ ---------
TB1                            ONLINE
TB2                            ONLINE
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值