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...