【BBED】bbed的使用(三)

bbed的使用(一)  介绍了BBED的编译安装

bbed的使用(二) 介绍了bbed的语法规则和常用命令的使用。

本文继续介绍bbed常用命令的使用。

17 DUMP[/v] [ DBA | FILENAME | FILE | BLOCK | OFFSET | COUNT ]

   dump 命令可以转储数据块的内容。 使用/v 选项可以输出详细的内容。有上面的提示可以看出,dump命令可以指定DBA,FILENAME,FILE,BLOCK,OFFSET,COUNT参数。

   如果没有指定当前的文件, 可以根据dump命令中指定的block和offset值转储数据块,dump的大小有count决定,默认为512bytes 或者选择指定其他的值。

BBED> dump file 4 block 420

 File: /u01/app/ora10g/oradata/orcl/users01.dbf (4)

 Block: 420              Offsets:    0 to  511           Dba:0x010001a4

------------------------------------------------------------------------

 06a20000 a4010001 a67c1000 00000306 9aee0000 01000000 f1d00000 577c1000

 00000000 02003200 a1010001 04001000 5c010000 13008000 92011f00 01200000

 a67c1000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00010100 ffff1400 8f1f7b1f 7b1f0000 01008f1f 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 <32 bytes per line>

我们可以利用前面介绍的block header structure的知识来解释上面的信息:

Type    Format   Unused   RDBA     SCN Base  SCN Wrap  Seq   Flag  

 06      a2       0000    a4010001 a67c1000  0000       03    06

18 PRINT[/x|d|u|o|c] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]

   print 命令可以输出数据块的结构,和dump一样可以指定DBA,FILE,FILENAME,BLOCK,OFFSET;

BBED> set dba 4,440

        DBA             0x010001b8 (16777656 4,440)

BBED> set offset 0

        OFFSET          0

查看kcbh --Block Header Structure

BBED> p

kcbh.type_kcbh

--------------

ub1 type_kcbh                               @0        0x06

BBED>

   当print打印一个数据块的结构时,输出的格式为:

   Unit Size*  |  Name   |  Offset  | Value

Unit Size* 显示为bytes并且标明value的值是带符号的或者不带符号的。

BBED> p kcbh

struct kcbh, 20 bytes                       @0      

   ub1 type_kcbh                            @0        0x06

   ub1 frmt_kcbh                            @1        0xa2

   ub1 spare1_kcbh                          @2        0x00

   ub1 spare2_kcbh                          @3        0x00

   ub4 rdba_kcbh                            @4        0x010001b8

   ub4 bas_kcbh                             @8        0x00404938

   ub2 wrp_kcbh                             @12       0x0000

   ub1 seq_kcbh                             @14       0x10

   ub1 flg_kcbh                             @15       0x06 (KCBHFDLC, KCBHFCKV)

   ub2 chkval_kcbh                          @16       0x619d

   ub2 spare3_kcbh                          @18       0x0000

BBED>

查看 kdbh  --Data Header Structure

BBED> p kdbh

   ub1 kdbhflag                             @100      0x00 (NONE)

   b1 kdbhntab                              @101      1

   b2 kdbhnrow                              @102      14   <-- 有14行数据

   sb2 kdbhfrre                             @104      -1

   sb2 kdbhfsbo                             @106      46

   sb2 kdbhfseo                             @108      7521

   b2 kdbhavsp                              @110      7475

   b2 kdbhtosp                              @112      7475

BBED>

查看这个数据块里有多少行数据:

BBED> p kdbhnrow

      b2 kdbhnrow                           @102      14

BBED>

作为显示指定数据块的信息的补充,使用* 前缀,print的命令也可以显示数据结构指定位置所包含的信息。如下例子:

显示块行信息:

从这里,我们可以观察到这个块一共有14行数据(emp表总共有14行数据)。每一行指针需要2个bytes,他们从偏移量118开始到144存储在这个数据块中

BBED> p kdbr

sb2 kdbr[0]                                 @118      8050

sb2 kdbr[1]                                 @120      8007

sb2 kdbr[2]                                 @122      7964

sb2 kdbr[3]                                 @124      7923

