目的
在不同版本的数据库之间进行导入和导出的时候存在的兼容性问题。
应用范围
本文用于实现在oracle7,oracle8,oracle8i,oracle9i,oracle10g和oracle11g
数据库上进行的导入/导出功能,也就是说将数据从版本为X的数据库中导出,然后再数据导入到版本为Y的数据库中去。同时也提供了在执行导入/导出功能时,相关的一些版本的使用情况和在进行数据导出的时候需要进行哪些的准备工作。
在不同版本的数据库进行导入和导出的兼容性问题
兼容性概要
1. 用具有导出功能的数据库将数据导出
2. 用具有导入功能的目标数据库将数据导入
3. Export data dump生成的dump文件和由原来的导出工具生成的dump文件不兼容
4. oracle7的导出工具不支持从oracle9i以及更高的版本导出数据
客户端介绍
1. 导出/导入 客户端
使用oracle的导出/导入功能我们可以在不同的数据库间进行数据对象的迁移,即使他们所使用的硬件平台和软件配置不一样。
Oracle的导出工具从数据库中提取对象定义以及表数据,把他们存储在一个oracle的二进制导出转存文件里这个文件一般放在磁盘或者磁带当中。我们也可以使用FTP或者物理传输(如果是磁带的话)把这个文件传到另外一个站点中去。导出转存文件在网络中传输时必须以二进制的形式存在。如果导出文件是以字符模式(ASCII)形式传输的话当进行文件导入的时候就会引起错误,这些错误结果可能是IMP-9或者IMP-10
紧接在错误IMP-0后。Oracle的导入工具从导出转存文件中读取数据定义以及表数据然后把这些信息插入到目标数据库中去。
2. 导入/导出 数据泵
从oracle 10g
的第一个版本(10.1.1.x)开始,ORACLE引入了导出数据泵(expdp)和导入数据泵(impdp)功能。由导出数据泵创建的导出泵文件只能被导入数据泵所读取,由原来的导出功能创建的导出泵文件是不能被导入数据泵的客户端所读取的。
数据字典视图
1. catexp.sql 脚本
在使用导出/导入功能之前,数据字典必须具备有导出/导入功能所需要的视图。我们可以通过运行以下的脚本来实现:
—— unix:
SQL> connect / as sysdba
SQL>@$ORACLE_HOME/rdbms/admin/catexp.sql
——windows:
SQL>connect / as sysdba
SQL>@%ORACLE_HOME%\rdbms\admin\catexp.sql脚本CATEXP.SQL必须由用户SYS来执行,这个脚本也可以被脚本CATALOG.SQL自动调用。CATEXP.SQL和CATALOG.SQL这两个脚本在数据库中只需要执行一次,通常在运行导出/导入之前我们没有必要再执行这些脚本了(如果需要的视图不正确会出现错误EXP-24或者IMP-23)。
脚本CATEXP.SQL执行完成的是以下的任务:
l 创建数据字典需要的导出/导入 视图
l 创建角色EXP_FULL_DATABASE 和 IMP_FULL_DATABASE
l 分配合适的权限给角色EXP_FULL_DATABASE 和IMP_FULL_DATABASE
l 把EXP_FULL_DATABASE 和 IMP_FULL_DATABASE 分配给角色DBA
2. 脚本 catexp7.sql
当使用Oracle7 导出客户端从oracle8/8i 数据库创建oracle7
导出文件,用户SYS必须在oracle8/8i上运行CATEXP7.SQL:
——unix:
SQL> connect / as sysdba
SQL>@$ORACLE_HOME/rdbms/admin/catexp7.sql
——windows:
SQL>connect / as sysdba
SQL>@%ORACLE_HOME%\rdbms\admin\catexp7.sql
这个脚本创建的导出视图使得oracle8/8i的导出看起来和oracle7的一样,这就意味着在这些视图里是不会看到oracle8/8i
特定的对象,这样的导出文件在oracle7中可以正常的导入。
脚本CATEXP.SQL和CATEXP7.SQL 只需要被执行一次。
CATEXP.SQL
创建在Oracle8/8i/10g/11g导出客户端需要使用的exu8%视图,CATEXP7.SQL创建在Oracle 7
导出端需要使用的exu7%视图。如果这两个脚本已经被SYS 执行过了,我们就不需要再执行一次。
以上提到的方法也同样适用于从Oracle7数据库中创建一个Oracle6导出文件,我们只需要使用SYS用户在Oracle7数据库中运行CATEXP6.SQL脚本就可以了。
需要注意的是:Oracle不支持使用Oracle7导出客户端对Oracle9i数据库进行导出:在向后兼容时,我只支持向后兼容一个版本,这说明了我们同样也不能使用Oracle8导出客户端对Oracle10数据库进行导出(现
在只支持使用Oracle8i 8.1.7或者更高版本的导出客户端对oracle10g数据库进行导出和使用Oracle9i
9.2.0导出端对oracle11g数据库导出)
使用全库 导出/导入 进行数据库迁移
1. 关于直接升级的约束
如果我们使用全库导出/导入的方法将数据库升级到Oracle9i,oracle10g,或者oracle11g,有一个关于直接升级的约束,当然这只是在我们将FULL
模式(FULL=Y)底下导出的export dump file在 FULL 模式的数据库里导入时候才有的。
需要注意的是:从技术角度上一个导入端是可以将由oracle 5.1.22及其更高版本的数据库导出的export dump
files 进行导入,所谓的升级约束是指在升级手册上说明的可能升级路径。支持从一个主要版本的最终
版(oracle 8i 8.1.7)直接迁移到另外一个主要版本(oracle 9i
9.2.0)是因为8.1.7是8i的最后一个版本。
7.3.4是oracle7的最后一个版本
8.0.6是oracle8的最后一个版本
8.1.7是oracle8i的最后一个版本
9.2.0是oracle9i的最后一个版本
10.2.0是oracle10g的最后一个版本
2. 迁移到oracle 9i版本2(9.2.0.x.0)
当源数据库是以下的情况我们可以使用全库导出/导入进行直接的迁移
Migration possible from … to oracle 9i Release 2
(9.2.0.x.0);
Oracle7 :7.3.4 (7.3.4.5.0 recommended)
Oracle8 :8.0.6 (8.0.6.3.0 recommended)
Oracle8i Release3 :8.1.7.4.0
Oracle9i Release1 :9.0.1.4.0 (9.0.1.5.0 for iAS
infrastructure)
3. 迁移到Oracle10g 版本1(10.1.0.x.0)
当源数据库是以下的情况我们可以使用全库导出/导入进行直接的迁移
4. 迁移到Oracle10g 版本2(10.2.0.x.0)
当源数据库是以下的情况我们可以使用全库导出/导入进行直接的迁移
Migration possible from … to oracle 9i Release 2 (9.2.0.x.0);
Oracle7 :7.3.4 (7.3.4.5.0 recommended)
Oracle8 :8.0.6 (8.0.6.3.0 recommended)
Oracle8i Release3 :8.1.7.4.0
Oracle9i Release1 :9.0.1.4.0 (9.0.1.5.0 for iAS
infrastructure)
Migration possible from … to oracle 10g Release 1
(10.1.0.x.0);
Oracle8 :8.0.6 (8.0.6.3.0 recommended)
Oracle8i Release3 :8.1.7.4.0
Oracle9i Release1 : 9.0.1.4.0 (9.0.1.5.0 for Ias
infrastructure)
Oracle9i Release2 : 9.2.0.4.0 (9.2.0.8.0
recommended)
Migration possible from … to oracle 10g Release 2
(10.2.0.x.0);
Oracle8i Release3 :8.1.7.4.0
Oracle9i Release1 : 9.0.1.4.0 (9.0.1.5.0 for Ias
infrastructure)
Oracle9i Release2 :9.2.0.4.0(9.2.0.8.0
recommended)
Oracle10g Release1 :10.1.0.2.0(10.1.0.5.0
recommended)
Oracle9i Release2 : 9.2.0.4.0 (9.2.0.8.0
recommended)
5. 迁移到Oracle11g Release 1(11.1.0.x.0)
当源数据库是以下的情况我们可以使用全库导出/导入进行直接的迁移
6. 范例
1. 从8.1.7.4.0迁移到9.2.0.8.0
— 使用8.1.7.4.0导出客户端运行全库导出
— 使用9.2.0.8.0导入客户端运行全库导入
2. 从8.0.5.0.0迁移到10.2.0.4.0
— 升级8.0.5.0.0数据库到8.0.6.0.0(推荐用8.0.6.3.0)
— 迁移8.0.6.x数据库到9.2.0.4.0(推荐用9.2.0.8.0)
— 使用9.2.0.x导出客户端运行全库导出
— 使用10.2.0.4.0导入客户端运行全库导入或者我们使用8.0.5.0.0导出客户端做一个全库的导出,在10g数
据库里预先定义好用户.然后用10.1.0.2导入客户端进行schema级的导入。
注意:不支持用8.0.5.0.0的导出客户端做全库的导出,然后用10.1.0.2做全库的导入。
3. 从9.2.0.1迁移到11.1.0.6.0
— 运行9.2.0.4.0的补丁包(推荐用9.2.0.8.0)
— 使用9.2.0.8.0的导出客户端做一个全库导出
— 使用11.1.0.6.0的导入客户端做一个全库导入
导入导出工具的兼容性
1. 导出工具
提示:
当把export dump file导入到一个更高版本的数据库中去(比如:把oracle
8i的导入到oracle9i),我们使用的导出工具的版本和源数据库的版本一样(在这个例子里等于oracle8i)如果使用更高版
Migration possible from … to oracle 10g Release 1
(11.1.0.x.0);
Oracle9i Release2 :9.2.0.4.0(9.2.0.8.0
recommended)
Oracle10g Release1 :10.1.0.2.0(10.1.0.5.0
recommended)
Oracle10g Release2 : 10.2.0.1.0 (9.2.0.8.0
recommended)
导出端的兼容:
通常导出端的版本和源数据,目的数据库中版本低的一个一样本的导出工具,导出会发生错误。举个例子:你用9.0.1的导出工具从8.1.7版本的数据库导出会出现下面的错误:
l 当你要把export dump file导入到一个更低版本的数据库中去
(比如:把oracle 9i 的导入到oracle8i), 导出工具的版本应
该和目的数据库的版本一样(在这个例子里是使用oracle8i)。
l 当你从oracle7的数据库中创建oracle6的导出文件,SYS用户要先在oracle7 的数据库上执CATEXP6.SQL
脚本。这个脚本创建的导出视图,让我们感觉就在oracle6数据库上进行导出
l 同理当你从oracle8的数据库中创建oracle7的导出文件,SYS用户要先在oracle7
的数据库上执行CATEXP7.SQL 脚本。这个脚本创建的导出视图,让我们感觉就在oracle7数据库上进行导出
l 当你从oracle9i 的数据库中创建oracle8/8i 的导出文件时,不需要在oracle9i 数据库上去运行oracle8i
版本的catexp.sql脚本。你只需要在oracle9i 上执行8i exp executable
。需要知道的是:在oracle9i 的几个特性是不被支持的。
2. 升级包
安装了升级包后数据字典的导出视图就会被改变,所以不能使用已经升级的导出工具去对还没升级的数据库进行导出。
比如:用9.2.0.5的导出工具去导出9.2.0.1的数据库的时候回出现这样的错误:
要想成功的将9.2.0.1数据库导出,应使用9.2.0.1导出工具而不是9.2.0.2或者更高版本的。
3. 导入端
EXP-00056 Oracle error 942 encountered
ORA-00942 table or view does not exist
EXP-00000 export terminated unsuccessfully
EXP-00008:ORACLE error 942 encountered
ORA-00942: table or view does not exist
EXP-00024: Export views not installed, please
notify your DBA
EXP-00000: Export terminated unsuccessfully
导入端的兼容性:
一般导入工具的版本和目标数据库的版本是一样的
约束
1. 导出/导入的特性和约束
下面是导出/导入客户端的一些约束
Oracle 导出转存文件只能被oracle
导入客户端读取,因为这些转存文件以特定的oracle二进制的格式存储的。所有的导出转存文件都可以导入到一样或者更高版本和打过补丁的数据库中去导出转存文件不能被比他更早以前版本的导入客户端导入。比如:10gR2(10.2.0.x)导出转存文件不能被10gR1(10.1.0.x)导
入端导入(会出现ORA-10.2.0.x 错误)导入端可以读取从5.1.22到和导入端一样版本之间的任意版本导出的export
dump 文件。
Oracle6(或者更早版本)导出客户端不能被用来导出oracle8或者oracle8i更高版本的数据库。
如果用一个低版本的导出客户端对高版本的数据库进行导出,在低版本中不存在的对象类型是不会被导出的。比如:partitionedtable就不会被oracle7的导出端导入,如果你要把版本8的数据库中的partitioned
table放到版本7中去,那么在放入前会把这些表重组合成non-partitioned table.
2. 把数据导入到oracle8或者更低版本的数据库中去
表1:把数据导入到oracle8或者更低版本的数据库我们可以使用什么版本的导出客户端
提示:
1) 导入客户端可以读取由5.1.22或者更高版本(最高到和导入端版本一样)的导出端导出的export dump 文件
2)
从Oracle7导出然后导入到oracle6数据库中:用户SYS必须先在oracle7的数据库上运行CATEXP6.SQL脚本(这个脚本只需要在创建版本6视图的时候运行一次就可以了)。
3)把从Oracle8,Oracle8i导出的数据导入到Oracle7的数据库中:用户SYS必须在Oracle8,Oracle8i
数据库上运行CATEXP7.SQL脚本(这个脚本只需要在创建版本7视图的时候运行一次就可以了)。
4)只有oracle8版本(8.0.6)的终端才在oracle9i数据库中被支持:使用oracle8导出客户端将数据oracle9i数据库中导出然后导入到8.0.6数据库中去。
6.3 导入数据到Oracle8i 或者更高版本的数据库中
图2:当导入到oracle8以及更高版本的时候采用的导出客户端版本
提示:
1)导入客户端可以读取由5.1.22或者更高版本(最高到和导入客户端的版本一样)导出的dump 文件
2)Oracle7导出转存和oracle8/oracle8i/oracle9i导入:如果TO_DATE功能在约束中没有被使用那么数据列的检查约束会失效(这个在早期的版本是没有要求的)
3)为了在oracle10g或者更高的版本之间进行导入/导出的性能和灵活性更好,建议使用Expot data dump(expdp)和
Importdata pump(impdp)客户端。
范例
范例1:从7.3.4导出然后导入到8.1.7
使用7.3.4导出客户端把数据从7.3.4的源数据库中导出
使用8.1.7导入客户端把数据导入到8.1.7目的数据库中
范例2:从9.2.0.8导出然后导入到9.2.0.8
使用9.2.0.8导出客户端把数据从9.2.0.8的源数据库中导出
使用9.2.0.8导入客户端把数据导入到9.2.0.8目的数据库中
范例3:从9.2.0导出然后导入到8.1.7
使用8.1.7导出客户端把数据从9.2.0的源数据库中导出
使用8.1.7导入客户端把数据导入到8.1.7目的数据库中
范例4:从8.1.7.4导出然后导入到11.1.0.6
使用8.1.7.4导出客户端把数据从8.1.7.4的源数据库中导出
使用11.1.0.6导入客户端把数据导入到11.1.0目的数据库中
范例5:从9.2.0导出然后导入到7.3.4不被支持;但是有如下变通的方案
使用8.1.7.4导出客户端把数据从9.2.0源数据库中导出
使用8.1.7.4的导入客户端把数据临时的导入到8.1.7.4.0数据库中
为了创建Oracle7数据字典视图需要在8.1.7.4数据库上运行CATEXP7.SQL脚本(如果以前运行过就不需要再运行了)
使用7.3.4导出客户端从临时的8.1.7.4数据库中把数据导出
使用7.3.4导入端把数据导入到7.3.4数据库
范例6:从7.3.4 导出然后导入到11.1.0
使用7.3.4导出客户端把数据从7.3.4数据库中导出
使用11.1.0导入端把数据导入到11.1.0数据库中
需要注意的是不支持使用FULL=Y模式导出和FULL=Y模式导出 的迁移
范例7:从10.1.0.5导出然后导入到10.2.0.4
使用10.1.0.5导出数据泵客户端(expdp)把数据从10.1.0.5数据库导出
使用10.2.0.4导入数据泵客户端(impdp)把数据导入10.2.0.4数据库中可能出现的出错信息
1. EXP-3(找不到XX段的存储定义 )
原因:找不到集群/索引/表的存储定义。
方法:记录下错误信息,作为内部导出错误报告
建议:参考Note 274076.1:“EXP-0003
当使用早于9.2.0.5.0版本的导出客户端从9.2.0.5.0或者更高的版本进行导出”
2. EXP-24(没安装导出视图,请通知DBA)
原因:没有安装必要的导出视图
方法:让数据库管理员安装需要的导出视图
3. EXP-37(导出视图和数据库的版本不兼容)
原因:导出工具的版本比数据库版本高,所以不兼容
方法:使用和导出数据库一样版本的的导出工具
4. IMP-0 (导入终止)
原因:发生错误
方法:检查错误信息然后采取合适的措施
5. IMP-9(导出文件的异常结束)
EXP-0003:no storage definition found for segment (%lu , %lu)
EXP-00024:Export views not installed ,please notify your DBA
EXP-00037:Export views not compatible with database version
IMP00000:Import terminated unsuccessfully
IMP-00009:Abnormal end of of export file
原因:这通常是由一个被取消的导出会话生成的导出文件引起的
方法:检查这个文件是否是二进制模式。如果这个导出文件是由一个被取消的导出会话生成的,重新尝试导入这个导出文件,或者把他作为一个导入错误报告。
6. IMP-10(不是一个有效的导出文件,文件头部错误)
原因:可是这个文件不是利用导出工具导出的文件,或者这个导出文件被破坏了。
方法:检查这个文件是否二进制模式。如果这个文件确实是由导出工具导出的而且没有兼容性的问题,把它作为一个导出错误报告。
7. IMP-21 (操作系统错误—错误代码(XXX))
原因:操作系统错误。这个错误可能和IMP-10或者IMP-69同时出现。
方法:根据错误代码查看操作系统手册然后采取合适的措施,如果错误IMP-10或者IMP-69一起出现的话需要检查下兼容性的问题。
8. IMP-23(导入视图没有安装,请通知DBA)
原因:导入视图没有安装
方法:通知DBA安装导入视图
9. IMP-69(不能切换到环境国际字符集的处理)
原因:内部错误
方法:联系支持
IMP-10:Not a valid export file, header failed verification
IMP-00021:Operating system error —error code (dec %lu, hex
0x%x)
IMP-23:Import views not installed, please notify your DBA
IMP-00069:Could not convert to environment national character
set’shandle
总结
1. 权限
要使用导出客户端你必须在oracle 数据库上有CREATRE
SESSION这个权限。如果要导出其他用户的表,你必须启动EXP_FULL_DATABASE这个角色,这个角色被授给DBA用户。
2. Oracle NET, Oracle Net8
和SQL*NET如果想在新版本的数据库上使用早期版本的导出客户端,你要使用
SQL*NE,Net8或者Oracle NET来访问这个数据库。
3. 直接路径导出
如果要在Oracle8i或者更高版本的数据库上使用Oracle7或者更低版本的导出客户端,必须使用默认的传统路径导出(不要在导出命令程序里设置DIRECT=YES)一个传统的路径导出使用SQL
SELECT语句把数据
从表中提取出来而直接路径导出是饶过不使用SQL命令程序去直接读取数据(要考虑缓存大小)。
需要注意的是当你在Oracle8i或者更高版本的数据库上使用8.0版本的导出端同时你还设置了直接路径加载(DIRECT=Y)那么导出客户端是不能从包含对象和LOB’S的表中导出行。
4. 导出数据转存和导入数据转存
我们已经介绍了在Oracle10g
版本1(10.1.0.x)新引入的的导出数据转存(expdp)和导入数据转存(impdp)。在未来的版本里原有的导出端(exp)会渐渐的被淘汰由expdp代替,原有的导入客户端会依然被使用来支持由原有的客户端创建的导出转存文件(比如:由oracle9i创建的导出文件)。
5. 导出/导入视图版本
如果想知道导出/导入视图版本你可以通过使用以下的语句查询
sys.props$表:
不同的EXPORT_VIEWS_VERSION 值有不同的意思:
%exp
/@……..
SQL> SELECT * FROM sys.props$ WHERE name LIKE
‘EXPORT%’;
NAME VALUES COMMENT$
------------------------------------ --------
----------------------- ------------
EXPORT_VIEWS_VERSION 8 Export views revision #
EXPORT_VIEWS_VERSION
Value Introduced in Release
*) 7.0.*
1 7.1.3
2 7.2.1
3 7.2.3
4 8.0.1
5 8.0.2
6 8.0.3
7 8.0.4
8 8.1.6
关于NLS_LANG 环境变量在导出/导入中的影响我们可以参考下面的FAQ:
Note 227332.1 “ 在导出/导入时要考虑的NLS问题—这是经常被问到的问题”
参考
Note 1012189.6—当试图去导入已经被转移的导出文件是会发生错误
Note 120607.1—ALERT:oracle(8.1.7)支持状态显示和警报
Note 149018.1—ALERT:oracle9i(9.0.1)支持状态显示和警报
Note 155477.1—DIRECT参数:传统的路径导出和直接路径导出
Note 189908.1—ALERT:oracle9i版本2(9.2)支持状态显示和警报
Note 207303.1—客户端/服务器段/不同的oracle版本的相互支持
Note 227332.1—导出导入时要考虑NLS问题—这是经常被问到的问题
Note 263719.1—oracle10g版本1(10.1)支持状态显示和警报
Note 277650.1—跨平台或者32、64位传输数据时怎样使用导出/导入
Note 291024.1—用导出/导入进行转移表空间的兼容性及一些新特性
Note 316900.1—oracle10g版本2(10.2)支持状态显示和警报
Note 345187.1—过时的特性—原来的导出端10.2
Note 454507.1—oracle11g版本1(11.1)支持状态显示和警报
Note 50220.1—ALERT: oracle7.3.4支持状态显示和警报
Note 55337.1—导出/导入数据转存参数VERSION—不同版本数据库之间的数据转存兼容
Note 61949.1—Oracle7导出/导入 概述
Note 72529.1—ALERT:oracle8.0.6支持状态显示和警报
Note 76542.1—NT:从Oracle8导出然后导入到oracle7
错误
PLS—302 “%s”组件必须被申明
EXP—3 “没有发现(%lu,%lu)段的存储定义”
EXP—56 placeholder for OCI error
EXP—24 “导出视图没安装,请通知DBA”
EXP—8 发生ORACLE %lu 错误
EXP—0 导出非正常终止
EXP—37 导出视图和数据库的版本不兼容
IMP—23 导入视图没有安装,请通知DBA
IMP—10 导出文件无效,文件头错误
IMP—0 导入非正常终止
IMP—21 操作系统错误,错误代码是(dec,%lu,hex 0x%x)
IMP—9 导出文件的非正常结束
IMP—69 不能转换到环境国际字符集的处理端
ORA—942 表或视图不存在
ORA—2248 ALTER SESSION 的无效选项
ORA—6550
行,列<>num: