1.生成bbed list file文件:

  1. SQL> select file#||' '||name||' '||bytes from v$datafile;
  2. $ vim dbfile.txt
  3. 1 /u01/app/oradata/sydb/system01.dbf 754974720
  4. 2 /u01/app/oradata/sydb/sysaux01.dbf 587202560
  5. 3 /u01/app/oradata/sydb/undotbs01.dbf 429916160
  6. 4 /u01/app/oradata/sydb/users01.dbf 13107200
  7. 5 /disk2/oradata/sydb/tbs01.dbf 1816133632
  8. 6 /disk2/oradata/sydb/tbs02.dbf 119537664
  9. 7 /disk2/oradata/sydb/tbs03.dbf 20971520
  10. 8 /tmp/tbs_tmp.dbf 10485760

2.生成bbed参数文件:

  1. $ vim bbed.par
  2. mode=edit
  3. listfile= dbfile.txt
  4. blocksize=8192

3.创建测试表和数据:

  1. create table tt1 (id number,name varchar2(30)) tablespace tbs03;
  2. insert into tt1 values(1,'AAAA');
  3. insert into tt1 values(2,'BBBB');
  4. commit;

4.查询表数据行所在的数据块号:

  1. select
  2. dbms_rowid.rowid_block_number(rowid) blocknum,
  3. dbms_rowid.ROWID_RELATIVE_FNO(rowid) fileNo,
  4. id,name
  5. from tt1;
  6. BLOCKNUM FILENO ID NAME
  7. ---------- ---------- ---------- ------------------------------
  8. 135 7 1 AAAA
  9. 135 7 2 BBBB

5.使用bbed:

  1. $ bbed parfile=bbed.par
  2. Password: ==>blockedit is default password of bbed
  3. BBED: Release 2.0.0.0.0 - Limited Production on Tue Mar 31 20:39:29 2015
  4. Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
  5. ************* !!! For Oracle Internal Use only !!! ***************
  6. BBED> set filename '/disk2/oradata/sydb/tbs03.dbf' block 135
  7. FILENAME /disk2/oradata/sydb/tbs03.dbf
  8. BLOCK# 135
  9. BBED> map
  10. File: /disk2/oradata/sydb/tbs03.dbf (0)
  11. Block: 135 Dba:0x00000000
  12. ------------------------------------------------------------
  13. KTB Data Block (Table/Cluster)
  14. struct kcbh, 20 bytes @0 =>数据块头
  15. struct ktbbh, 72 bytes @20 =>事物层
  16. struct kdbh, 14 bytes @100 =>数据层
  17. struct kdbt[], 4 bytes @114 ==>表目录层
  18. sb2 kdbr[] @118 ==>行目录层
  19. ub1 freespace[] @122 ==>空闲空间
  20. ub1 rowdata[] @8166 ==>实际行数据
  21. ub4 tailchk @8188 ==>校验码

使用print打印数据块结构信息PRINT[/x|d|u|o|c] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]

  1. BBED> print kcbh
  2. struct kcbh, 20 bytes @0
  3. ub1 type_kcbh @0 0x06 ==>块类型(参考下图:Block Type)
  4. ub1 frmt_kcbh @1 0xa2 ==>块格式
  5. ub1 spare1_kcbh @2 0x00 ==>保留空间
  6. ub1 spare2_kcbh @3 0x00 ==>保留空间
  7. ub4 rdba_kcbh @4 0x01c00087 ==>块地址
  8. ub4 bas_kcbh @8 0x002fa91a ==>base SCN
  9. ub2 wrp_kcbh @12 0x0000 ==>wrap SCN
  10. ub1 seq_kcbh @14 0x01 ==>SCN 序列
  11. ub1 flg_kcbh @15 0x06 (KCBHFDLC, KCBHFCKV) ==> 块属性(0x01 新块,0x02我的理解是延迟修改的块,0x04检查保存的块,0x08 Temporary block)
  12. ub2 chkval_kcbh @16 0xe534 ==>校验码,它的值取决于参数(db_block_checksum)的设置值
  13. ub2 spare3_kcbh @18 0x0000 ==>保留空间

