使用awk来解析dump文件 (73天)

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 
/

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-05-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

dbms_xplan之display函数的使用

DBMS_XPLAN包包括一系列函数,主要是用于显示SQL语句的执行计划,且不同的情形下使用不同的函数来显示,如预估的执行计划则使用 displ...

1912
来自专栏乐沙弥的世界

ORA-01652: unable to extend temp segment by 8192...

      最近在rebuild index时提示unable to extend temp segment by 8192 in tablespace..的错...

1661
来自专栏文渊之博

用于重新编译的工具和命令

1.SQL Prifiler:捕捉事件类型为SP和T-SQL的事件(Starting、Stmtcompleted、Recompile、Completed、Cac...

2199
来自专栏杨建荣的学习笔记

记一次数据库重启后归档急剧增加的问题(98天)

在本地的环境中测试外部表的性能,由于空间有限,不一会儿归档的空间就爆了。然后文件貌似出现了系统级的问题,刚刚rm掉的归档日志文件。隔了几秒钟再ls,就出现了。怎...

3644
来自专栏乐沙弥的世界

Oracle 角色、配置文件

增加或删除角色中的某一权限,被授予该角色的所有用户或角色自动地获得新增权限或删除旧的权限

1012
来自专栏乐沙弥的世界

使用datapump 导出导入同义词(export and import synonym using datapump)

      对于同义词的备份我们有多种方式来实现,如直接通过脚本生成同义词的创建脚本,或者使用dbms_metadata.get_ddl来提取同义词的定义脚本。...

1213
来自专栏乐沙弥的世界

PL/SQL-->UTL_FILE包的使用介绍

    在PL/SQL中,UTL_FILE包提供了文本文件输入和输出互功能。也就是说我们可以通过该包实现从操作系统级别来实现文件读取输入或者是写入到操作系统文件...

951
来自专栏杨建荣的学习笔记

原来Oracle也不喜欢“蜀黍"(r6笔记第54天)

今天在部署一个脚本的时候,碰到了一个奇怪的问题,脚本运行过程中报了一个ora错误 ORA-01756: quoted string not properly t...

2845
来自专栏杨建荣的学习笔记

ORA-01427问题的分析和解决(r6笔记第51天)

前几天开发的同事反馈一个问题,说前台系统报出了ORA错误,希望我们能看看是什么原因。 java.sql.SQLException: ORA-01427: sin...

2824
来自专栏「3306 Pai」社区

《那些年,我在乙方的日子 -- 神谕篇NO1》

某个夏日的午后,窗外知了在大声鸣叫。而我却在睡梦中跟基友一起吃鸡,正准备抢空投时 。手机突然铃声响起,惊醒后一看是领导电话,一下子回到了现实中。心想又得去公司吃...

1702

扫码关注云+社区

领取腾讯云代金券