使用awk來解析dump檔案
dump檔案是平時工作中經常碰見的,有時候得到一個dump,但是沒有提供一些更多的資訊,匯入的時候就很可能會有問題。
如果某個使用者預設表空間是user,但是dump中的表所屬的表空間是datas01,則匯入的時候會自動轉換表空間。
但是如果表中存在lob欄位且dump的表空間和目標環境的表空間不一致,就有在匯入dump的時候,經典的00959問題,錯誤類似下面的形式。
IMP-00017: following statement failed with ORACLE error 959:
"CREATE TABLE "XXXX_RULEGROUP" ("RULE_GROUP_ID" NUMBER(12, 0) NOT NULL ENABLE"
", "RULE_GROUP_NAME" VARCHAR2(60), "ENABLED" NUMBER(1, 0), "RULE_GROUP_RULES"
"" CLOB, "SCHEDULING_START_TIME" TIMESTAMP (6), "SCHEDULING_INTERVAL" NUMBER"
"(12, 0)) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 104"
"8576 NEXT 1048576 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLES"
"PACE "DATAS01" LOGGING NOCOMPRESS LOB ("RULE_GROUP_RULES") STORE AS (TABLE"
"SPACE "INDXS01" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION NOCACHE LOGGING "
" STORAGE(INITIAL 1048576 NEXT 1048576 FREELISTS 1 FREELIST GROUPS 1 BUFFER_"
"POOL DEFAULT))"
IMP-00003: ORACLE error 959 encountered
ORA-00959: tablespace 'DATAS01' does not exist
當然了,可能還有更復雜的場景,比如我們需要在得到一個dump的時候,只希望執行指定的一部分指令碼。可能稍候再匯入部分資料,這種場景就不能滿足了。
可以考慮使用awk來解析dump檔案,當然了直接解析dump檔案的話很容易有效能問題,而且可能使用perl速度會快一些。
這裡我們可以過濾一下資訊。轉儲一下dump檔案,生成相關的dump日誌。只需要解析指定格式的dump日誌就可以了。
這裡我們假定dump檔名為test.dmp,生成的轉儲檔案為imp_test.log,不會匯入資料的。
imp rows=n full=y ignore=y show=y file=test.dump log=imp_test.log userid=tests/oracle buffer=10240000
接下來,使用awk來解析,假定這個指令碼檔名字為gettabddl.sh
awk '
/ \"BEGIN / { N=1; }
/ \"CREATE / { N=1; }
/ \"CREATE INDEX/ { N=1; }
/ \"CREATE UNIQUE INDEX/ { N=1; }
/ \"ALTER / { N=1; }
/ \" ALTER / { N=1; }
/ \"ANALYZE / { N=1; }
/ \"GRANT / { N=1; }
/ \"COMMENT / { N=1; }
/ \"AUDIT / { N=1; }
N==1 { printf "\n/\n"; N++ }
/\"$/ {
if (N==0) next;
s=index( $0, "\"" );
ln0=length( $0 )
if ( s!=0 ) {
lcnt++
if ( lcnt >= 30 ) {
ln=substr( $0,s+1,length( substr($0,s+1))-1)
t=index( ln, ")," )
if ( t==0 ) { t=index( ln, ", " ) }
if ( t==0 ) { t=index( ln, ") " ) }
if ( t > 0 ) {
printf "%s\n%s",substr( ln,1,t+1), substr(ln, t+2)
lcnt=0
}
else {
printf "%s", ln
if ( ln0 < 78 ) { printf "\n" ; lcnt=0 }
}
}
else {
printf "%s",substr( $0,s+1,length( substr($0,s+1))-1 )
if ( ln0 < 78 ) { printf "\n" ; lcnt=0 }
}
}
}
END { printf "\n/\n"}
' $* |sed '1,2d; /^$/ d;
s/STORAGE *(INI/~ STORAGE (INI/g;
s/, "/,~ "/g;
s/ (\"/~ &/g;
s/PCT[FI]/~ &/g;
s/[( ]PARTITION /~&/g;
s/) TABLESPACE/)~ TABLESPACE/g;
s/ , / ,~/g;
s/ DATAFILE /&~/' | tr "~" "\n"
這樣執行即可。imp_test.log是剛剛生成的轉儲imp日誌。只會生成一些ddl相關的指令碼。就是awk來解析和格式化的。最終生成的指令碼是gen_tabddl.sql
ksh gettabddl.sh imp_test.dmp > gen_tabddl.sql
生成指令碼的格式如下所示 。可以自己在裡面做一些改動。
CREATE TABLE "XXX_PARAMS"
("PARAM_KEY" NUMBER(6, 0) NOT NULL ENABLE,
"PARAM_TYPE" VARCHAR2(50) NOT NULL ENABLE,
"PARAM_VALUE" VARCHAR2(100))
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE (INITIAL 1048576 NEXT 1048576 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "TEST" LOGGING NOCOMPRESS
/
CREATE UNIQUE INDEX "XXX_PARAMS_PK" ON "XXX_PARAMS"
("PARAM_KEY" )
PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE (INITIAL 1048576 NEXT 1048576 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "TEST" LOGGING
/
ALTER TABLE "XXXX_PARAMS" ADD CONSTRAINT "XXX_PARAMS_PK" PRIMARY KEY
("PARAM_KEY") USING INDEX
PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE (INITIAL 1048576 NEXT 1048576 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "TEST" LOGGING ENABLE
/
如果某個使用者預設表空間是user,但是dump中的表所屬的表空間是datas01,則匯入的時候會自動轉換表空間。
但是如果表中存在lob欄位且dump的表空間和目標環境的表空間不一致,就有在匯入dump的時候,經典的00959問題,錯誤類似下面的形式。
IMP-00017: following statement failed with ORACLE error 959:
"CREATE TABLE "XXXX_RULEGROUP" ("RULE_GROUP_ID" NUMBER(12, 0) NOT NULL ENABLE"
", "RULE_GROUP_NAME" VARCHAR2(60), "ENABLED" NUMBER(1, 0), "RULE_GROUP_RULES"
"" CLOB, "SCHEDULING_START_TIME" TIMESTAMP (6), "SCHEDULING_INTERVAL" NUMBER"
"(12, 0)) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 104"
"8576 NEXT 1048576 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLES"
"PACE "DATAS01" LOGGING NOCOMPRESS LOB ("RULE_GROUP_RULES") STORE AS (TABLE"
"SPACE "INDXS01" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION NOCACHE LOGGING "
" STORAGE(INITIAL 1048576 NEXT 1048576 FREELISTS 1 FREELIST GROUPS 1 BUFFER_"
"POOL DEFAULT))"
IMP-00003: ORACLE error 959 encountered
ORA-00959: tablespace 'DATAS01' does not exist
當然了,可能還有更復雜的場景,比如我們需要在得到一個dump的時候,只希望執行指定的一部分指令碼。可能稍候再匯入部分資料,這種場景就不能滿足了。
可以考慮使用awk來解析dump檔案,當然了直接解析dump檔案的話很容易有效能問題,而且可能使用perl速度會快一些。
這裡我們可以過濾一下資訊。轉儲一下dump檔案,生成相關的dump日誌。只需要解析指定格式的dump日誌就可以了。
這裡我們假定dump檔名為test.dmp,生成的轉儲檔案為imp_test.log,不會匯入資料的。
imp rows=n full=y ignore=y show=y file=test.dump log=imp_test.log userid=tests/oracle buffer=10240000
awk '
/ \"BEGIN / { N=1; }
/ \"CREATE / { N=1; }
/ \"CREATE INDEX/ { N=1; }
/ \"CREATE UNIQUE INDEX/ { N=1; }
/ \"ALTER / { N=1; }
/ \" ALTER / { N=1; }
/ \"ANALYZE / { N=1; }
/ \"GRANT / { N=1; }
/ \"COMMENT / { N=1; }
/ \"AUDIT / { N=1; }
N==1 { printf "\n/\n"; N++ }
/\"$/ {
if (N==0) next;
s=index( $0, "\"" );
ln0=length( $0 )
if ( s!=0 ) {
lcnt++
if ( lcnt >= 30 ) {
ln=substr( $0,s+1,length( substr($0,s+1))-1)
t=index( ln, ")," )
if ( t==0 ) { t=index( ln, ", " ) }
if ( t==0 ) { t=index( ln, ") " ) }
if ( t > 0 ) {
printf "%s\n%s",substr( ln,1,t+1), substr(ln, t+2)
lcnt=0
}
else {
printf "%s", ln
if ( ln0 < 78 ) { printf "\n" ; lcnt=0 }
}
}
else {
printf "%s",substr( $0,s+1,length( substr($0,s+1))-1 )
if ( ln0 < 78 ) { printf "\n" ; lcnt=0 }
}
}
}
END { printf "\n/\n"}
' $* |sed '1,2d; /^$/ d;
s/STORAGE *(INI/~ STORAGE (INI/g;
s/, "/,~ "/g;
s/ (\"/~ &/g;
s/PCT[FI]/~ &/g;
s/[( ]PARTITION /~&/g;
s/) TABLESPACE/)~ TABLESPACE/g;
s/ , / ,~/g;
s/ DATAFILE /&~/' | tr "~" "\n"
這樣執行即可。imp_test.log是剛剛生成的轉儲imp日誌。只會生成一些ddl相關的指令碼。就是awk來解析和格式化的。最終生成的指令碼是gen_tabddl.sql
ksh gettabddl.sh imp_test.dmp > gen_tabddl.sql
生成指令碼的格式如下所示 。可以自己在裡面做一些改動。
CREATE TABLE "XXX_PARAMS"
("PARAM_KEY" NUMBER(6, 0) NOT NULL ENABLE,
"PARAM_TYPE" VARCHAR2(50) NOT NULL ENABLE,
"PARAM_VALUE" VARCHAR2(100))
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE (INITIAL 1048576 NEXT 1048576 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "TEST" LOGGING NOCOMPRESS
/
CREATE UNIQUE INDEX "XXX_PARAMS_PK" ON "XXX_PARAMS"
("PARAM_KEY" )
PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE (INITIAL 1048576 NEXT 1048576 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "TEST" LOGGING
/
ALTER TABLE "XXXX_PARAMS" ADD CONSTRAINT "XXX_PARAMS_PK" PRIMARY KEY
("PARAM_KEY") USING INDEX
PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE (INITIAL 1048576 NEXT 1048576 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "TEST" LOGGING ENABLE
/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1349333/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- dump檔案解析之探索.Net的記憶體記憶體
- dump日誌檔案
- 通過oracle event來dump資料檔案頭資訊Oracle
- PostgreSQL資料檔案災難恢復-解析與資料dumpSQL
- Oracle:dump轉儲檔案Oracle
- Oracle 使用 ass.awk 工具檢視 system state dump 說明Oracle
- 使用 Java 解析XML檔案JavaXML
- 使用PdfRenderer解析PDF檔案
- Oracle 跟蹤檔案和檔案轉儲(dump)Oracle
- dump 轉儲檔案內容
- AWK的格式化輸出和檔案中的AWK
- 怎樣使用 awk 刪掉檔案中重複的行
- Oracle redo解析之-2、BBED & DUMP工具使用Oracle Redo
- 高通進dump和抓取解析dump log
- AWK原理及命令和檔案輸入
- Awk 多檔案操作的實現方法
- 使用GeoTools解析shp檔案內容
- Win10如何獲取dump日誌檔案|windows10獲取dump檔案的步驟Win10Windows
- 使用awk和sed獲取檔案奇偶數行的方法總結
- gdb除錯core dump檔案之二除錯
- 使用mysqldump以SQL格式來dump資料MySql
- awk比較檔案內容的差異
- 如何使用 ABAP 程式碼解析 XML 檔案XML
- 使用Python解析nginx日誌檔案PythonNginx
- oracle 11gr2中使用dbms_sqldiag.dump_trace來獲得10053跟蹤檔案OracleSQL
- 記一次dump檔案分析歷程
- Visual Studio 快速分析 .NET Dump 檔案
- 使用mysqldump以文字分隔格式來dump資料MySql
- eml檔案解析
- Class檔案解析
- Awk給檔案中的行前後新增內容
- Linux檔案處理三劍客之awkLinux
- 使用舊的控制檔案備份來恢復控制檔案
- golang常用庫:配置檔案解析庫-viper使用Golang
- 使用【Path Finder】來管理你的檔案
- 如何使用File APIs來讀取檔案API
- Oracle從dump檔案中提取DDL語句方法Oracle
- oracle資料塊dump檔案中ITL詳解Oracle