利用exp/imp传输表空间
传输表空间TABLESPACES、TRANSPORT_TABLESPACE、TTS_FULL_CHECK
使用exp/imp将表空间data_tbs从a库传输到b库?下面是准备工作。
create tablespace data_tbs;
create tablespace idx_tbs;
create table t(x varchar2(10))tablespace data_tbs;
create index idx_t on t(x) tablespaceidx_tbs;
insert into t ;
(1)在sys用户下创建的(注:导出是错误的)
C:\Documents and Settings\Administrator>set oracle_sid=orcl
C:\Documents and Settings\Administrator>sqlplus sys/ymh assysdba;
SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 6月 24 10:36:38 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 -Production
With the Partitioning, OLAP and Data Mining options
SQL> CREATE TABLESPACE data_tbs
2 DATAFILE 'data_tbs' SIZE 100M AUTOEXTEND ONNEXT 100M MAXSIZE UNLIMITED LOGGING
3 EXTENT MANAGEMENT LOCAL SEGMENT SPACEMANAGEMENT AUTO ;
表空间已创建。
SQL> CREATE TABLESPACE idx_tbs
2 DATAFILE 'idx_tbs' SIZE 10M AUTOEXTEND ONNEXT 10M MAXSIZE UNLIMITED LOGGING
3 EXTENT MANAGEMENT LOCAL SEGMENT SPACEMANAGEMENT AUTO ;
表空间已创建。
SQL> create table t(x varchar2(10)) tablespace data_tbs;
表已创建。
SQL> create index idx_t on t(x) tablespace idx_tbs;
索引已创建。
SQL> insert into t select object_id from dba_objects;
已创建50407行。
SQL> insert into t select * from t;
已创建50407行。
SQL> commit;
SQL> alter tablespace data_tbs read only;
表空间已更改。
SQL> alter tablespace idx_tbs read only;
表空间已更改。
SQL> Executesys.dbms_tts.transport_set_check('data_tbs',TRUE,TRUE);
PL/SQL 过程已成功完成。
SQL> SELECT * FROMsys.transport_set_violations;
VIOLATIONS
--------------------------------------------------------------------------------
Index SYS.IDX_T in tablespace IDX_TBS points to table SYS.T intablespace DATA_T
BS
Sys owned object T intablespace DATA_TBS not allowed in pluggable set
SQL> delete from sys.transport_set_violations;
已删除2行。
SQL> Executesys.dbms_tts.transport_set_check('data_tbs,idx_tbs',TRUE,TRUE);
PL/SQL 过程已成功完成。
SQL> SELECT * FROM sys.transport_set_violations;
VIOLATIONS
-------------------------------------------------------------------------------
Sys owned object IDX_Tin tablespace IDX_TBS not allowed in pluggable set
Sys owned object T intablespace DATA_TBS not allowed in pluggable set
SQL> exit
从 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 -Production
With the Partitioning, OLAP and Data Mining options 断开
C:\Documents and Settings\Administrator>exp \"sys/ymhas sysdba\" file=d:/tbs.dmp tablespaces=(data_tbs,idx_tbs) transport_Tab
Export: Release 10.2.0.1.0 - Production on 星期五 6月 24 11:16:40 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 -Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
注: 将不导出表数据 (行)
即将导出可传输的表空间元数据...
EXP-00008: 遇到 ORACLE 错误 29341
ORA-29341: 可传送集不是自包含的
ORA-06512: 在 "SYS.DBMS_PLUGTS", line 1387
ORA-06512: 在 line 1
EXP-00000: 导出终止失败
C:\Documents and Settings\Administrator>
注:sys用户下有问题,具体看后面的总结
(2)使用scott 用户操作
C:\Documents and Settings\Administrator>sqlplus sys/ymh assysdba;
SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 6月 24 13:24:34 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 -Production
With the Partitioning, OLAP and Data Mining options
SQL> drop table t;
表已删除。
SQL> alter tablespace data_tbs read write;
表空间已更改。
SQL> alter tablespace idx_tbs read write;
表空间已更改。
SQL> conn scott/tiger
已连接。
SQL> create table t2(x varchar2(10)) tablespace data_tbs;
表已创建。
SQL> create index idx_t on t2(x) tablespace idx_tbs;
索引已创建。
SQL> insert into t2 select object_id from all_objects;
已创建46677行。
SQL> insert into t2 select object_id from all_objects;
已创建46677行。
SQL> commit;
提交完成。
SQL> conn sys/ymh as sysdba;
已连接。
SQL> Executesys.dbms_tts.transport_set_check('data_tbs',TRUE,TRUE); ===========>单个表空间自包含检查
PL/SQL 过程已成功完成。
SQL> SELECT * FROM sys.transport_set_violations;===========>有一个关联,自包含检查不通过
VIOLATIONS
--------------------------------------------------------------------------------
Index SCOTT.IDX_T in tablespace IDX_TBS points to tableSCOTT.T2 in tablespace DATA_TBS
SQL> delete from sys.transport_set_violations;
已删除 1 行。
SQL> commit;
提交完成。
SQL> Executesys.dbms_tts.transport_set_check('data_tbs,idx_tbs',TRUE,TRUE); ===========>两个有关联的表空间自包含检查
PL/SQL 过程已成功完成。
SQL> SELECT * FROM sys.transport_set_violations;===========>两个一起检查通过
未选定行
SQL> alter tablespace data_tbs read only;
表空间已更改。
SQL> alter tablespace idx_tbs read only;
表空间已更改。
SQL> exit
从 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 -Production
With the Partitioning, OLAP and Data Mining options 断开
C:\Documents and Settings\Administrator>exp \"sys/ymhas sysdba\" file=d:/tbs.dmp tablespaces=(data_tbs,idx_tbs)transport_tablespace=y
tts_full_check=y
=======================>将两个表空间一起导出,不要数据(tablespaces=(data_tbs,idx_tbs):要导出的表空间;transport_tablespace=y:只导出元数据;tts_full_check=y进行完全自包含检查)
Export: Release 10.2.0.1.0 - Production on 星期五 6月 24 14:21:22 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 -Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
注: 将不导出表数据 (行)
即将导出可传输的表空间元数据...
对于表空间 DATA_TBS...
. 正在导出簇定义
. 正在导出表定义
. . 正在导出表 T2 ===========è没有数据导出
对于表空间 IDX_TBS...
. 正在导出簇定义
. 正在导出表定义
. 正在导出引用完整性约束条件
. 正在导出触发器
. 结束导出可传输的表空间元数据
成功终止导出, 没有出现警告。
(3)复制文件
C:\Documents and Settings\Administrator>sqlplus sys/ymh assysdba;
SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 6月 24 13:44:37 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 -Production
With the Partitioning, OLAP and Data Mining options
SQL> select name from v$datafile where name like '%_TBS';
NAME
--------------------------------------------------------------------------------
D:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\DATA_TBS
D:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\IDX_TBS
SQL> exit
从 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options 断开
C:\Documents and Settings\Administrator>copyD:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\IDX_TBSD:\oracle\product\10.2.0\oradata\test
已复制 1 个文件。
C:\Documents and Settings\Administrator>copyD:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\DATA_TBSD:\oracle\product\10.2.0\oradata\test
已复制 1 个文件。
C:\Documents and Settings\Administrator>cd ../..
C:\>d:
D:\>cd D:\oracle\product\10.2.0\oradata\test
D:\oracle\product\10.2.0\oradata\test>dir *_tbs
驱动器 D 中的卷是安装
卷的序列号是3451-8864
D:\oracle\product\10.2.0\oradata\test 的目录
2011-06-24 13:28 104,865,792 DATA_TBS
2011-06-24 13:28 10,493,952 IDX_TBS
2 个文件 115,359,744 字节
0 个目录40,376,631,296 可用字节
D:\oracle\product\10.2.0\oradata\test>
(4)导入另一个库
C:\Documents and Settings\Administrator>set oracle_sid=test
C:\Documents and Settings\Administrator>echo %oracle_sid%
test
C:\Documents and Settings\Administrator>sqlplus sys/ymh assysdba;
SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 6月 24 13:54:59 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 -Production
With the Partitioning, OLAP and Data Mining options
SQL> show parameter service
NAME TYPE VALUE
------------------------------------ -------------------------------------
service_names string test
C:\Documents and Settings\Administrator>imp sys/ymh@test assysdba' file='d:/tbs.dmp' tablespaces=(data_tbs,idx_tbs) transport_tablespace=y
datafiles='D:\oracle\product\10.2.0\oradata\test\DATA_TBS,D:\oracle\product\10.2.0\oradata\test\IDX_TBS
Import: Release 10.2.0.1.0 - Production on 星期五 6月 24 14:45:00 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 -Production
With the Partitioning, OLAP and Data Mining options
经由常规路径由 EXPORT:V10.02.01 创建的导出文件
即将导入可传输的表空间元数据...
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
. 正在将 SYS 的对象导入到 SYS
. 正在将 SYS 的对象导入到 SYS
. 正在将 SCOTT 的对象导入到 SCOTT
. . 正在导入表 "T2"
. 正在将 SYS 的对象导入到 SYS
成功终止导入, 没有出现警告。
(5)检查数据
C:\Documents and Settings\Administrator>sqlplusscott/tiger@test
SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 6月 24 14:46:07 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 -Production
With the Partitioning, OLAP and Data Mining options
SQL> conn sys/ymh@test as sysdba;
已连接。
SQL> show parameter service
NAME TYPE VALUE
------------------------------------ -----------------------------------------
service_names string test
SQL> conn scott/tiger
已连接。
SQL> select count(1) from t2;
COUNT(1)
----------
93354
SQL>
总结错误:(1) ORA-29335: 表空间 'DATA_TBS' 不为只读
导出的表空间必须为只读状态,否则出现如下错误
EXP-00008: 遇到 ORACLE 错误 29335
ORA-29335: 表空间 'DATA_TBS' 不为只读
ORA-06512: 在 "SYS.DBMS_PLUGTS", line 507
ORA-06512: 在 line 1
EXP-00000: 导出终止失败
(2) ORA-29341: 可传送集不是自包含的
“可传送集不是自包含的”的两种处理方法:
1、将所有的依赖表空间一起传,比如该题中,一个表空间会出现自检错误,两个表空间同时自检则不会。
SQL> Executesys.dbms_tts.transport_set_check('data_tbs',TRUE,TRUE);
SQL> SELECT * FROM sys.transport_set_violations;
VIOLATIONS
--------------------------------------------------------------------------------
Index SCOTT.IDX_T in tablespace IDX_TBS points to tableSCOTT.T2 in tablespace DATA_TBS
SQL> Executesys.dbms_tts.transport_set_check('data_tbs,idx_tbs',TRUE,TRUE);
SQL> SELECT * FROM sys.transport_set_violations;
未选定行
SQL>
2、讲表空间处理为自包含:比如将索引删除,导到其他数据库后重建索引,或者将索引重建到数据文件的表空间,然后导出一个表空间
注意:当再sys或system用户下创建表时,使用表空间传输也会出现“可传送集不是自包含的”,并且无法两个表空间同时传输,所以最好必要导出sys和system建表使用的表空间,不管是不是自带的system还是新建的表空间。
EXP-00008: 遇到 ORACLE 错误 29341
ORA-29341: 可传送集不是自包含的
ORA-06512: 在 "SYS.DBMS_PLUGTS", line 1387
ORA-06512: 在 line 1
EXP-00000: 导出终止失败
(3) IMP-00053: 导入模式与导出转储文件不兼容
1、可能是跨平台时存储格式不同导致(未测试)
2、同一平台下,注意导出的参数和导入的参数,因为导出时忘了加transport_tablespace=y ,把数据也改导出,导入时又加入该参数,导致错误:
IMP-00053: 导入模式与导出转储文件不兼容
IMP-00000: 未成功终止导入
(4) ORA-27041: 无法打开文件 O/S-Error: (OS2) 系统找不到指定的文件。
一个普通的导入错误
IMP-00003: 遇到 ORACLE 错误 1565
ORA-01565: 标识文件'D:\oracle\product\10.2.0\oradata\test\DATA_TBS' 时出错
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
ORA-06512: 在 "SYS.DBMS_PLUGTS", line 1801
ORA-06512: 在 line 1
IMP-00000: 未成功终止导入
(5) ORA-19722: 数据文件D:\oracle\oradata\DATA_TBS版本错误
表空间设置为只读就是为了保证数据的一致性,因此只有讲表空间的数据文件拷贝完成之后才能在源数据库恢复表空间的可读写状态。
否则,在目标数据库导入的时候就会出现下列错误:
IMP-00003: 遇到 ORACLE 错误 19722
ORA-19722: 数据文件D:\oracle\oradata\DATA_TBS版本错误
ORA-06512: 在 "SYS.DBMS_PLUGTS", line 2065
ORA-06512: 在 line 1
IMP-00000: 未成功终止导入
(6) PLS-00201: 必须声明标识符'DBMS_PLUGTS.NEWTABLESPACE'
使用普通用户或system用户导入时如果出现如下错误,可以使用 'sys/ymh as sysdba'来导入,可以加入参数TTS_OWNERS=scott(TTS_OWNERS未详细测试)
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
IMP-00003: 遇到 ORACLE 错误 6550
ORA-06550: 第 1 行, 第 7 列:
PLS-00201: 必须声明标识符 'DBMS_PLUGTS.NEWTABLESPACE'
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
IMP-00000: 未成功终止导入
(7) OSD-04002: 无法打开文件 O/S-Error: (OS123) 文件名、目录名或卷标语法不正确。
如果有多个数据文件,datafile=XXX,XXX,中间用逗号隔开即可,不要用""号将多个概括,否则出现如下错误
IMP-00003: 遇到 ORACLE 错误 1565
ORA-01565: 标识文件'D:\oracle\oradata\DATA_TBS,D:\oracle\oradata\IDX_TBS' 时出错
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 123) 文件名、目录名或卷标语法不正确。
ORA-06512: 在 "SYS.DBMS_PLUGTS", line 1801
ORA-06512: 在 line 1
IMP-00000: 未成功终止导入