ITPub博客

首页 > 数据库 > Oracle > [20210901]cygwin下使用bbed.txt

[20210901]cygwin下使用bbed.txt

原创 Oracle 作者:lfree 时间:2021-09-01 10:09:09 0 删除 编辑

[20210901]cygwin下使用bbed.txt

--//工作需要,测试在cygwin下使用bbed,主要是这样的方式可以使用bash shell编程,编写脚本比windows批处理方面不少.
--//首先我的bbed安装在D:\tools\bbed目录下,windows下的bbed一般来自oracle 9i for windows的安装包,许多文章都有介绍如何移植.
--//我的cygwin64安装在D:\tools\cygwin64目录.

$ mount | grep /cygdrive/d
D: on /cygdrive/d type ntfs (binary,posix=0,user,noumount,auto)

$ cd /cygdrive/d/tools/bbed

$ cat bbed1.bat
@echo off
bbed parfile=bbed.par cmdfile=cmd.par

$ cat cmd.par
set count 8192
set width 160

$ cat bbed.par
blocksize=8192
listfile=d:\tools\bbed\filelist.txt
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
mode=edit
PASSWORD=blockedit
--//我最担心的是无法访问listfile的文件列表.

$ ./bbed1.bat
BBED: Release 2.0.0.0.0 - Limited Production on Tue Aug 31 19:54:16 2021
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED> set count 8192
        COUNT           8192

BBED> set width 160
        WIDTH           160
BBED> info
 File#  Name                                             Size(blks)
 -----  ----                                             ----------
     1  D:\APP\ORACLE\ORADATA\TEST\SYSTEM01.DBF                   0
     2  D:\APP\ORACLE\ORADATA\TEST\PDBSEED\SYSTEM01.DBF           0
     3  D:\APP\ORACLE\ORADATA\TEST\SYSAUX01.DBF                   0
     4  D:\APP\ORACLE\ORADATA\TEST\PDBSEED\SYSAUX01.DBF           0
     5  D:\APP\ORACLE\ORADATA\TEST\UNDOTBS01.DBF                  0
     6  D:\APP\ORACLE\ORADATA\TEST\PDBSEED\UNDOTBS01.DBF          0
     7  D:\APP\ORACLE\ORADATA\TEST\USERS01.DBF                    0
     8  D:\APP\ORACLE\ORADATA\TEST\TEST01P\SYSTEM01.DBF           0
     9  D:\APP\ORACLE\ORADATA\TEST\TEST01P\SYSAUX01.DBF           0
    10  D:\APP\ORACLE\ORADATA\TEST\TEST01P\UNDOTBS01.DBF          0
    11  D:\APP\ORACLE\ORADATA\TEST\TEST01P\USERS01.DBF            0
    28  D:\APP\ORACLE\ORADATA\TEST\TEST02P\SYSTEM01.DBF           0
    29  D:\APP\ORACLE\ORADATA\TEST\TEST02P\SYSAUX01.DBF           0
    30  D:\APP\ORACLE\ORADATA\TEST\TEST02P\UNDOTBS01.DBF          0
    31  D:\APP\ORACLE\ORADATA\TEST\TEST02P\USERS01.DBF            0
    36  D:\APP\ORACLE\ORADATA\TEST\TEST01P\LFREE05X.DBF           0
--//OK,显示文件列表没有问题.看看是否可以访问对应数据块.

BBED> x /rncc dba 11,133 *kdbr[0]
rowdata[66]                                 @8162
-----------
flag@8162: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8163: 0x01
cols@8164:    3

col    0[2] @8165: 10
col   1[10] @8168: ACCOUNTING
col    2[8] @8179: NEW YORK
--//注意:访问的块要+1.因为bbed for windows的版本无法识别10g以上的数据文件的OS头也就是第0块.
--//OK.
--//在/usr/local/bin目录下建立rlbbed文件.
$ cd /usr/local/bin
$ cat rlbbed
cd /cygdrive/d/tools/bbed/
./bbed1.bat
--//注意:一定要执行cd /cygdrive/d/tools/bbed/ ,不然一些文件如bbed.par无法访问.

$ chmod 750 rlbbed

$ echo "x /rncc dba 11,133 *kdbr[0]" | rlbbed
BBED: Release 2.0.0.0.0 - Limited Production on Tue Aug 31 20:08:41 2021
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED> set count 8192
        COUNT           8192

BBED> set width 160
        WIDTH           160

BBED> rowdata[66]                                 @8162
-----------
flag@8162: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8163: 0x01
cols@8164:    3

col    0[2] @8165: 10
col   1[10] @8168: ACCOUNTING
col    2[8] @8179: NEW YORK
--//OK,使用基本没有问题了.
--//不过windows 的bbed好麻烦,它的输出是dos的文本格式多了1个\r字符.另外注意几点块要+1,访问文件头不对.

--//测试一下我写的bash shell读取数据块的脚本:
$ . fff.sh 11 133 133 22487 ncc
10|ACCOUNTING|NEW YORK
20|RESEARCH|DALLAS
30|SALES|CHICAGO
40|OPERATIONS|BOSTON