BlockTypeNumber

BlockType

01

Undo segment header

02

Undo data block

03

Save undo header

04

Save undo data block

05

Data segment header

06

Trans data,KTB manager data block (with ITL)

07

Temp table data block (no ITL)

08

Sort key

09

Sort run

10

Segment free list block

11

Data file header

(图:Block Type)

打印具体结构值:

  1. BBED> print type_kcbh
  2. ub1 type_kcbh @0 0x06
  3. BBED> print frmt_kcbh
  4. ub1 frmt_kcbh @1 0xa2

事务层:

  1. BBED> print ktbbh
  2. struct ktbbh, 72 bytes @20
  3. ub1 ktbbhtyp @20 0x01 (KDDBTDATA) ==>块类型,01 Data,02 Index
  4. union ktbbhsid, 4 bytes @24 ==>对象号(DBA_OBJECTS.OBJECT_ID)/段号
  5. ub4 ktbbhsg1 @24 0x0001a2c4 ==>对象段号
  6. ub4 ktbbhod1 @24 0x0001a2c4 ==>对象号
  7. struct ktbbhcsc, 8 bytes @28
  8. ub4 kscnbas @28 0x002fbaab ==>SCN Base
  9. ub2 kscnwrp @32 0x0000 ==>SCN Wrap
  10. sb2 ktbbhict @36 2 ==>事务槽号(ITL number)
  11. ub1 ktbbhflg @38 0x32 (NONE) ==>on the free list
  12. ub1 ktbbhfsl @39 0x00 ==>ITL TX free list slot
  13. ub4 ktbbhfnx @40 0x01c00080 ==>下一个空闲块的地址 (next free block dba)
  14. struct ktbbhitl[], 24 bytes @44 ==>事务槽1
  15. struct ktbitxid, 8 bytes @44 ==>xid V$TRANSACTION.XID
  16. ub2 kxidusn @44 0x0005 ==>usn V$TRANSACTION.XIDUSN
  17. ub2 kxidslt @46 0x001f ==>slot V$TRANSACTION.XIDSLOT
  18. ub4 kxidsqn @48 0x000009cb ==>sqn V$TRANSACTION.UBASQN
  19. struct ktbituba, 8 bytes @52 ==>uba
  20. ub4 kubadba @52 0x00c002d1 ==>dba
  21. ub2 kubaseq @56 0x0375 ==>seq
  22. ub1 kubarec @58 0x11 ==>V$TRANSACTION.UBAREC
  23. ub2 ktbitflg @60 0xa000 (KTBFUPB, KTBFCOM)
  24. union _ktbitun, 2 bytes @62
  25. sb2 _ktbitfsc @62 0
  26. ub2 _ktbitwrp @62 0x0000
  27. ub4 ktbitbas @64 0x002fb364
  28. struct ktbbhitl[], 24 bytes @68 ==>事务槽2
  29. struct ktbitxid, 8 bytes @68
  30. ub2 kxidusn @68 0x0000
  31. ub2 kxidslt @70 0x0000
  32. ub4 kxidsqn @72 0x00000000
  33. struct ktbituba, 8 bytes @76
  34. ub4 kubadba @76 0x00000000
  35. ub2 kubaseq @80 0x0000
  36. ub1 kubarec @82 0x00
  37. ub2 ktbitflg @84 0x0000 (NONE)
  38. union _ktbitun, 2 bytes @86
  39. sb2 _ktbitfsc @86 0
  40. ub2 _ktbitwrp @86 0x0000
  41. ub4 ktbitbas @88 0x00000000

