使用BBED理解和修改Oracle数据块(一)

2015-07-16 12:10:02 · 作者: · 浏览: 51

1.生成bbed list file文件:


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


2.生成bbed参数文件:


$ vim bbed.par
mode=edit
listfile= dbfile.txt
blocksize=8192


3.创建测试表和数据:


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


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


select
? dbms_rowid.rowid_block_number(rowid) blocknum,
? dbms_rowid.ROWID_RELATIVE_FNO(rowid) fileNo,
? id,name
? from tt1;
BLOCKNUM? ? FILENO? ? ? ? ID NAME
---------- ---------- ---------- ------------------------------
? ? ? 135? ? ? ? ? 7? ? ? ? ? 1 AAAA
? ? ? 135? ? ? ? ? 7? ? ? ? ? 2 BBBB


5.使用bbed:



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


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


?


(:Block Type)


打印具体结构值:


BBED> print type_kcbh
ub1 type_kcbh? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @0? ? ? ? 0x06
BBED> print frmt_kcbh
ub1 frmt_kcbh? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @1? ? ? ? 0xa2


事务层:


BBED> print ktbbh
struct ktbbh, 72 bytes? ? ? ? ? ? ? ? ? ? ? @20? ? ?
? ub1 ktbbhtyp? ? ? ? ? ? ? ? ? ? ? ? ? ? @20? ? ? 0x01 (KDDBTDATA)? ==>块类型,01 Data,02 Index
? union ktbbhsid, 4 bytes? ? ? ? ? ? ? ? ? @24? ? ? ? ? ? ? ? ? ? ? ? ==>对象号(DBA_OBJECTS.OBJECT_ID)/段号
? ? ? ub4 ktbbhsg1? ? ? ? ? ? ? ? ? ? ? ? ? @24? ? ? 0x0001a2c4? ? ? ? ? ==>对象段号
? ? ? ub4 ktbbhod1? ? ? ? ? ? ? ? ? ? ? ? ? @24? ? ? 0x0001a2c4? ? ? ? ==>对象号
? struct ktbbhcsc, 8 bytes? ? ? ? ? ? ? ? @28? ? ?
? ? ? ub4 kscnbas? ? ? ? ? ? ? ? ? ? ? ? ? @28? ? ? 0x002fbaab? ? ? ? ? ==>SCN? Base
? ? ? ub2 kscnwrp? ? ? ? ? ? ? ? ? ? ? ? ? @32? ? ? 0x0000? ? ? ? ? ? ? ==>SCN? Wrap
? sb2 ktbbhict? ? ? ? ? ? ? ? ? ? ? ? ? ? @36? ? ? 2? ? ? ? ? ? ? ? ? ==>事务槽号(ITL number)
? ub1 ktbbhflg? ? ? ? ? ? ? ? ? ? ? ? ? ? @38? ? ? 0x32 (NONE)? ? ? ? ? ==>on the free list
? ub1 ktbbhfsl? ? ? ? ? ? ? ? ? ? ? ? ? ? @39? ? ? 0x00? ? ? ? ? ? ? ? ? ==>ITL TX free list slot
? ub4 ktbbhfnx? ? ? ? ? ? ? ? ? ? ? ? ? ? @40? ? ? 0x01c00080? ? ? ? ? ? ==>下一个空闲块的地址 (next free block dba)
? struct ktbbhitl[0], 24 bytes? ? ? ? ? ? @44? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ==>事务槽1
? ? ? struct ktbitxid, 8 bytes? ? ? ? ? ? ? @44? ? ? ? ? ? ? ? ? ? ? ? ? ? ==>xid? V$TRANSACTION.XID
? ? ? ? ub2 kxidusn? ? ? ? ? ? ? ? ? ? ? ? @44? ? ? 0x0005? ? ? ? ? ? ? ==>usn V$TRANSACTION.XIDUSN
? ? ? ? ub2 kxidslt? ? ? ? ? ? ? ? ? ? ? ? @46? ? ? 0x001f? ? ? ? ? ? ? ? ? ==>slot V$TRANSACTION.XIDSLOT
? ? ? ? ub4 kxidsqn? ? ? ? ? ? ? ? ? ? ? ? @48? ? ? 0x000009cb? ? ? ==>sqn? V$TRANSACTION.UBASQN
? ? ? struct ktbituba, 8 bytes? ? ? ? ? ? ? @52? ? ? ? ? ? ? ? ? ? ? ? ==>uba
? ? ? ? ub4 kubadba? ? ? ? ? ? ? ? ? ? ? ? @52? ? ? 0x00c002d1? ? ==>dba
? ? ? ? ub2 kubaseq? ? ? ? ? ? ? ? ? ? ? ? @56? ? ? 0x0375? ? ? ? ==>seq
? ? ? ? u