如何从逻辑备份的dumpfile文件里获取DDL脚本?

在数据库的管理工作中,难免会遇到使用Export/Import或者是EXPort Data Pump/IMPort Data Pump工具来执行逻辑备份、恢复的场景。在有些时候,我们可能会对产生的dumpfile的内容感兴趣。本文就这两种工具产生的逻辑备份文件分别描述如何获取数据定义语句(Data Definition Language)的脚本?

1 先来看,如何从传统的Export工具产生的dumpfile里获取DDL语句?
首先,导出HR用户的所有对象:


rac1->id
 
uid=1101(oracle) gid=1000(oinstall)groups=1000(oinstall),1201(asmdba),1300(dba),1301(oper)
 
rac1->pwd
 
/home/oracle
 
rac1->ls-l
 
total 24
 
drwxrwxr-x 17 root   root      4096 May 26 21:20 12419321
 
-rw-r--r--  1 oracle oinstall 15626 Aug 31 14:28 db.rsp
 
drwxr-x---  3 oracle oinstall  4096 Aug 31 15:03 oradiag_oracle
 
rac1-> exp hr/hrfile=exp_hr.dmp log=exp_hr.log owner=hr
 
Export: Release 11.2.0.1.0 - Production on Mon Nov 21 16:50:22 2011
 
Copyright (c) 1982, 2009, Oracle and/orits affiliates.  All rights reserved.
 
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
 
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
 
Data Mining and Real Application Tes
 
ExportdoneinAL32UTF8 charactersetand AL16UTF16 NCHAR characterset
 
. exporting pre-schema procedural objects and actions
 
. exporting foreignfunctionlibrary namesforuser HR
 
. exporting PUBLICtypesynonyms
 
. exporting privatetypesynonyms
 
. exporting objecttypedefinitionsforuser HR
 
About toexportHR's objects ...
 
. exporting database links
 
. exporting sequence numbers
 
.....
 
.....
 
. exporting statistics
 
Export terminated successfully without warnings.
 
rac1->ls-l
 
total 23656
 
drwxrwxr-x 17 root   root         4096 May 26 21:20 12419321
 
-rw-r--r--  1 oracle oinstall    15626 Aug 31 14:28 db.rsp
 
-rw-r--r--  1 oracle oinstall 24166400 Nov 21 16:51 exp_hr.dmp
 
-rw-r--r--  1 oracle oinstall     2493 Nov 21 16:51 exp_hr.log
 
drwxr-x---  3 oracle oinstall     4096 Aug 31 15:03 oradiag_oracle
 
rac1->


我们已经顺利导出了一份exp_hr.dmp的dumpfile,那么该如何从该文件里获取DDL语句呢?

我们可以利用传统的导入工具Import附带SHOW=y选项来获取:


rac1-> imp hr/hrfile=exp_hr.dmp log=show_ddl.log  show=y
 
Import: Release 11.2.0.1.0 - Production on Mon Nov 21 17:03:26 2011
 
Copyright (c) 1982, 2009, Oracle and/orits affiliates.  All rights reserved.
 
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
 
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
 
Data Mining and Real Application Tes
 
Exportfilecreated by EXPORT:V11.02.00 via conventional path
 
importdoneinAL32UTF8 charactersetand AL16UTF16 NCHAR characterset
 
. importing HR's objects into HR
 
"BEGIN  "
 
...
 
...
 
Import terminated successfully without warnings.
 
rac1->
 
rac1->ls-l
 
total 23688
 
drwxrwxr-x 17 root   root         4096 May 26 21:20 12419321
 
-rw-r--r--  1 oracle oinstall    15626 Aug 31 14:28 db.rsp
 
-rw-r--r--  1 oracle oinstall 24166400 Nov 21 16:51 exp_hr.dmp
 
-rw-r--r--  1 oracle oinstall     2493 Nov 21 16:51 exp_hr.log
 