数据层:

  1. BBED> print kdbh
  2. struct kdbh, 14 bytes @100
  3. ub1 kdbhflag @100 0x00 (NONE) ==>标记(N=ptcfree hit(clusters),F=do not put on free list,K=flushable cluster keys)
  4. sb1 kdbhntab @101 1 ==>表个数
  5. sb2 kdbhnrow @102 2 ==>块包含的行数
  6. sb2 kdbhfrre @104 -1 ==>是否在空闲列表 -1不在空闲列表
  7. sb2 kdbhfsbo @106 22 ==>空闲空间的开始补偿
  8. sb2 kdbhfseo @108 8066 ==>空闲空间的结束补偿
  9. sb2 kdbhavsp @110 8044 ==>块的平均空间
  10. sb2 kdbhtosp @112 8044 ==>块可以使用的总空间

校验码:

  1. BBED> print tailchk
  2. ub4 tailchk @8188 0xbaab0601 --尾部校验码
  3. tailchk=(低位2个字节)bas_kcbh(0x002fbaab)+(1位字节)type_kcbh(0x06)+(1位字节)seq_kcbh(0x01) ==>值在块头记录)

查找:
数据表存储的值:

  1. SQL>column name format a8
  2. SQL>column dump format a40
  3. SQL>select name,dump(name,16)dump from tt1;
  4. NAME DUMP
  5. -------- ----------------------------------------
  6. AAAA Typ=1 Len=4: 41,41,41,41
  7. BBBB Typ=1 Len=4: 42,42,42,42

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

Find Switch

DataType

x

Haxadecimal

d

Decimal

u

Unsigned decimal

o

Octal

c

Character

/c 表示通过字符查找:

  1. BBED> find /c AAAA
  2. File: /disk2/oradata/sydb/tbs03.dbf (0)
  3. Block: 135 Offsets: 8184 to 8191 Dba:0x00000000
  4. ------------------------------------------------------------------------
  5. 41414141 01061aa9

datafile为7,block 135,offset 为8184就是存储AAAA的位置

  1. BBED> dump /v dba 7,135 offset 8184
  2. File: /disk2/oradata/sydb/tbs03.dbf (7)
  3. Block: 135 Offsets: 8184 to 8191 Dba:0x01c00087
  4. -------------------------------------------------------
  5. 41414141 0106abba l AAAA..

/x 表示使用十六进制查找:

  1. BBED> find /x 41414141
  2. File: /disk2/oradata/sydb/tbs03.dbf (0)
  3. Block: 135 Offsets: 8184 to 8191 Dba:0x00000000
  4. ------------------------------------------------------------------------
  5. 41414141 01061aa9

修改值(mode 必须为edit):
MODIFY[/x|d|u|o|c] numeric/character string
通过已知的文件号7,block 135,offset把AAAA的值修改为ABCE

  1. BBED> modify /c ABCE file 7 block 135 offset 8184
  2. Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) Y
  3. File: /disk2/oradata/sydb/tbs03.dbf (7)
  4. Block: 135 Offsets: 8184 to 8191 Dba:0x01c00087
  5. ------------------------------------------------------------------------
  6. 41424345 0106abba

提交修改:
SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ]

  1. BBED> sum apply
  2. Check value for File 7, Block 135:
  3. current = 0xbe37, required = 0xbe37

验证数据块:
VERIFY [ DBA | FILE | FILENAME | BLOCK ]

  1. BBED> verify
  2. DBVERIFY - Verification starting
  3. FILE = /disk2/oradata/sydb/tbs03.dbf
  4. BLOCK = 135
  5. DBVERIFY - Verification complete
  6. Total Blocks Examined : 1
  7. Total Blocks Processed (Data) : 1
  8. Total Blocks Failing (Data) : 0
  9. Total Blocks Processed (Index): 0
  10. Total Blocks Failing (Index): 0
  11. Total Blocks Empty : 0
  12. Total Blocks Marked Corrupt : 0
  13. Total Blocks Influx : 0
  14. Message 531 not found; product=RDBMS; facility=BBED 