sb2 kdbr[4]                                 @126      7878

sb2 kdbr[5]                                 @128      7837

sb2 kdbr[6]                                 @130      7796

sb2 kdbr[7]                                 @132      7756

sb2 kdbr[8]                                 @134      7718

sb2 kdbr[9]                                 @136      7675

sb2 kdbr[10]                                @138      7637

sb2 kdbr[11]                                @140      7599

sb2 kdbr[12]                                @142      7560

sb2 kdbr[13]                                @144      7521

BBED>

BBED> p *kdbr[0]

rowdata[529]

------------

ub1 rowdata[529]                            @8150     0x2c

从上面的信息可以看到第0行开始的位置在偏移量8150,dump出这一起始处的信息:

BBED> d /v dba 4,440 offset 8150 count 16

 File: /u02/oradata/xhdb/users01.dbf (4)

 Block: 440     Offsets: 8150 to 8165  Dba:0x010001b8

-------------------------------------------------------

 2c010803 c24a4605 42656376 7805434c l ,....JF.Becvx.CL

 <16 bytes per line>

BBED> 

2.print行数据信息

尽管print不能像dump命令那样提供count选项,但是它也能够打印出 offset,如 下所示:

Switch    Display Format

/x        Hex

/d        signed decimal

/u        unsigned decimal

/o        Octal

/c        Character

/n        Oracle Number

/t        Oracle Date

/i        Oracle ROWID

根据相关的计算得知,数字7369实际存储于数据库16进制的值如下所示:

7369  c2 4a 46

BBED> d /v dba 4,440 offset 8150 count 16

 File: /u02/oradata/xhdb/users01.dbf (4)

 Block: 440     Offsets: 8150 to 8165  Dba:0x010001b8

-------------------------------------------------------

 2c010803 c24a4605 42656376 7805434c l ,....JF.Becvx.CL

 <16 bytes per line>

print命令打印绝对偏移量的信息

BBED> p offset 8150

rowdata[529]

------------

ub1 rowdata[529]                            @8150     0x2c

BBED>

以字符显示偏移量 为8150的值:

BBED> p /c offset 8150

rowdata[529]

------------

ub1 rowdata[529]                            @8150    ,

BBED>

以数字显示偏移量处的值:

BBED> p /n offset 8154

rowdata[533]

------------

ub1 rowdata[533]                            @8154     194

BBED> p /n offset 8155

rowdata[534]

------------

ub1 rowdata[534]                            @8155     74

BBED> p /n offset 8156

rowdata[535]

------------

ub1 rowdata[535]                            @8156     70

BBED>

SQL> select dump(7369) from dual;

DUMP(7369)

----------------------

Typ=2 Len=3: 194,74,70

SQL>

19 E(X)AMINE[/Nuf] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]:

e(x)amine的命令选项:examine 命令可以根据一下转换格式翻译数据块中的数据

   N - a number which specifies a repeat count.

   u - a letter which specifies a unit size:

   b - b1, ub1 (byte)

   h - b2, ub2 (half-word)

   w - b4, ub4(word)

   r - Oracle table/index row

   f - a letter which specifies a display format:

   x - hexadecimal

   d - decimal

   u - unsigned decimal

   o - octal

   c - character (native)

   n - Oracle number

   t - Oracle date

   i - Oracle rowid

与print不同之处在与examine命令不能将数据块中的存储的内容翻译成我们能够看懂的信息。但是它可以显示行信息。结合row的数据类型信息,examine可以被用来从数据块中重新得到行信息。

examine命令允许以下这些指定的转换符进行数据的转义,比如如果我们想要翻译一个oracle表中的数据行,第一个字段是字符,第二,三个字段是数值,我们可以这样执行命令:

 x /rcnn

下面的例子显示了print和examine命令,显示第1行的数据信息:

select * from emp ; 输出的第一行数据如下所示:

EMPNO   ENAME      JOB              MGR HIREDATE            SAL       COMM     DEPTNO

------ ----------- --------- ---------- ------------ ---------- ---------- ----------

7369    Becvx      CLERK           7902 02-JUN-10           900                    20