drwxr-x---  3 oracle oinstall     4096 Aug 31 15:03 oradiag_oracle
 
-rw-r--r--  1 oracle oinstall    28766 Nov 21 17:03 show_ddl.log
 
rac1->head-30 show_ddl.log
 
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
 
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
 
Data Mining and Real Application Tes
 
Exportfilecreated by EXPORT:V11.02.00 via conventional path
 
importdoneinAL32UTF8 charactersetand AL16UTF16 NCHAR characterset
 
. importing HR's objects into HR
 
"BEGIN  "
 
"sys.dbms_logrep_imp.instantiate_schema(schema_name=>SYS_CONTEXT('USERENV','"
 
"CURRENT_SCHEMA'), export_db_name=>'DEVDB', inst_scn=>'41155490');"
 
"COMMIT; END;"
 
"CREATE TYPE "MY_TEST_TYPE" TIMESTAMP '2011-10-12:09:59:12' OID 'AF115DDE620"
 
"59E4AE04010ACBF000672'   as object(id number,name varchar2(10));"
 
"CREATE SEQUENCE "LOCATIONS_SEQ" MINVALUE 1 MAXVALUE 9900 INCREMENT BY 100 S"
 
"TART WITH 3300 NOCACHE NOORDER NOCYCLE"
 
"CREATE SEQUENCE "DEPARTMENTS_SEQ" MINVALUE 1 MAXVALUE 9990 INCREMENT BY 10 "
 
"START WITH 280 NOCACHE NOORDER NOCYCLE"
 
"CREATE SEQUENCE "EMPLOYEES_SEQ" MINVALUE 1 MAXVALUE 99999999999999999999999"
 
"99999 INCREMENT BY 1 START WITH 207 NOCACHE NOORDER NOCYCLE"
 
"CREATE CLUSTER "DEPT_EMP_CLUSTER" ("DEPARTMENT_ID" NUMBER(4, 0))  PCTFREE 1"
 
"0 PCTUSED 40 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 262144 NEXT 1048576 MI"
 
"NEXTENTS 1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "U"
 
"SERS""
 
"CREATE INDEX "IDX_DEPT_EMP_CLUSTER" ON CLUSTER "DEPT_EMP_CLUSTER" PCTFREE 1"
 
"0 INITRANS 2 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 F"
 
"REELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS""
 
"CREATE TABLE "BIGFILE_TAB" ("ID" NUMBER, "NAME" VARCHAR2(10))  PCTFREE 10 P"
 
"CTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXT"
 
"ENTS 1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "BIG_T"
 
rac1->


从上,我们可以看到,我们在IMPORT命令行上带上SHOW=Y的选项时,IMPORT工具并没有真正的执行数据导入,而是生成了一份含有DDL语句的日志文件,我们可以直接编辑该日志文件,以获取我们所需的脚本。

2 那么,对于EXPDP产生的dumpfile,又该如何获取DDL语句呢?

先以EXPDP导出dumpfile:

rac1->pwd
 
/u01/app/oracle/mig_dir
 
rac1->ls-l
 
total 0
 
rac1-> expdp hr/hrdirectory=mig_dir dumpfile=expdp_hr.dmp logfile=expdp_hr.log schemas=hr
 
Export: Release 11.2.0.1.0 - Production on Mon Nov 21 17:16:45 2011
 
Copyright (c) 1982, 2009, Oracle and/orits affiliates.  All rights reserved.
 
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
 
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
 
Data Mining and Real Application Testing options
 
...
 
Job"HR"."SYS_EXPORT_SCHEMA_01"successfully completed at 17:19:48
 
rac1->ls-l
 
total 24248
 
-rw-r----- 1 oracle asmadmin 24797184 Nov 21 17:19 expdp_hr.dmp
 
-rw-r--r-- 1 oracle asmadmin     3299 Nov 21 17:19 expdp_hr.log
 
rac1->



