使用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 条评论
登录 后参与评论

相关文章

来自专栏木宛城主

Set up development environment for apps for SharePoint 2013

SharePoint 2013 support app development pattern.An app for SharePoint is small ...

2015
来自专栏乐沙弥的世界

Oracle 控制文件(CONTROLFILE)

为二进制文件,初始化大小由CREATE DATABASE指定,可以使用RMAN备份

892
来自专栏数据和云

诊断案例:从实例挂起到归档失败和内存管理的蝴蝶效应

杨廷琨(yangtingkun) 云和恩墨 CTO 高级咨询顾问,Oracle ACE 总监,ITPUB Oracle 数据库管理版版主 编辑手记:在很多数据...

2819
来自专栏乐沙弥的世界

理解 using backup controlfile

        using backup controlfile 通常用于恢复由于当前控制文件丢失且原来备份的控制文件较当前发生变化的情形之下。using ba...

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

ORACLE dataguard学习笔记 (91天)

今天在一台机器上模拟了dataguard,主备两个实例从物理上不共享任何归档文件路径。 主要有以下内容: dataguard Physical standby的...

27711
来自专栏IT杂记

关于MySQL DNS解析探究之二:unauthenticated user

把这篇没写完的文章写完,2015年的事就不留到2016了 开启DNS解析 mysql> show variables like 'skip_name_resol...

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

探究AWR 第一篇

statspack相比awr算是比较通用,而且免费,可以在标准版,企业版中使用,awr是新企业版本中才有的,算是statspack的一个升级版,而且代码不公开。...

3407
来自专栏张善友的专栏

ServiceStack.Redis 使用教程

环境准备 Redis (使用Windows版本做测试,运营环境建议使用Linux版本) ServiceStack.Redis-v3.00 在Windows上运行...

2555
来自专栏大数据学习笔记

Hadoop基础教程-第10章 HBase:Hadoop数据库(10.7 HBase 批量导入)

第10章 HBase:Hadoop数据库 10.7 HBase 批量导入 10.7.1 批量导入数据的方法 向HBase表中导入一条数据可以使用HBase Sh...

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

关于exp/imp的总结学习(r4笔记第26天)

关于exp/imp,是很常用的数据导出导入工具,在10g开始推出的数据泵datapump相当于是exp/imp的补充和升级版本。在后续章节再做一个总结。 exp...

2907

扫码关注云+社区