7499    ALLEN      SALESMAN        7698 20-FEB-81          1600        300         30

7521    WARD       SALESMAN        7698 22-FEB-81          1250        500         30

字段的依次类型为:nccntnnn

BBED> p *kdbr[0] --显示第一行的信息

rowdata[529]

------------

ub1 rowdata[529]                            @8150     0x2c

BBED> x /r --显示原始存储数据格式

rowdata[529]                                @8150   

------------

flag@8150: 0x2c (KDRHFL, KDRHFF, KDRHFH)

lock@8151: 0x01

cols@8152:    8

col    0[3] @8153:  0xc2  0x4a  0x46

col    1[5] @8157:  0x42  0x65  0x63  0x76  0x78

col    2[5] @8163:  0x43  0x4c  0x45  0x52  0x4b

col    3[3] @8169:  0xc2  0x50  0x03

col    4[7] @8173:  0x78  0x6e  0x06  0x02  0x14  0x0c  0x1f

col    5[2] @8181:  0xc2  0x0a

col    6[0] @8184: *NULL*

col    7[2] @8185:  0xc1  0x15

BBED> x /rnccntnnn --指定转换格式,出现我们能够看懂的值。

rowdata[529]                                @8150   

------------

flag@8150: 0x2c (KDRHFL, KDRHFF, KDRHFH)

lock@8151: 0x01

cols@8152:    8

col    0[3] @8153: 7369

col    1[5] @8157: Becvx

col    2[5] @8163: CLERK

col    3[3] @8169: 7902

col    4[7] @8173: 02-JUN-10

col    5[2] @8181: 900

col    6[0] @8184: *NULL*

col    7[2] @8185: 20

BBED>

直接显示第10行数据:

BBED> x /rnccntnnn  *kdbr[9]

rowdata[154]                                @7775   

------------

flag@7775: 0x2c (KDRHFL, KDRHFF, KDRHFH)

lock@7776: 0x01

cols@7777:    8

col    0[3] @7778: 7844

col    1[6] @7782: TURNER

col    2[8] @7789: SALESMAN

col    3[3] @7798: 7698

col    4[7] @7802: 08-SEP-81

col    5[2] @7810: 1500

col    6[1] @7813: 0

col    7[2] @7815: 30

BBED>

连续显示3个数据行的值:

注意:可以看到后两个没有数据的输出,所以要先print 行的值

BBED> x /3rnccntnnn

rowdata[529]                                @8150   

------------

flag@8150: 0x2c (KDRHFL, KDRHFF, KDRHFH)

lock@8151: 0x01

cols@8152:    8

col    0[3] @8153: 7369

col    1[5] @8157: Becvx

col    2[5] @8163: CLERK

col    3[3] @8169: 7902

col    4[7] @8173: 02-JUN-10

col    5[2] @8181: 900

col    6[0] @8184: *NULL*

col    7[2] @8185: 20

tailchk                                     @8188   

-------

flag@8188: 0x10 (KDRHFD)

lock@8189: 0x06

cols@8190:    0

tailchk                                     @8188   

-------

flag@8190: 0x38 (KDRHFF, KDRHFD, KDRHFH)

lock@8191: 0x49

cols@8192:    0

BBED>

解决办法:

BBED> p *kdbr[0] *kdbr[1] *kdbr[2]

rowdata[443]

------------

ub1 rowdata[443]                            @8064     0x2c

BBED> x /3rnccntnnn

rowdata[443]                                @8064   

------------

flag@8064: 0x2c (KDRHFL, KDRHFF, KDRHFH)

lock@8065: 0x01

cols@8066:    8

col    0[3] @8067: 7521

col    1[4] @8071: WARD

col    2[8] @8076: SALESMAN

col    3[3] @8085: 7698

col    4[7] @8089: 22-FEB-81

col    5[3] @8097: 1250

col    6[2] @8101: 500

col    7[2] @8104: 30

rowdata[486]                                @8107   

------------

flag@8107: 0x2c (KDRHFL, KDRHFF, KDRHFH)

lock@8108: 0x01

cols@8109:    8

col    0[3] @8110: 7499

col    1[5] @8114: ALLEN

