从导出文件取出建表建索引的DDL语句
9i提供了DBMS_METADATA程序包取出DDL语句, 如
set pages 50000 line 130 long 4000
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SEGMENT_ATTRIBUTES',false);
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SQLTERMINATOR',true);
select dbms_metadata.get_ddl('TABLE','T2') from dual;
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,'DEFAULT');
SQL> set pages 50000 line 130 long 4000
SQL> exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SEGMENT_ATTRIBUTES',false);
PL/SQL procedure successfully completed.
SQL> exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SQLTERMINATOR',true);
PL/SQL procedure successfully completed.
SQL> select dbms_metadata.get_ddl('TABLE','T2') from dual;
DBMS_METADATA.GET_DDL('TABLE','T2')
--------------------------------------------------------------------------------
CREATE TABLE "A"."T2"
( "A" NUMBER(*,0),
"B" VARCHAR2(10)
) ;
SQL> exec dbms_metadata.set_transform_param(dbms_metadata.session_transform,'DEFAULT');
PL/SQL procedure successfully completed.
SQL>
10g的data dump import也可以做到,如
expdp a/a content=metadata_only directory=data_pump_dir dumpfile=a.dmp nologfile=y impdp a/a sqlfile=a.sql remap_tablespace=ts_test:ts_xxx transform=storage:n transform=segment_attributes:n:table include=table/table,table/index/index directory=data_pump_dir dumpfile=a.dmp nologfile=y cat /home/oracle/app/oracle/admin/test/dpdump/a.sql
[oracle@DEV-RPT-2 ~]$ expdp a/a content=metadata_only directory=data_pump_dir dumpfile=a.dmp nologfile=y
Export: Release 10.2.0.4.0 - 64bit Production on Thursday, 23 April, 2009 16:16:03
Copyright (c) 2003, 2007, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Data Mining and Real Application Testing options
FLASHBACK automatically enabled to preserve database integrity.
Starting "A"."SYS_EXPORT_SCHEMA_01": a/******** content=metadata_only directory=data_pump_dir dumpfile=a.dmp nologfile=y
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/PACKAGE/PACKAGE_SPEC
Processing object type SCHEMA_EXPORT/FUNCTION/FUNCTION
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PACKAGE/COMPILE_PACKAGE/PACKAGE_SPEC/ALTER_PACKAGE_SPEC
Processing object type SCHEMA_EXPORT/FUNCTION/ALTER_FUNCTION
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/PACKAGE/PACKAGE_BODY
Processing object type SCHEMA_EXPORT/JAVA_SOURCE/JAVA_SOURCE
Processing object type SCHEMA_EXPORT/JAVA_CLASS/JAVA_CLASS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Master table "A"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for A.SYS_EXPORT_SCHEMA_01 is:
/home/oracle/app/oracle/admin/test/dpdump/a.dmp
Job "A"."SYS_EXPORT_SCHEMA_01" successfully completed at 16:16:06
[oracle@DEV-RPT-2 ~]$ impdp a/a sqlfile=a.sql remap_tablespace=ts_test:ts_xxx transform=storage:n transform=segment_attributes:n:table include=table/table,table/index/index directory=data_pump_dir dumpfile=a.dmp nologfile=y
Import: Release 10.2.0.4.0 - 64bit Production on Thursday, 23 April, 2009 16:17:00
Copyright (c) 2003, 2007, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, Data Mining and Real Application Testing options
Master table "A"."SYS_SQL_FILE_FULL_01" successfully loaded/unloaded
Starting "A"."SYS_SQL_FILE_FULL_01": a/******** sqlfile=a.sql remap_tablespace=ts_test:ts_xxx transform=storage:n transform=segment_attributes:n:table include=table/table,table/index/index directory=data_pump_dir dumpfile=a.dmp nologfile=y
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Job "A"."SYS_SQL_FILE_FULL_01" successfully completed at 16:17:04
[oracle@DEV-RPT-2 ~]$ cat /home/oracle/app/oracle/admin/test/dpdump/a.sql
-- CONNECT A
-- new object type path is: SCHEMA_EXPORT/TABLE/TABLE
CREATE TABLE "A"."MYROW"
( "A" NUMBER
) ;
CREATE TABLE "A"."T"
( "A" NUMBER
) ;
CREATE TABLE "A"."T1"
( "A" NUMBER(*,0),
"B" VARCHAR2(10)
) ;
CREATE TABLE "A"."A"
( "A" NUMBER(*,0)
) ;
CREATE TABLE "A"."T2"
( "A" NUMBER(*,0),
"B" VARCHAR2(10)
) ;
CREATE TABLE "A"."B"
( "A" NUMBER(*,0),
"B" CHAR(1)
) ;
CREATE TABLE "A"."C"
( "A" NUMBER(*,0),
"B" CHAR(1),
"C" CLOB
) ;
-- new object type path is: SCHEMA_EXPORT/TABLE/INDEX/INDEX
CREATE UNIQUE INDEX "A"."IND_T1_A" ON "A"."T1" ("A")
PCTFREE 10 INITRANS 2 MAXTRANS 255
TABLESPACE "TS_XXX" PARALLEL 1 ;
ALTER INDEX "A"."IND_T1_A" NOPARALLEL;
CREATE UNIQUE INDEX "A"."IND__AAAAABBBBBCCCCCDDDDDEEEEE" ON "A"."T1" ("A", "B")
PCTFREE 10 INITRANS 2 MAXTRANS 255
TABLESPACE "TS_XXX" PARALLEL 1 ;
ALTER INDEX "A"."IND__AAAAABBBBBCCCCCDDDDDEEEEE" NOPARALLEL;
[oracle@DEV-RPT-2 ~]$
8i,可以从导出文件中获取
grep -a "CREATE TABLE" a.dmp
[oracle@DEV-RPT-2 ~]$ grep -a "CREATE TABLE" a.dmp
CREATE TABLE "A" ("A" NUMBER(*,0)) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "TS_TEST" LOGGING NOCOMPRESS
CREATE TABLE "B" ("A" NUMBER(*,0), "B" CHAR(1)) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "TS_TEST" LOGGING NOCOMPRESS
CREATE TABLE "C" ("A" NUMBER(*,0), "B" CHAR(1), "C" CLOB) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "TS_TEST" LOGGING NOCOMPRESS LOB ("C") STORE AS (TABLESPACE "TS_TEST" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION NOCACHE LOGGING STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT))
CREATE TABLE "MYROW" ("A" NUMBER) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "TS_TEST" LOGGING NOCOMPRESS
CREATE TABLE "T" ("A" NUMBER) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "TS_TEST" LOGGING NOCOMPRESS
CREATE TABLE "T1" ("A" NUMBER(*,0), "B" VARCHAR2(10)) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "TS_TEST" LOGGING NOCOMPRESS
CREATE TABLE "T2" ("A" NUMBER(*,0), "B" VARCHAR2(10)) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "TS_XXXXXYYYYYZZZZZAAAAABBBBB" LOGGING NOCOMPRESS
[oracle@DEV-RPT-2 ~]$
更靠谱的方法是,在imp命令加上indexfile选项, 生成一个文件, 里面包括有建表和建索引等语句, 然后转换一下它的格式. 过程如下:
导出文件:
exp a/a rows=n compress=n file=a.dmp
[oracle@DEV-RPT-2 ~]$ exp a/a rows=n compress=n file=a.dmp Export: Release 10.2.0.4.0 - Production on Thu Apr 23 15:12:47 2009 Copyright (c) 1982, 2007, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, Data Mining and Real Application Testing options Export done in AL32UTF8 character set and AL16UTF16 NCHAR character set Note: table data (rows) will not be exported . exporting pre-schema procedural objects and actions . exporting foreign function library names for user A . exporting PUBLIC type synonyms . exporting private type synonyms . exporting object type definitions for user A About to export A's objects ... . exporting database links . exporting sequence numbers . exporting cluster definitions . about to export A's tables via Conventional Path ... . . exporting table A . . exporting table B . . exporting table C . . exporting table MYROW . . exporting table T . . exporting table T1 . . exporting table T2 . exporting synonyms . exporting views . exporting stored procedures . exporting operators . exporting referential integrity constraints . exporting triggers . exporting indextypes . exporting bitmap, functional and extensible indexes . exporting posttables actions . exporting materialized views . exporting snapshot logs . exporting job queues . exporting refresh groups and children . exporting dimensions . exporting post-schema procedural objects and actions . exporting statistics Export terminated successfully without warnings. [oracle@DEV-RPT-2 ~]$
生成语句:
imp a/a file=a.dmp indexfile=a.sql
[oracle@DEV-RPT-2 ~]$ imp a/a file=a.dmp indexfile=a.sql Import: Release 10.2.0.4.0 - Production on Thu Apr 23 15:13:20 2009 Copyright (c) 1982, 2007, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, Data Mining and Real Application Testing options Export file created by EXPORT:V10.02.01 via conventional path import done in AL32UTF8 character set and AL16UTF16 NCHAR character set Import terminated successfully without warnings. [oracle@DEV-RPT-2 ~]$
用sed命令格式化:
cat a.sql |\
sed 's/^REM // #删除开头的注释字符串
#/^CONNECT /s/^/REM / #删除CONNECT语句
/^CONNECT /d #删除CONNECT语句
/^$/d #删除空行
' |\
sed '
/^CREATE\|^ALTER/ { #如果是CREATE或ALTER语句
:x
/;$/!{ #如果行尾不是分号
N #读取下一行,保存起来
b x
}
#直到行尾是分号
#s/\n//g #删除换行符, 多行合并成一行
s/PCTFREE .*/tablespace xxxx;/ #删除存储参数等,并改变表空间
#s/PCTFREE .* \(TABLESPACE [\n]*"[^ ]*"\) .*/\1;/ #或者是,表空间不变
}
'
[oracle@DEV-RPT-2 ~]$ cat a.sql |\
> sed 's/^REM // #删除开头的注释字符串
> #/^CONNECT /s/^/REM / #删除CONNECT语句
> /^CONNECT /d #删除CONNECT语句
> /^$/d #删除空行
> ' |\
> sed '
> /^CREATE\|^ALTER/ { #如果是CREATE或ALTER语句
> :x
> /;$/!{ #如果行尾不是分号
> N #读取下一行,保存起来
> b x
> }
> #直到行尾是分号
> #s/\n//g #删除换行符, 多行合并成一行
> s/PCTFREE .*/tablespace xxxx;/ #删除存储参数等,并改变表空间
> #s/PCTFREE .* \(TABLESPACE [\n]*"[^ ]*"\) .*/\1;/ #或者是,表空间不变
> }
> '
CREATE TABLE "A"."A" ("A" NUMBER(*,0)) tablespace xxxx;
CREATE TABLE "A"."B" ("A" NUMBER(*,0), "B" CHAR(1)) tablespace xxxx;
ALTER TABLE "A"."B" ADD PRIMARY KEY ("A", "B") USING INDEX tablespace xxxx;
CREATE TABLE "A"."C" ("A" NUMBER(*,0), "B" CHAR(1), "C" CLOB) tablespace xxxx;
CREATE TABLE "A"."MYROW" ("A" NUMBER) tablespace xxxx;
CREATE TABLE "A"."T" ("A" NUMBER) tablespace xxxx;
CREATE TABLE "A"."T1" ("A" NUMBER(*,0), "B" VARCHAR2(10)) tablespace xxxx;
CREATE UNIQUE INDEX "A"."IND_T1_A" ON "T1" ("A" ) tablespace xxxx;
CREATE UNIQUE INDEX "A"."IND__AAAAABBBBBCCCCCDDDDDEEEEE" ON "T1" ("A" ,
"B" ) tablespace xxxx;
CREATE TABLE "A"."T2" ("A" NUMBER(*,0), "B" VARCHAR2(10)) tablespace xxxx;
[oracle@DEV-RPT-2 ~]$
也可以用Java或awk程序完成转换, 参见
Pretoria is a tool for manipulating Oracle indexfiles
beautify_indexfile
-fin-

No comments:
Post a Comment