$ . fff.sh 1 522 524 59 nnc | grep -i undo > aaa.txt
--//好慢.
$ cat aaa.txt
16|16|CREATE TABLE TS$("TS#" NUMBER NOT NULL,"NAME" VARCHAR2(30) NOT NULL,"OWNER#" NUMBER NOT NULL,"ONLINE$" NUMBER NOT NULL,"CONTENTS$" NUMBER NOT NULL,"UNDOFILE#" NUMBER,"UNDOBLOCK#" NUMBER,"BLOCKSIZE" NUMBER NOT NULL,"INC#" NUMBER NOT NULL,"SCNWRP" NUMBER,"SCNBAS" NUMBER,"DFLMINEXT" NUMBER NOT NULL,"DFLMAXEXT" NUMBER NOT NULL,"DFLINIT" NUMBER NOT NULL,"DFLINCR" NUMBER NOT NULL,"DFLMINLEN" NUMBER NOT NULL,"DFLEXTPCT" NUMBER NOT NULL,"DFLOGGING" NUMBER NOT NULL,"AFFSTRENGTH" NUMBER NOT NULL,"BITMAPPED" NUMBER NOT NULL,"PLUGGED" NUMBER NOT NULL,"DIRECTALLOWED" NUMBER NOT NULL,"FLAGS" NUMBER NOT NULL,"PITRSCNWRP" NUMBER,"PITRSCNBAS" NUMBER,"OWNERINSTANCE" VARCHAR2(30),"BACKUPOWNER" VARCHAR2(30),"GROUPNAME" VARCHAR2(30),"SPARE1" NUMBER,"SPARE2" NUMBER,"SPARE3" VARCHAR2(1000),"SPARE4" DATE) STORAGE (  OBJNO 16 TABNO 2) CLUSTER C_TS#(TS#)
15|15|CREATE TABLE UNDO$("US#" NUMBER NOT NULL,"NAME" VARCHAR2(30) NOT NULL,"USER#" NUMBER NOT NULL,"FILE#" NUMBER NOT NULL,"BLOCK#" NUMBER NOT NULL,"SCNBAS" NUMBER,"SCNWRP" NUMBER,"XACTSQN" NUMBER,"UNDOSQN" NUMBER,"INST#" NUMBER,"STATUS$" NUMBER NOT NULL,"TS#" NUMBER,"UGRP#" NUMBER,"KEEP" NUMBER,"OPTIMAL" NUMBER,"FLAGS" NUMBER,"SPARE1" NUMBER,"SPARE2" NUMBER,"SPARE3" NUMBER,"SPARE4" VARCHAR2(1000),"SPARE5" VARCHAR2(1000),"SPARE6" DATE) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE (  INITIAL 64K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 15 EXTENTS (FILE 1 BLOCK 224))
34|34|CREATE UNIQUE INDEX I_UNDO1 ON UNDO$(US#) PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE (  INITIAL 64K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 34 EXTENTS (FILE 1 BLOCK 320))
35|35|CREATE INDEX I_UNDO2 ON UNDO$(NAME) PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE (  INITIAL 64K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 35 EXTENTS (FILE 1 BLOCK 328))

--//fff.sh脚本如下,如果没有后面的tr -d "\r",输出的v_object_id="59\r",执行会报错.
--//注意脚本里面的在windows下通过ctrl+q,ctrl+g生成,linux下通过ctrl+v,ctrl+g生成.
#! /bin/bash -x
# argv1=file_number argv2=begin_block argvs3=end_block argv4=data_object_id argv5=bbed /x format
file_number=$1
begin_block=$2
end_block=$3
data_object_id=$4
ff="/r"${5}

# create sed script.
a=$5
len=$( echo ${#a})
seq $len | xargs -IQ expr substr $a Q 1 | grep -n '[nt]' | sed  's+:.$+s/ $//+' >| ff.sed
echo 's+^\*NULL\*$++g' >> ff.sed

# scan1 begin_block to end_block,define Scope.
/bin/rm scan1.txt 2>/dev/null
#declare -i v_object_id
while [ $begin_block -le $end_block ]
do
    v_object_id=$(echo "p /d dba $file_number,$begin_block  ktbbh.ktbbhsid.ktbbhod1" | rlbbed | grep ktbbhod1 |awk '{print $NF}'| tr -d "\r")
    if [ -z "$v_object_id" ]
    then
            v_object_id=0
    fi

    #echo  $v_object_id
    if (( $v_object_id == $data_object_id ))
    then
            echo $file_number,$begin_block >> scan1.txt
    fi
    begin_block=$[ begin_block + 1 ]
done

# scan2 kdbr and display record.
cat scan1.txt |while read dba
do
    #echo set dba $dba
    kdbr_size=$(echo map dba $dba | rlbbed | tr -d "\r" | grep "sb2 kdbr" | sed -e "s/^.*\[//;s/].*$//")
    #echo $kdbr_size

    begin=0
    end=$[ kdbr_size -1 ]
    #echo $begin $end

    while [ $begin -le $end ]
    do
        kdbr_off=$(echo p dba $dba offset 0 kdbr | rlbbed | tr -d "\r" |grep "sb2 kdbr\[$begin\]" | awk '{print $NF'})
        #echo $kdbr_off
        #if [ $kdbr_off -gt $kdbr_size ]
        if (( $kdbr_off > $kdbr_size ))
        then
            #echo -n "x $ff dba $dba *kdbr[$begin]" | rlbbed  | tr -d "\r" | grep "^col " | cut -c20- | sed -f ff.sed | paste -sd'|'
            #echo -n "x $ff dba $dba *kdbr[$begin]" | rlbbed | tr -d "\r" | sed -n '/^col /,${s/^col .\{13\}: /^G/;p;}' | sed '/^BBED/,$d' |tr -d "\n\r" | sed "1s/^G//" |tr "^G" "\n"| sed -f ff.sed| paste -sd"|"
            echo -n "x $ff dba $dba *kdbr[$begin]" | rlbbed | tr -d "\r" | sed -n '/^col /,${s/^col .\{13\}: //;p;}' | sed '/^BBED/,$d' |tr -d "\n\r" | sed "1s///" |tr "" "\n"| sed -f ff.sed| paste -sd"|"
        fi
        begin=$[ begin + 1 ]
    done
done

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2789795/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7970190