col    2[8] @8120: SALESMAN

col    3[3] @8129: 7698

col    4[7] @8133: 20-FEB-81

col    5[2] @8141: 1600

col    6[2] @8144: 300

col    7[2] @8147: 30

rowdata[529]                                @8150   

------------

flag@8150: 0x2c (KDRHFL, KDRHFF, KDRHFH)

lock@8151: 0x01

cols@8152:    8

col    0[3] @8153: 7369

col    1[5] @8157: Becvx

col    2[5] @8163: CLERK

col    3[3] @8169: 7902

col    4[7] @8173: 02-JUN-10

col    5[2] @8181: 900

col    6[0] @8184: *NULL*

col    7[2] @8185: 20

BBED>

注意:oracle向数据块填充数据的时候是有底向上的,因此设置第一行的偏移量会阻止重复操作。比如:当前是第三行,并且hang 2 被指定了,因此,行3和行2 都会被显示。如果

当前行是7,并且指定了 行4 ,那么 行 7,6,5,4都会被显示。

20 FIND[/x|d|u|o|c] numeric/character string [ TOP | CURR ]

转换符:

   x - hexadecimal

   d - decimal

   u - unsigned decimal

   o - octal

   c - character (native)

定位数据在数据块中的位置。命令允许寻找十六进制,字符串,数字的数。使用TOP 关键字可以直接从数据块的顶部查找,或者使用CURR关键字从当前的位置查找。

21 COPY [ DBA | FILE | FILENAME | BLOCK ] TO [ DBA | FILE | FILENAME | BLOCK ]

   copy 命令可以将数据块从一个位置拷贝到另外一个位置。配合其他命令如filename,file和offset的指定,或者直接指定DBA。

22 MODIFY[/x|d|u|o|c] numeric/character string

      [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]

      modify 命令可以对数据块内的数据进行修改的。可以指定DBA,FILE,FILENAME,BLOCK,OFFSET等参数。如果没有指定当前的file,block,和offset,

      执行该命令的时候会修改。可选地,一个符号或者指针可以在执行此命令的时候指定。

23 ASSIGN [/x|d|u|o]=: [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]: [ value |]

24 SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ]

   SUM 命令用来检查和设置数据块的校验和,执行sum命令是可以指定DBA,FILENAME,FILE,BLOCK 和OFFSET参数。 

25 PUSH [ DBA | FILE | FILENAME | BLOCK | OFFSET ]/POP

   PUSH/POP 命令用来将一个file,block和地址偏移量迁移到一个备份过的内存栈中,然后取用的时候POP命令可以从内存栈中取出之前push进去的对象。

   这样可以使当前正在被修改的对象临时被存储,与此同时其他的对象可以被修改或者检查。

26 REVERT [ DBA | FILE | FILENAME | BLOCK ]

   相当于undo all 操作,可以修复file,filename,block 或者dba 到使用bbed编辑的初始状态。

27 UNDO

    回滚之前的操作。

28 HELP [| ALL ]

  帮助命令。。

29 VERIFY [ DBA | FILE | FILENAME | BLOCK ]

   检查数据块的一致性。它执行和dbferify 类似的功能。

31 CORRUPT [ DBA | FILE | FILENAME | BLOCK ]

    corrupt 命令指定blocks 为坏块。

BBED>corrupt dba 4,13

Block marked  media corrupt

注意:undo命令不能回退corrupt操作,然而revert命令可以。

---------------------------------EOF-----------------------------

以后的篇章中将以事件案例为载体来详细的介绍bbed各个命令在实践中的使用。

时间: 2025-01-02 12:40:18

【BBED】bbed的使用(三)的相关文章

Oracle非常规恢复方法:使用BBED跳过归档

一.BBED工具 1.BBED的安装 oracle 11g中缺bbed包,oracle11g bbed install and example 1.上传(sbbdpt.o ssbbded.o bbedus.msb,该三个文件拷贝oracle的linux64版本的)文件 $ORACLE_HOME/rdbms/lib/ssbbded.o $ORACLE_HOME/rdbms/lib/sbbdpt.o $ORACLE_HOME/rdbms/mesg/bbedus.msb 执行如下命令: cd $ORA

