解析oracle的dump文件,使用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

/

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值