验证数据的修改,注:应该在数据库关闭时使用bbed修改数据块,因为当数据库运行时,数据块可能被修改覆盖,这里只是做为测试,并没有其它任何dml或其它操作,当bbed修改数据块并物理保存后,在内存中的数据块并没有刷新,所以此时查询到的数据依然是旧数据:

  1. SQL> column dump format a60
  2. SQL> select name,dump(name,16)dump from tt1;
  3. NAME DUMP
  4. ------------------------------ ------------------------------------------------------------
  5. AAAA Typ=1 Len=4: 41,41,41,41
  6. BBBB Typ=1 Len=4: 42,42,42,42

清理buffer_cache和share_pool 触发物理读,数据正确:

  1. SQL>alter system flush buffer_cache;
  2. System altered.
  3. Elapsed: 00:00:00.93
  4. SQL>alter system flush shared_pool;
  5. System altered.
  6. SQL> select name,dump(name,16)dump from tt1;
  7. NAME DUMP
  8. ------------------------------ ------------------------------------------------------------
  9. ABCE Typ=1 Len=4: 41,42,43,45
  10. BBBB Typ=1 Len=4: 42,42,42,42

撤销操作:
REVERT [ DBA | FILE | FILENAME | BLOCK ]
撤销当前会话所有操作:

  1. BBED> revert
  2. All changes made in this session will be rolled back. Proceed? (Y/N) y
  3. Reverted file '/disk2/oradata/sydb/tbs03.dbf', block 135
  4. Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y

选择文件和数据块撤销:

  1. BBED> revert dba 7,135

撤销当前会话上一个操作:
UNDO
当前值:

  1. SQL> select name,dump(name,16)dump from tt1;
  2. NAME DUMP
  3. ------------------------------ ----------------------------------------
  4. DFCA Typ=1 Len=4: 44,46,43,41
  5. BBBB Typ=1 Len=4: 42,42,42,42
  1. BBED> modify /c ibmc dba 7,135 offset 8184
  2. File: /disk2/oradata/sydb/tbs03.dbf (7)
  3. Block: 135 Offsets: 8184 to 8191 Dba:0x01c00087
  4. ------------------------------------------------------------------------
  5. 69626d63 0106abba
  6. BBED> sum apply
  7. Check value for File 7, Block 135:
  8. current = 0xa93a, required = 0xa93a

确认值:

  1. SQL> alter system flush shared_pool;
  2. SQL> alter system flush buffer_cache;
  3. SQL> select name,dump(name,16)dump from tt1;
  4. NAME DUMP
  5. ------------------------------ ----------------------------------------
  6. ibmc Typ=1 Len=4: 69,62,6d,63
  7. BBBB Typ=1 Len=4: 42,42,42,42

UNDO操作:

  1. BBED> undo
  2. BBED> modify /x 44464341 filename '/disk2/oradata/sydb/tbs03.dbf' block 135. offset 8184.
  3. File: /disk2/oradata/sydb/tbs03.dbf (0)
  4. Block: 135 Offsets: 8184 to 8191 Dba:0x00000000
  5. ------------------------------------------------------------------------
  6. 44464341 0106abba
  7. <32 bytes per line>
  8. BBED> sum apply
  9. Check value for File 0, Block 135:
  10. current = 0xaf39, required = 0xaf39

--The end

