一、问题描述与分析: 今天碰到个问题,需求是将Oracle 11g版本的数据用expdp数据泵导出,再把数据导入至Oracle 10版本中,是否可以?一个不错的问题,没做过肯定不能乱说啦。首先我们来猜一下,我认为低版本导入高版本是可以的,高版本导入低版本就不一定了,但是我们想想oracle公司会让11g的库的内容无法导入到低版本吗?答案在实验中,接下来我们就立即做个这个实验,进行验证。二、实验低版本—>高版本 环境:低版本10g(10.2.0.1.0) 高版本11g(11.2.0.1.0) 猜测:可以 结论:可以(1)10g环境中创建测试用户sam,并赋予权限[oracle@test ~]$ sqlplus / as sysdbaSQL*Plus: Release 10.2.0.1.0 - PRoduction on Tue Jan 5 19:06:25 2016Copyright (c) 1982, 2005, Oracle. All rights reserved.Connected to:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP and Data Mining optionsSYS@OCM10G >select username from dba_users where username='SAM';no rows selectedSYS@OCM10G >create user sam identified by sam;User created.SYS@OCM10G >grant connect,resource to sam;Grant succeeded.(2)创建测试表test及数据SYS@OCM10G >conn sam/samConnected.SAM@OCM10G >create table test (id int,name varchar2(10));Table created.SAM@OCM10G >insert into test values (1,'sam');1 row created.SAM@OCM10G >commit;Commit complete.SAM@OCM10G >select * from test; ID NAME---------- ---------- 1 sam(3)创建导出数据时用到的directory并赋(读/写)权限SAM@OCM10G >conn / as sysdbaConnected.SYS@OCM10G >create directory test as '/home/oracle';Directory created.SYS@OCM10G >grant write,read on directory test to sam;Grant succeeded.(4)expdp导出10g数据库中sam用户数据[oracle@test ~]$ ls -l test.dmpls: cannot access test.dmp: No such file or directory[oracle@test ~]$ expdp sam/sam@ocm10g directory=test dumpfile=test.dmp Export: Release 10.2.0.1.0 - 64bit Production on Friday, 08 January, 2016 10:32:37Copyright (c) 2003, 2005, Oracle. All rights reserved.Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP and Data Mining optionsStarting "SAM"."SYS_EXPORT_SCHEMA_01": sam/********@ocm10g directory=test dumpfile=test.dmp Estimate in progress using BLOCKS method...Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATATotal estimation using BLOCKS method: 64 KBProcessing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAProcessing object type SCHEMA_EXPORT/TABLE/TABLEProcessing object type SCHEMA_EXPORT/TABLE/INDEX/INDEXProcessing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTProcessing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSProcessing object type SCHEMA_EXPORT/TABLE/COMMENT. . exported "SAM"."TEST" 5.234 KB 1 rowsMaster table "SAM"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded******************************************************************************Dump file set for SAM.SYS_EXPORT_SCHEMA_01 is: /home/oracle/test.dmpJob "SAM"."SYS_EXPORT_SCHEMA_01" successfully completed at 10:32:44[oracle@test ~]$ ls -l test.dmp-rw-r----- 1 oracle oinstall 143360 Jan 8 10:32 test.dmp(5)创建11g环境,导入数据时用到的directory,创建SAM用户[oracle@test ~]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.1.0 Production on Fri Jan 8 10:34:48 2016Copyright (c) 1982, 2009, Oracle. All rights reserved.Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real application Testing optionsSYS@OCM11G >select username from dba_users where username='SAM';no rows selectedSYS@OCM11G >create user sam identified by sam;User created.SYS@OCM11G >grant connect,resource to sam;Grant succeeded.(6)将test.dmp文件导入11g数据库[oracle@test ~]$ impdp system/oracle@ocm11g directory=test dumpfile=test.dmp Import: Release 11.2.0.1.0 - Production on Fri Jan 8 11:03:37 2016Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsMaster table "SYSTEM"."SYS_IMPORT_FULL_01" successfully loaded/unloadedStarting "SYSTEM"."SYS_IMPORT_FULL_01": system/********@ocm11g directory=test dumpfile=test.dmp Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAProcessing object type SCHEMA_EXPORT/TABLE/TABLEProcessing object type SCHEMA_EXPORT/TABLE/TABLE_DATA. . imported "SAM"."TEST" 5.234 KB 1 rowsJob "SYSTEM"."SYS_IMPORT_FULL_01" successfully completed at 11:03:39(7)检查用户及导入数据[oracle@test ~]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.1.0 Production on Fri Jan 8 11:03:54 2016Copyright (c) 1982, 2009, Oracle. All rights reserved.Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSYS@OCM11G >SYS@OCM11G >conn sam/samConnected.SAM@OCM11G >select * from test; ID NAME---------- ---------- 1 sam高版本—>低版本 环境:高版本11g(11.2.0.1.0) 低版本10g(10.2.0.1.0) 猜测:不成 结论:可以,要使用version参数(1)10g库中创建测试用户suzzy,并赋予权限[oracle@test ~]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.1.0 Production on Fri Jan 8 11:14:37 2016Copyright (c) 1982, 2009, Oracle. All rights reserved.Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSYS@OCM11G >select username from dba_users where username='SUZZY';no rows selectedSYS@OCM11G >create user suzzy identified by suzzy;User created.SYS@OCM11G >grant connect,resource to suzzy;Grant succeeded.(2)创建测试表test1及数据SYS@OCM11G >conn suzzy/suzzyConnected.SUZZY@OCM11G >create table test1 (id int,name varchar2(10));Table created.SUZZY@OCM11G >insert into test1 values (1,'suzzy');1 row created.SUZZY@OCM11G >commit;Commit complete.SUZZY@OCM11G >select * from test1; ID NAME---------- ---------- 1 suzzy(3)给用户suzzy赋予对导出目录test的读写权限SYS@OCM11G >grant write,read on directory test to suzzy;Grant succeeded.(4)导出11g库中suzzy用户及数据[oracle@test ~]$ expdp suzzy/suzzy@ocm11g directory=test dumpfile=test1.dmpExport: Release 11.2.0.1.0 - Production on Fri Jan 8 11:29:14 2016Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsStarting "SUZZY"."SYS_EXPORT_SCHEMA_01": suzzy/********@ocm11g directory=test dumpfile=test1.dmp Estimate in progress using BLOCKS method...Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATATotal estimation using BLOCKS method: 64 KBProcessing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAProcessing object type SCHEMA_EXPORT/TABLE/TABLEProcessing object type SCHEMA_EXPORT/TABLE/INDEX/INDEXProcessing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTProcessing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSProcessing object type SCHEMA_EXPORT/TABLE/COMMENT. . exported "SUZZY"."TEST1" 5.429 KB 1 rowsMaster table "SUZZY"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded******************************************************************************Dump file set for SUZZY.SYS_EXPORT_SCHEMA_01 is: /home/oracle/test1.dmpJob "SUZZY"."SYS_EXPORT_SCHEMA_01" successfully completed at 11:29:29(5)创建10g数据库中用户并赋予权限,包括导入时用到的directorySYS@OCM10G >select username from dba_users where username='SUZZY';no rows selectedSYS@OCM10G >create user suzzy identified by suzzy;User created.SYS@OCM10G >grant connect,resource to suzzy;Grant succeeded.SYS@OCM10G >grant read,write on directory test to suzzy;Grant succeeded.(6)将test1.dmp文件导入10g数据库,此时会报错,原因是由于版本不符合要求,此时需要使用expdp中version参数,参数介绍请看文章(三)[oracle@test ~]$ impdp suzzy/suzzy@ocm10g directory=test dumpfile=test1.dmp Import: Release 10.2.0.1.0 - 64bit Production on Friday, 08 January, 2016 11:35:06Copyright (c) 2003, 2005, Oracle. All rights reserved.Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP and Data Mining optionsORA-39001: invalid argument valueORA-39000: bad dump file specificationORA-39142: incompatible version number 3.1 in dump file "/home/oracle/test1.dmp"翻译:ORA-39001: 参数值无效ORA-39000: 转储文件说明错误ORA-39142: 版本号 3.1 (在转储文件 "/home/oracle/test1.dmp" 中) 不兼容(7)增加version参数,重新从11g库中导出dump文件[oracle@test ~]$ expdp suzzy/suzzy@ocm11g directory=test dumpfile=test2.dmp version=10.2.0.1.0 Export: Release 11.2.0.1.0 - Production on Fri Jan 8 14:01:34 2016Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsStarting "SUZZY"."SYS_EXPORT_SCHEMA_01": suzzy/********@ocm11g directory=test dumpfile=test2.dmp version=10.2.0.1.0 Estimate in progress using BLOCKS method...Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATATotal estimation using BLOCKS method: 64 KBProcessing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAProcessing object type SCHEMA_EXPORT/TABLE/TABLEProcessing object type SCHEMA_EXPORT/TABLE/INDEX/INDEXProcessing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTProcessing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSProcessing object type SCHEMA_EXPORT/TABLE/COMMENT. . exported "SUZZY"."TEST1" 5.304 KB 1 rowsMaster table "SUZZY"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded******************************************************************************Dump file set for SUZZY.SYS_EXPORT_SCHEMA_01 is: /home/oracle/test2.dmpJob "SUZZY"."SYS_EXPORT_SCHEMA_01" successfully completed at 14:01:50(8)将加参数version导出后的test2.dmp文件导入10g数据库[oracle@test ~]$ impdp suzzy/suzzy@ocm10g directory=test dumpfile=test2.dmp Import: Release 10.2.0.1.0 - 64bit Production on Friday, 08 January, 2016 14:03:47Copyright (c) 2003, 2005, Oracle. All rights reserved.Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP and Data Mining optionsMaster table "SUZZY"."SYS_IMPORT_FULL_01" successfully loaded/unloadedStarting "SUZZY"."SYS_IMPORT_FULL_01": suzzy/********@ocm10g directory=test dumpfile=test2.dmp Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAProcessing object type SCHEMA_EXPORT/TABLE/TABLEProcessing object type SCHEMA_EXPORT/TABLE/TABLE_DATA. . imported "SUZZY"."TEST1" 5.304 KB 1 rowsJob "SUZZY"."SYS_IMPORT_FULL_01" successfully completed at 14:03:48(9)验证用户及数据[oracle@test ~]$ sqlplus / as sysdbaSQL*Plus: Release 10.2.0.1.0 - Production on Fri Jan 8 14:04:27 2016Copyright (c) 1982, 2005, Oracle. All rights reserved.Connected to:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP and Data Mining optionsSYS@OCM10G >conn suzzy/suzzyConnected.SUZZY@OCM10G >select * from test1; ID NAME---------- ---------- 1 suzzy三、version参数说明(1)官方文档:VERSIONDefault: COMPATIBLEPurposeSpecifies the version of database objects to be exported (that is, only database objects and attributes that are compatible with the specified release will be exported). This can be used to create a dump file set that is compatible with a previous release of Oracle Database. Note that this does not mean that Data Pump Export can be used with releases of Oracle Database prior to Oracle Database 10g release 1 (10.1). Data Pump Export only works with Oracle Database 10g release 1 (10.1) or later. The VERSION parameter simply allows you to identify the version of the objects being exported.Syntax and DescriptionVERSION=[COMPATIBLE | LATEST | version_string]The legal values for the VERSION parameter are as follows:COMPATIBLE - This is the default value. The version of the metadata corresponds to the database compatibility level. Database compatibility must be set to 9.2 or higher.LATEST - The version of the metadata corresponds to the database release.version_string - A specific database release (for example, 11.2.0). In Oracle Database 11g, this value cannot be lower than 9.2.Database objects or attributes that are incompatible with the specified release will not be exported. For example, tables containing new datatypes that are not supported in the specified release will not be exported.RestrictionsExporting a table with archived LOBs to a database release earlier than 11.2 is not allowed.If the Data Pump Export VERSION parameter is specified along with the TRANSPORT_TABLESPACES parameter, then the value must be equal to or greater than the Oracle Database COMPATIBLE initialization parameter.(2)说明根据官方文档,我们可以看到version参数有3个选项可以选,分别为compatible、latest、version_string,默认选项是compatible,这个选项是导出的元数据与数据库的版本兼容性级别一致,例如我导出的数据库兼容性是11.2.0.0.0 那么导出时就是11.2.0.0.0,这个很好理解。latest选项是最高版本与数据库版本保持一致,这个基本很少用到。version_string是指定具体数据库版本的字符串,这个很常用,在清楚自己数据库版本时,可以直接指定导出兼容版本,注意在11g的版本中,该参数指定版本不能小于9.2。再有就是数据库对象与属性也要对该版本支持,否则不会被导出,例如,包含新数据类型的表不支持指定的版本不会被导出。限制: 低于11.2版本,不允许导出带有archived LOBs表(通过字面上未能太理解,在群里做了些咨询,也没有最终的结果,不过还是有些收获,11g中导出的包含securefile lob的表,导入到10g中会丢失到该特性,见 四) 如果数据泵version参数随着TRANSPORT_TABLESPACES指定参数,那么version值必须等于或大于Oracle数据库初始化参数兼容。四、关于securefile lob字段导出导入测试创建测试表11g环境:[oracle@test ~]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.1.0 Production on Wed Jan 13 18:58:37 2016Copyright (c) 1982, 2009, Oracle. All rights reserved.Connected to:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSYS@OCM11G >show parameter db_securefileNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_securefile string PERMITTEDSYS@OCM11G >conn sam/samConnected.SAM@OCM11G >create table t1(a clob) lob (a) store as securefile (compress low cache nologging);Table created.SAM@OCM11G >insert into t1 select rpad('a',4000,'*') str from dual connect by rownum<=10;10 rows created.SAM@OCM11G >commit;Commit complete.导出数据[oracle@test ~]$ expdp sam/sam@ocm11g directory=test dumpfile=test_lob8.dmp version=10.2.0.1.0Export: Release 11.2.0.1.0 - Production on Wed Jan 13 19:10:42 2016Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsStarting "SAM"."SYS_EXPORT_SCHEMA_01": sam/********@ocm11g directory=test dumpfile=test_lob8.dmp version=10.2.0.1.0Estimate in progress using BLOCKS method...Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATATotal estimation using BLOCKS method: 576 KBProcessing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAProcessing object type SCHEMA_EXPORT/TABLE/TABLEProcessing object type SCHEMA_EXPORT/TABLE/INDEX/INDEXProcessing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTProcessing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSProcessing object type SCHEMA_EXPORT/TABLE/COMMENTProcessing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS. . exported "SAM"."T1" 83.51 KB 11 rows. . exported "SAM"."T_CLOB" 83.54 KB 10 rows. . exported "SAM"."TEST_LOB" 5.382 KB 1 rows. . exported "SAM"."TEST" 5.296 KB 1 rowsMaster table "SAM"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded******************************************************************************Dump file set for SAM.SYS_EXPORT_SCHEMA_01 is: /home/oracle/test_lob8.dmpJob "SAM"."SYS_EXPORT_SCHEMA_01" successfully completed at 19:10:58导入10g环境[oracle@test ~]$ impdp sam/sam@ocm10g directory=test dumpfile=test_lob8.dmpImport: Release 10.2.0.1.0 - 64bit Production on Wednesday, 13 January, 2016 19:13:15Copyright (c) 2003, 2005, Oracle. All rights reserved.Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP and Data Mining optionsMaster table "SAM"."SYS_IMPORT_FULL_01" successfully loaded/unloadedStarting "SAM"."SYS_IMPORT_FULL_01": sam/********@ocm10g directory=test dumpfile=test_lob8.dmpProcessing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAProcessing object type SCHEMA_EXPORT/TABLE/TABLEProcessing object type SCHEMA_EXPORT/TABLE/TABLE_DATA. . imported "SAM"."T1" 83.51 KB 11 rows. . imported "SAM"."T_CLOB" 83.54 KB 10 rows. . imported "SAM"."TEST_LOB" 5.382 KB 1 rows. . imported "SAM"."TEST" 5.296 KB 1 rowsProcessing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSJob "SAM"."SYS_IMPORT_FULL_01" successfully completed at 19:13:16对比10g,11g库中t1表结构(11g)SYS@OCM11G > select dbms_metadata.get_ddl('TABLE','T1','SAM') from dual;DBMS_METADATA.GET_DDL('TABLE','T1','SAM')-------------------------------------------------------------------------------- CREATE TABLE "SAM"."T1" ( "A" CLOB ) SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT Flash_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "USERS" LOB ("A") STORE AS SECUREFILE ( TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 CACHE NOLOGGING COMPRESS LOW KEEP_DUPLICATES STORAGE(INITIAL 106496 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))(10g)SYS@OCM10G > select dbms_metadata.get_ddl('TABLE','T1','SAM') from dual;DBMS_METADATA.GET_DDL('TABLE','T1','SAM')-------------------------------------------------------------------------------- CREATE TABLE "SAM"."T1" ( "A" CLOB ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOB ("A") STORE AS ( TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 PCTVERSION 0 CACHE STORAGE(INITIAL 106496 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 4 FREELIST GROUPS 1 BUFFER_POOL DEFAULT))五、总结 此次测试的结论是可以使用EXPDP/IMPDP数据泵实现高-低,低-高版本的迁移,注意高-低过程中使用到version parameter ,开始本想着测试一下EXPDP/IMPDP跨版本的实验,使用到version参数,后来读到官方文档发现限制里还有些内容未能够搞得很清楚,但是也学习到11g new feature,关于securefile lob字段的内容,so interesting.没啥好说的,go on, hard work,hard learning, where there’s a will,there’s a way.