使用awk來解析dump檔案

2021-06-28 08:52:01 字數 3412 閱讀 4406

dump檔案是平時工作中經常碰見的,有時候得到乙個dump,但是沒有提供一些更多的資訊,匯入的時候就很可能會有問題。

如果某個使用者預設表空間是user,但是dump中的表所屬的表空間是datas01,則匯入的時候會自動轉換表空間。

但是如果表中存在lob欄位

且dump的表空間和目標環境的表空間不一致

,就有在匯入dump的時候,

經典的00959問題,錯誤類似下面的形式。

imp-00017: following statement failed with oracle error 959:

"create table "***x_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 /  

/ \"create /  

/ \"create index/  

/ \"create unique index/  

/ \"alter /  

/ \" alter /  

/ \"analyze /  

/ \"grant /    

/ \"comment /  

/ \"audit /    

n==1

/\"$/

if ( t==0 )

if ( t > 0 )

else }}

else }} 

}end

' $* |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 "***_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 "***_params_pk" on "***_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 "***x_params" add  constraint "***_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 

/

如何使用vpd來dump波形

fsdb是經常用來dump波形,但是使用的時候可能也會存在一些層次需要特殊設定才能dump,這樣就會導致對於一些特殊情況較難處理,但是vpd波形是vcs自帶的,所以對於某些情況就特別好用,將以下命令存在dump vpd.do的指令碼中,然後通過在 過程中使用ucli將指令碼feed進去,這樣就會du...

使用awk合併檔案及指令碼解析

昨天在csnd上看到有使用awk合併檔案的乙個問題,正好這兩天有點時間就簡單整理了其執行過程的分析.a.txt的檔案內容為 20114042028 liuyh 90 20114042045 liub 100 20114042013 liubx 100b.txt的檔案內容為 20114042013 y...

awk來對檔案進行分析

簡介 例項介紹 假設last n 5的輸出如下 root www last n 5 僅取出前五行 root pts 1 192.168.1.100 tue feb 10 11 21 still logged in root pts 1 192.168.1.100 tue feb 10 00 46 0...