该如何从expdp_hr.dmp文件里获取DDL语句呢?IMPDP工具给我们提供了SQLFILE的命令行选项,同样是只获取DDL语句,并未真正的执行数据导入。

rac1-> impdp hr/hrdirectory=mig_dir dumpfile=expdp_hr.dmp logfile=impdp_hr.log schemas=hr sqlfile=hr_ddl.sql
 
Import: Release 11.2.0.1.0 - Production on Mon Nov 21 17:23:23 2011
 
Copyright (c) 1982, 2009, Oracle and/orits affiliates.  All rights reserved.
 
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
 
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
 
Data Mining and Real Application Testing options
 
Master table"HR"."SYS_SQL_FILE_SCHEMA_01"successfully loaded/unloaded
 
...
 
...
 
Job"HR"."SYS_SQL_FILE_SCHEMA_01"successfully completed at 17:23:47
 
rac1->ls-l
 
total 24360
 
-rw-r----- 1 oracle asmadmin 24797184 Nov 21 17:19 expdp_hr.dmp
 
-rw-r--r-- 1 oracle asmadmin     3299 Nov 21 17:19 expdp_hr.log
 
-rw-r--r-- 1 oracle asmadmin   103892 Nov 21 17:23 hr_ddl.sql
 
-rw-r--r-- 1 oracle asmadmin     1672 Nov 21 17:23 impdp_hr.log
 
rac1->head-30 hr_ddl.sql
 
-- CONNECT HR
 
ALTER SESSION SET EVENTS'10150 TRACE NAME CONTEXT FOREVER, LEVEL 1';
 
ALTER SESSION SET EVENTS'10904 TRACE NAME CONTEXT FOREVER, LEVEL 1';
 
ALTER SESSION SET EVENTS'25475 TRACE NAME CONTEXT FOREVER, LEVEL 1';
 
ALTER SESSION SET EVENTS'10407 TRACE NAME CONTEXT FOREVER, LEVEL 1';
 
ALTER SESSION SET EVENTS'10851 TRACE NAME CONTEXT FOREVER, LEVEL 1';
 
ALTER SESSION SET EVENTS'22830 TRACE NAME CONTEXT FOREVER, LEVEL 192 ';
 
-- new objecttypepath: SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
 
BEGIN
 
sys.dbms_logrep_imp.instantiate_schema(schema_name=>SYS_CONTEXT('USERENV','CURRENT_SCHEMA'), export_db_name=>'DEVDB', inst_scn=>'41161309');
 
COMMIT;
 
END;
 
/
 
-- new objecttypepath: SCHEMA_EXPORT/TYPE/TYPE_SPEC
 
CREATE TYPE"HR"."MY_TEST_TYPE"
 
OID'AF115DDE62059E4AE04010ACBF000672'as object(idnumber,name varchar2(10));
 
/
 
ALTER TYPE"HR"."MY_TEST_TYPE"
 
COMPILE SPECIFICATION
 
PLSQL_OPTIMIZE_LEVEL=  2
 
PLSQL_CODE_TYPE=  INTERPRETED
 
PLSQL_DEBUG=  FALSE    PLSCOPE_SETTINGS=  'IDENTIFIERS:NONE'
 
/
 
-- new objecttypepath: SCHEMA_EXPORT/SEQUENCE/SEQUENCE
 
CREATE SEQUENCE  "HR"."LOCATIONS_SEQ" MINVALUE 1 MAXVALUE 9900 INCREMENT BY 100 START WITH 3300 NOCACHE  NOORDER  NOCYCLE ;
 
rac1->

最后,简单一句话总结:

对于使用传统工具EXPORT导出的dumpfile,我们可以使用IMPORT加上SHOW=Y的选项获取DDL

对于使用数据泵EXPDP导出的dumpfile,我们可以使用IMPDP加上SQLFILE的选项获取DDL


你可能感兴趣的:(如何从逻辑备份的dumpfile文件里获取DDL脚本?)