您好,欢迎访问一九零五行业门户网

使用awk来解析dump文件

dump文件是平时工作中经常碰见的,有时候得到一个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文本编辑器语法
正则表达式中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         }
      }
      else {
        printf %s,substr( $0,s+1,length( substr($0,s+1))-1 )
        if ( ln0       }
    }
  }
  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
/
本文永久更新链接地址:
其它类似信息

推荐信息