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
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