Oracle redo解析之-2、BBED & DUMP工具使用

門牙發表於2019-04-07

BBED使用

BBED可以將二進位制塊列印出來,也可以自己寫demo將二進位制讀出來。
複製程式碼

安裝

  11G中缺少bbed包,需要上傳sbbdpt.o, ssbbded.o, bbedus.msb ,將這三個檔案放在以下目錄中:

$ ORACLE_HOME/rdbms/lib/ssbbded.o
$ ORACLE_HOME/rdbms/lib/sbbdpt.o
$ ORACLE_HOME/rdbms/mesg/bbedus.msb
複製程式碼

  後執行如下命令:

$ cd $ORACLE_HOME/rdbms/lib
$ make -f $ORACLE_HOME/rdbms/lib/ins_rdbms.mk BBED=$ORACLE_HOME/bin/bbed $ORACLE_HOME/bin/bbed
複製程式碼

使用

1.新建dbfiles.txt(檔名隨意), 填入檔案資訊:

1       /home/oracle/app/oradata/orcl/redo03.log        52429312
[檔案編號]	[檔案路徑]	[檔案大小]
複製程式碼

2.新建引數檔案para.txt(檔名隨意),內容如下:

blocksize=512
listfile=dbfiles.txt
mode=edit

複製程式碼

3.我一般將dbfiles.txt和para.txt放在$ORACLE_BASE/bbed(路徑隨意)下, 啟動bbed:

$ cd $ORACLE_BASE/bbed
$ bbed parfile=para.txt --> [密碼是:blockedit]
複製程式碼

4.bbed一些基本操作

BBED> info
 File#  Name                                                        Size(blks)
 -----  ----                                                        ----------
     1  /home/oracle/app/oradata/orcl/system01.dbf                       89600
     2  /home/oracle/app/oradata/orcl/sysaux01.dbf                       76800
複製程式碼
BBED> show all
	FILE#          	1
	BLOCK#         	1
	OFFSET         	0
	DBA            	0x00400001 (4194305 1,1)
	FILENAME       	/home/oracle/app/oradata/orcl/system01.dbf
	BIFILE         	bifile.bbd
	LISTFILE       	dbfiles.txt
	BLOCKSIZE      	8192
	MODE           	Edit
	EDIT           	Unrecoverable
	IBASE          	Dec
	OBASE          	Dec
	WIDTH          	80
	COUNT          	512
	LOGFILE        	log.bbd
	SPOOL          	No
複製程式碼
如果要檢視5號檔案的2號塊,需要通過set命令來設定檔案號和塊號

BBED> set file 5
	FILE#          	5

BBED> set block 2
	BLOCK#         	2

BBED> dump
 File: /home/oracle/app/oradata/orcl/redo01.log (5)
 Block: 2                Offsets:    0 to  511           Dba:0x01400002
------------------------------------------------------------------------
 01220000 02000000 34000000 108000c8 a8010000 05180000 732b0b00 01000206 
 c50f3b25 545402c1 00000100 89010000 89010000 0875030f 732b0b00 0000ac9c 
 007d0002 06c50f3b 7b2b0b00 00000000 1689f337 05021700 0300ffff b000c000 
 702b0b00 00000000 0200ffff 04002000 01000000 8f020000 7203c000 91000100 
 0a048800 ff7f0000 00000000 00000000 05011800 0300ffff 7203c000 702b0b00 
 00008672 0101ffff 0c001400 4c002000 0c000100 88000000 0a000000 04000100 
 8f020000 910001ad dd030100 dd030100 01000000 00000000 0a150100 080c0100 
 00000000 b700c000 90000300 97250b00 0000bdad 99250b00 0000bdad ff7f0000 
 ffffffff ffff0000 7303c000 00000000 00000000 040d8672 00000000 04000300 
 90020000 7a01c000 8d000100 00c00000 a4250b00 07198672 84b08000 1aaf8000 
 01ac9c00 0a060100 02000100 84b08000 702b0b00 000067bf 0100dd03 06001800 
 02000000 010d94bf 097f0000 04000100 8f020000 7203c000 91000100 01051506 
 05140000 00000000 00000000 00000000 00000000 00060000 10000400 00000200 
 04000400 00000000 2d00c400 04000080 0001200b 00000000 a4200000 01020000 
 732b0b00 010003c2 15060778 75030f0f 05021700 0300ffff b000c000 732b0b00 
 0000c000 0100ffff 04002000 01008abf 00000000 7303c000 91000100 0a00d41f 

 <32 bytes per line>

複製程式碼

自己寫的列印程式

  demo上傳到https://github.com/zhoubihui/redo_log_calculate_analysis/tree/master/demo/tools下,編譯後使用時需要傳入檔名,起始塊號,dump塊數。例:

$ clang++ dump.cc -o dump
$ ./dump /Users/zhoubihui/redo/redo01.log 2 4
表示dump 2,3,4,5塊。
複製程式碼

轉儲日誌檔案工具-dump

使用

  個人使用習慣如下:
1.執行DML操作之前先查詢當前日誌檔案的序列號和塊號

SQL> select cpodr_seq,cpodr_bno from x$kcccp where rownum=1;

 CPODR_SEQ  CPODR_BNO