使用BBED理解和修改Oracle数据块的更多相关文章

  1. [转]Oracle数据块体系的详细介绍

    数据块概述Oracle对数据库数据文件(datafile)中的存储空间进行管理的单位是数据块(data block).数据块是数据库中最小的(逻辑)数据单位.与数据块对应的,所有数据在操作系统级的最小 ...

  2. Oracle数据块损坏的恢复实例

    测试环境:11.2.0.4 1.构建数据块损坏的测试环境 2.有备份:常规恢复坏块 3.无备份:跳过坏块 1.构建数据块损坏的测试环境 1.1 创建测试表 --Create Table t_test ...

  3. oracle数据块核心剖析

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp57 数据块(Oracle Data Blocks),本文简称为" ...

  4. java.sql.SQLException: ORA-01578: ORACLE 数据块损坏问题解决办法

    错误信息: java.sql.SQLException: ORA-01578: ORACLE 数据块损坏 (文件号 17, 块号 315703) ORA-01110: 数据文件 17: 'D:\ORA ...

  5. Oracle数据块损坏篇之10231内部事件

    实验:某个分区数据块损坏,不完全恢复此分区表数据 背景:数据库没有有效备份,某个分区中有数据块损坏. 要求:最大限度恢复此分区数据. 环境:RHEL 6.4 + Oracle 11.2.0.4 1. ...

  6. Oracle数据块深入分析总结

    http: 最近在研究块的内部结构,把文档简单整理了一下,和大家分享一下.该篇文章借助dump和BBED对数据 库内部结构进行了分析,最后附加了一个用BBED解决ORA-1200错误的小例子.在总结的 ...

  7. Oracle 数据块

    以emp表为例 SYS@ prod>select * from scott.emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO --------- ...

  8. ORA-01578: ORACLE 数据块损坏 (文件号 10, 块号 57896)ORA-01110: 数据文件 10: '/data/oradata/prod35.dbf'

    https://community.oracle.com/thread/3540795 概述 ------------- 数据库坏块(corruption) 的类型可以按照坏块所属对象的不同,分为用户 ...

  9. ORACLE 数据块dump

    1. rdba(Tablespace relative database block address) 是相对数据块地址,是数据所在的地址,rdba可就是rowid 中rfile#+block#. 根 ...

随机推荐

  1. 线程组ThreadGroup

      ThreadGroup线程组表示一个线程的集合.此外,线程组也可以包含其他线程组. 线程组构成一棵树,在树中,除了初始线程组外,每个线程组都有一个父线程组. 允许线程访问有关自己的线程组的信息,但 ...

  2. eclipse插件-easy explore

    最近找到一个Eclipse的插件,名字是Easy Explore,是Easy Structs 其 中的一个部分.主要的功能就是在Eclipse里面视图的部分如果看到自己的工程,或者Package,包什 ...

  3. Linux编译前提前丰富库资源

    Linux在软件编译的时候,时常提示一些依赖,无谓浪费时间.我们可以事先将常用的依赖包,一起安装一下,防止后续编译过程被打断. 之前,有个很重要的前提,就是epel源的安装. # ls /etc/yu ...

  4. 安装SQL Servre2000时提示“command line option syntax error! type command /? for help”

    问题: 当程序正在安装ms数据访问组件时,弹出错误提示框:command line option syntax error,type command/? for help,点击确定继续:到了程序正在安 ...

  5. MVC、MVP、MVVM架构模式

    MVC模式 如何设计一个程序的结构,这是一门专门的学问,叫做"架构模式"(architectural pattern),属于编程的方法论. MVC模式就是架构模式的一种,不仅适用于 ...

  6. DOM库及常用方法封装

    节点 nodeType nodeName nodeValue 元素节点 1 大写的标签名 null 文本节点 3 #text 文本内容 注释节点 8 #comment 注释内容 document 9 ...

  7. 跟我一起学kafka(一)

    从昨天下午接到新任务,要采集一个法院网站得所有公告,大概是需要采集这个网站得所有公告列表里得所有txt内容,txt文件里边是一件件赤裸裸得案件,记录这案由,原告被告等相关属性(不知道该叫什么就称之为属 ...

  8. 流媒体协议部分RTP、RTCP、RTSP、MMS、HLS、HTTP progressive streaming

    流媒体协议:(RTP.RTCP.RTSP.MMS.HLS.HTTP progressive streaming) 当前在internet上传送音频和视频等信息主要有两种方式: 下载,完整下载一个视频, ...

  9. mongodb(四)

    Count+Distinct+Group数据库命令操作固定集合特性GridFS文件系统补充服务器端脚本 db.runCommand({group:{ ns:"persons", k ...

  10. HTML5服务器推送消息的各种解决办法,html5服务器

    HTML5服务器推送消息的各种解决办法,html5服务器 摘要 在各种BS架构的应用程序中,往往都希望服务端能够主动地向客户端推送各种消息,以达到类似于邮件.消息.待办事项等通知. 往BS架构本身存在 ...