使用awk來解析dump檔案

來源:互聯網
上載者:User

使用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速度會快一些。

AWK簡介及使用執行個體

AWK 簡介和例子

Shell指令碼之AWK文字編輯器文法

Regex中AWK的學習和使用

文本資料處理之AWK 圖解


 這裡我們可以過濾一下資訊。轉儲一下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
/

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.