---------- ----------
	 7	  249

--------------------執行DML--------------------------------------

SQL> select cpodr_seq,cpodr_bno from x$kcccp where rownum=1;             

 CPODR_SEQ  CPODR_BNO
---------- ----------
	 7	  743

SQL> oradebug setmypid;
Statement processed.

SQL> alter system dump logfile '/home/oracle/app/oradata/orcl/redo01.log' rba min 7 249 rba max 7 743;

System altered.

SQL> oradebug tracefile_name;
/home/oracle/app/diag/rdbms/orcl/orcl/trace/orcl_ora_3434.trc
複製程式碼
1.需要dump的檔案,可以聯合v$log和v$logfile查詢檔案路徑。
2.dump的方式有很多種,這種是我最常用的同時也是我覺得比較方便的。
3.每次dump需要退出連線,因為生成的檔名是根據會話ID生成的,不重新登入的話,所有dump的資料都在同一個檔案裡,不夠直觀。
4.如果只執行一個insert操作,但是redo寫了幾百個塊,例如上述例子中,這個時候說明oracle自身在對資料庫做一些操作,如果新手在這幾百個塊中找一條insert記錄的話,是比較難找的。所以可以通過多執行幾次上述操作,只要寫的redo塊數比較少,dump出來的資料也是比較容易找到自己想要的那條記錄。
複製程式碼

例子

REDO RECORD - Thread:1 RBA: 0x000007.000000f9.0010 LEN: 0x0224 VLD: 0x0d
SCN: 0x0000.000fbebd SUBSCN:  1 04/04/2019 18:22:15
CHANGE #1 TYP:2 CLS:1 AFN:1 DBA:0x004007d9 OBJ:287 SCN:0x0000.000fbea6 SEQ:2 OP:11.5 ENC:0 RBL:0
KTB Redo
op: 0x11  ver: 0x01
compat bit: 4 (post-11) padding: 1
op: F  xid:  0x0009.001.00000330    uba: 0x00c029d9.0086.24
Block cleanout record, scn:  0x0000.000fbebc ver: 0x01 opt: 0x02, entries follow...
  itli: 2  flg: 2  scn: 0x0000.000fbea6
KDO Op code: URP row dependencies Disabled
  xtype: XA flags: 0x00000000  bdba: 0x004007d9  hdba: 0x004007d8
itli: 1  ispac: 0  maxfr: 4863
tabn: 0 slot: 2(0x2) flag: 0x2c lock: 1 ckix: 11
ncol: 19 nnew: 1 size: 7
col  5: [ 7]  78 77 04 04 13 17 10
CHANGE #2 TYP:0 CLS:33 AFN:3 DBA:0x00c00100 OBJ:4294967295 SCN:0x0000.000fbe8b SEQ:2 OP:5.2 ENC:0 RBL:0
ktudh redo: slt: 0x0001 sqn: 0x00000330 flg: 0x0012 siz: 156 fbi: 0
            uba: 0x00c029d9.0086.24    pxid:  0x0000.000.00000000
CHANGE #3 TYP:0 CLS:33 AFN:3 DBA:0x00c00100 OBJ:4294967295 SCN:0x0000.000fbebd SEQ:1 OP:5.4 ENC:0 RBL:0
ktucm redo: slt: 0x0001 sqn: 0x00000330 srt: 0 sta: 9 flg: 0x2 ktucf redo: uba: 0x00c029d9.0086.24 ext: 2 spc: 3270 fbi: 0
CHANGE #4 TYP:0 CLS:34 AFN:3 DBA:0x00c029d9 OBJ:4294967295 SCN:0x0000.000fbe8b SEQ:3 OP:5.1 ENC:0 RBL:0
ktudb redo: siz: 156 spc: 3428 flg: 0x0012 seq: 0x0086 rec: 0x24
            xid:  0x0009.001.00000330
ktubl redo: slt: 1 rci: 0 opc: 11.1 [objn: 287 objd: 287 tsn: 0]
Undo type:  Regular undo        Begin trans    Last buffer split:  No
Temp Object:  No
Tablespace Undo:  No
             0x00000000  prev ctl uba: 0x00c029d9.0086.21
prev ctl max cmt scn:  0x0000.000f6a42  prev tx cmt scn:  0x0000.000f6a5a
txn start scn:  0x0000.00000000  logon user: 0  prev brb: 12593621  prev bcl: 0 BuExt idx: 0 flg2: 0
KDO undo record:
KTB Redo
op: 0x04  ver: 0x01
compat bit: 4 (post-11) padding: 1
op: L  itl: xid:  0x0001.000.0000026a uba: 0x00c02332.0075.04
                      flg: C---    lkc:  0     scn: 0x0000.000fbe9a
KDO Op code: URP row dependencies Disabled
  xtype: XA flags: 0x00000000  bdba: 0x004007d9  hdba: 0x004007d8
itli: 1  ispac: 0  maxfr: 4863
tabn: 0 slot: 2(0x2) flag: 0x2c lock: 0 ckix: 11
ncol: 19 nnew: 1 size: -7
col  5: *NULL*
複製程式碼

相關文章