引用文章,略有删减,经过测试,先放解决方法和结论
结论和解决方法:
--低版本导出到高版本时,没问题
--高版本导出低版本时,有问题,高版本导出时需要加version参数(指定要导入低版本数据库的版本号)
--11g中导出
expdp SYDBA/WHSSYDBA@hs03 schemas=SSDBA dumpfile=SSDBA.dmp DIRECTORY=SS_bak LOGFILE=SS_Log:expdp_SSDBA.log version=10.2.0.4.0
--10中导入
impdp SYDBA/WHSSYDBA@hs03 schemas=SSDBA dumpfile=SSDBA.dmp DIRECTORY=SS_bak LOGFILE=SS_Log:impdp_SSDBA.log
当我们回顾Oracle产品工具发展历程,不能不承认Exp/Imp的成功。从早期的版本到现在11g,Exp/Imp都是开发人员最常使用、也是最简单使用的数据库逻辑备份工具。
但是随着Oracle产品的不断发展和现实环境中数据海量化,Exp/Imp已经不能满足实际需要了。Oracle在10g版本中正式推出了数据泵(Data Pump),也就是Expdp/Impdp产品。在很多方面,Data Pump解决或者缓解了Exp/Imp的一些缺陷。
1、版本陷阱
经常使用Exp/Imp的朋友可能都有过这样的经历:将数据导出到本地机器上,再导入到一台新服务器上的时候,经常会报版本错误。不同的数据库服务器版本、不同的客户端版本都会影响到我们导出数据dump文件,影响我们导入操作的成功。
这样情况的本质原因有两个:一个是Exp/Imp是一个客户端工具,工具程序是驻留在客户端上的。不同版本的客户端必然带来不同的Exp/Imp操作行为,写入的Dump文件也必然有一定差异。这就考验客户端程序的兼容性。
另一个方面的原因是数据库服务器的版本兼容性。每一个版本中,Oracle推出的新特性和属性,我们很难要求低版本服务器来兼容支持。Oracle可以做到向后兼容,但是不能做到“预知未来”。
所以,在Exp/Imp的使用过程中,我们经常会讨论的问题有两个,一个是字符集的匹配,另一个就是版本导出策略。
在Data Pump的使用过程中,也会有版本差异的问题。不过,Data Pump版本的架构特点决定了版本差异会得到一定程度的解决。
与Exp/Imp工具不同的是,Data Pump是一个服务端工具,只运行在数据库服务器端。这就让Data Pump不受到客户端版本的影响。同时,Oracle考虑到版本差异的影响,也给Data Pump进行了很多额外的配置。其中,version参数就是可以解决问题的方案。
...
2、实验环境介绍
Data Pump从10g开始推出,所以最大版本间的差异存在于Oracle 10g与11g之间。笔者选择两个环境进行测试。
10g环境是Oracle Windows版本,创建Directory对象。
...
3、从10g到11g
首先我们测试从10g到11g的情况。如果我们从10g中导出Dump文件,导入到11g上,有没有什么问题呢?
我们先成10g上导出dmp文件。
C:Documents and SettingsAdministrator>expdp "/ as sysdba" directory=verdmp dumpfile=scottdmp.dmp schemas=scott
...
导入11g
[oracle@oracle11g ~]$ impdp userid=/ as sysdba directory=verdmp dumpfile=SCOTTDMP.DMPremap_schema=scott:test
导入成功。我们得到了结论:在使用Data Pump时候,从低版本导出的dmp文件可以导入到高版本的数据库服务器上。这个过程,不需要额外的配置。
...
4、11g到10g
下面尝试将从11g转移到10g版本。
[oracle@oracle11g ~]$expdp userid=/ as sysdba directory=verdmp dumpfile=testdmp.dmp schemas=test reuse_dumpfiles=y
...
导出文件成功,将dmp文件传输到10g环境去导入。
--导入文件
D:verdmp>impdp "/ as sysdba" directory=verdmp dumpfile=testdmp.dmp
Import: Release 10.2.0.1.0 - Production on星期六, 24 11月, 2012 17:02:19
Copyright (c) 2003, 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
ORA-39001:参数值无效
ORA-39000:转储文件说明错误
ORA-39142:版本号3.1 (在转储文件"D:verdmp estdmp.dmp"中)不兼容
...
报错,明显是版本错误。解决问题的方法,就是在导出expdp的时候,使用version参数限制dmp文件的格式。官方的文档中,对version参数如下:
VERSION
Version of objects to export.
Valid keyword values are: [COMPATIBLE], LATEST or any valid database version.
...
我们重新导出文件。
[oracle@oracle11g ~]$ expdp userid=/ as sysdba directory=verdmpdumpfile=testdmp_10g.dmp schemas=test reuse_dumpfiles=yversion=10.2.0.1.0
...
重新导入文件。
--重新导入
D:verdmp>impdp "/ as sysdba" directory=verdmpdumpfile=testdmp_10g.dmpremap_tablespace=test:tptest
Import: Release 10.2.0.1.0 - Production on星期六, 24 11月, 2012 17:16:52
Copyright (c) 2003, 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
已成功加载/卸载了主表"SYS"."SYS_IMPORT_FULL_02"
启动"SYS"."SYS_IMPORT_FULL_02": "/******** AS SYSDBA" directory=verdmp dumpfil
e=testdmp_10g.dmp remap_tablespace=test:tptest
处理对象类型SCHEMA_EXPORT/USER
处理对象类型SCHEMA_EXPORT/SYSTEM_GRANT
处理对象类型SCHEMA_EXPORT/ROLE_GRANT
处理对象类型SCHEMA_EXPORT/DEFAULT_ROLE
处理对象类型SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
处理对象类型SCHEMA_EXPORT/TYPE/TYPE_SPEC
ORA-39083:对象类型TYPE创建失败,出现错误:
ORA-02304:无效的对象标识符文字
失败的sql为:
CREATE TYPE "TEST"."T_INFO" OID "5F88C5F6877C43468A5C2CE5F53CEA48" is object (
id number);
ORA-39083:对象类型TYPE创建失败,出现错误:
ORA-02304:无效的对象标识符文字
失败的sql为:
CREATE TYPE "TEST"."T_INFOLIST" OID "49E54F26C4CC4134B65C15C1D91026FC" is tabl
e of t_info;
处理对象类型SCHEMA_EXPORT/DB_LINK
处理对象类型SCHEMA_EXPORT/SEQUENCE/SEQUENCE
(篇幅原因,有省略……)
处理对象类型SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
ORA-39082:对象类型ALTER_PROCEDURE:"TEST"."P_TEST_NC"已创建,但带有编译警告
处理对象类型SCHEMA_EXPORT/VIEW/VIEW
ORA-39082:对象类型VIEW:"TEST"."V_T1"已创建,但带有编译警告
处理对象类型SCHEMA_EXPORT/PACKAGE/PACKAGE_BODY
处理对象类型SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
处理对象类型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
作业"SYS"."SYS_IMPORT_FULL_02"已经完成,但是有4个错误(于17:18:11完成)
存在报错,但是导入的版本问题已经不存在了。这个问题笔者曾经解决过,详细参见(http://space.itpub.net/17203031/viewspace-732501)。
我们通过transform参数来解决这个问题。
D:verdmp>impdp "/ as sysdba" directory=verdmp dumpfile=testdmp_10g.dmp remap_tablespace=test:tptesttransform=oid:n
结论:当从高版本数据库服务器导出,试图导入到低版本数据库服务器的时候,会存在版本冲突问题。解决的方法在导出expdp过程中,使用version参数约定版本号。
注意,impdp程序也有version参数。但是对解决冲突不起作用。Impdp的version是用于生成兼容性SQL语句的。
即使我们在impdp中使用version,也不能起到兼容性作用。
...
5、结论
对Oracle Data Pump而言,版本问题较exp/imp容易的多了。目前Data Pump推出的版本只有10g和11g,相信随着版本的不断演进,数据泵跨版本移植的场景会越来越多。
Tag: Oracle Oracle基础 impdp expdp