【BBED】BBED模拟并修复ORA-08102错误

[BBED]BBED模拟并修复ORA-08102错误   1.1  BLOG文档结构图     1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 使用BBED修复ORA-08102错误(重点) ② BBED的使用 ③ 数据块格式的dump文件解释 ④ ORA-08102错误的trace文件解释 ⑤ 从rdba获取ROWID信息 ⑥ 其它实用技能   Tips: ① 本文在itpub(h

【BBED】丢失归档文件情况下的恢复

[BBED]丢失归档文件情况下的数据文件的恢复   1.1  BLOG文档结构图     1.2  前言部分   1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 若丢失归档情况下数据文件的恢复,bbed和隐含参数(重点) ② 数据库启动过程中的介质恢复,scn号的关系 ③ BBED如何修改文件头 ④ 归档和非归档模式下数据库的全备     Tips:        ① 若文章代码格式有错乱,推荐使用QQ

【BBED】 SYSTEM文件头损坏的恢复(4)

[BBED] SYSTEM文件头损坏的恢复   1.1  BLOG文档结构图     1.2  前言部分   1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① BBED恢复SYSTEM文件头 ② BBED查看文件头的信息     Tips:        ① 若文章代码格式有错乱,推荐使用QQ.搜狗或360浏览器,也可以下载pdf格式的文档来查看,pdf文档下载地址:http://yunpan.cn/cd

[20121011]global_name为空的恢复(new)-bbed学习.txt

[20121011]global_name为空的恢复(new)-bbed学习.txt 前面已经提到如果global_name为空,数据库会起来. 下次开机时,出现如下提示: SQL> startup ORACLE instance started. Total System Global Area 2137886720 bytes Fixed Size                  2215064 bytes Variable Size            1728054120 bytes

Oracle坏块问题处理 Oracle坏块修复 Oracle坏块怎么办

Oracle数据库出现坏块现象是指:在Oracle数据库的一个或多个数据块(一个数据块的容量在创建数据库时由db_block_size参数指定,缺省为8K)内出现内容混乱的现象.由于正常的数据块都有固定的合法内容格式,坏块的出现,导致数据库进程无法正常解析数据块的内容,进而使数据库进程报错乃至挂起,并级联导致整个数据库实例出现异常. 一.坏块分类 物理坏块:也可以称为介质坏块,指的是块格式本身是坏的,块内的数据没有任何意义. 逻辑坏块:指的是块内的数据在逻辑是存在问题.比如说索引块的索引值没有按

【故障处理】DG环境主库丢失归档情况下数据文件的恢复

[故障处理]DG环境主库丢失归档情况下数据文件的恢复 1  BLOG文档结构图     2  前言部分   2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① BBED的编译 ② BBED修改文件头让其跳过归档从而可以ONLINE(重点) ③ OS命名格式转换为ASM的命名格式 ④ DG环境中备库丢失数据文件的情况下的处理过程(重点) ⑤ 数据文件OFFLINE后应立即做一次RECOVER操作 ⑥ BBED环境

oralce提示ORA-30025: DROP segment ‘_SYSSMU559$’ (in undo tablespace) not allowed错误

这里是今天一些学生的问题,下午没事研究了一下. 发现非常的奇怪,大家一起来探讨下. 对于没有活动事务的情况,其回滚段的状态居然是Pending offline. SQL> alter tablespace UNDOTBS2 offline; alter tablespace UNDOTBS2 offline * ERROR at line 1: ORA-30042: Cannot offline the undo tablespace   SQL> alter rollback segment

oracle中12C sysaux 异常恢复—ORA-01190错误恢复

有朋友请求支援,他们数据库由于file 3 大量坏块,然后直接使用rman 备份还原了file 3,但是在recover过程中发现归档丢失,而且整个库在丢失归档的scn之后,还做过resetlogs操作,导致现在整个库无法正常启动,报ORA-01190错误,希望帮忙把file 3 给online起来,整个库正常open[当然在丢失sysaux的情况下,数据库可以open起来,但是这种情况下,迁移数据比较麻烦] SQL> startup; ORACLE 例程已经启动.   Total System