Record 头后面就跟着,一个或多个 Change Vector,每个 Change 都代表一个数据库操作,比如增删改,事务开始,事务回滚,事务提交等等,它的格式如下:
其中:
Change Header 固定 24 字节 长度
Length Vector 表示后面有多少个 Change Record,每 2 字节 表示一个长度,计算长度时,需要进行 4 字节对齐
Change Record 就是具体的变化内容了,不同的操作有不同的格式。
使用 system dump 看下 Change Header 的信息:
CHANGE #1 TYP:0 CLS:1 AFN:4 DBA:0x01000085 OBJ:73194 SCN:0x0000.000e606a SEQ:1 OP:11.2 ENC:0 RBL:0其中主要字段的含义:
TYP: Change Type
CLS: Class 等于 X$BH.CLASS 暂时不知用途
DBA: Database Block Address,4字节长度,高10位表示相对文件号,低22位表示块号
OP: 操作码,区分操作类型,每个操作码都由两部分组成:Layer Code 和 Sub Code,比如 11.2
下图是一些常用的操作
3.3 Transactions 事务开始执行一个 DML 操作时,会创建一个 OP:5.2 的 Change,标识事务开始:
CHANGE #2 TYP:0 CLS:19 AFN:3 DBA:0x00c00090 OBJ:4294967295 SCN:0x0000.0010c5bb SEQ:3 OP:5.2 ENC:0 RBL:0 ktudh redo: slt: 0x0018 sqn: 0x0000033a flg: 0x0012 siz: 108 fbi: 0 uba: 0x00c007a0.009b.40 pxid: 0x0000.000.00000000当事务提交或者回滚时,会创建一个 OP:5.4 的 Change,标识事务结束:
CHANGE #4 TYP:0 CLS:19 AFN:3 DBA:0x00c00090 OBJ:4294967295 SCN:0x0000.0010c5e6 SEQ:1 OP:5.4 ENC:0 RBL:0 ktucm redo: slt: 0x0018 sqn: 0x0000033a srt: 0 sta: 9 flg: 0x2 ktucf redo: uba: 0x00c007a0.009b.41 ext: 2 spc: 640 fbi: 0一个完整的事务都有一个唯一标识,日志中的体现就是 XID :
xid: 0x0002.018.0000033aXID 长度是 8 字节,由三部分组成:
USN: Undo segment number (0x0002),目前不知如何获取此值
slt: Undo segment header transaction table slot (0x018),对应 ktudh/ktucm 中的 slt
sqn: 0x0000033a,对应 ktudh/ktucm 中的 sqn
在 ktudh/ktucm 中有一个 uba 字段,内容是 uba: 0x00c007a0.009b.41,它表示此 Change 在 undo block 中的地址,长度是 7字节,也由三部分组成:
undo block 的 DBA (0x00c007a0)
序号 (0x009b)
在 block 中的 Record 编号 (0x41)
下图是一个完整事务的示例:
执行了两个 update,其中 c1=1 的 c2 原先等于 100,更新成了 101;c1=2 的 c2 原先等于 200,更新成了 201;
4. 相关命令 4.1 日志归档和非归档查询数据库当前的日志模式:
SQL> archive log list; or SQL> select log_mode from v$database;查看在线日志:
SQL> select l.STATUS, lf.MEMBER from v$log l, v$logfile lf where l.GROUP# = lf.GROUP#;查看已归档日志:
SQL> select recid, stamp, thread#, sequence#, name from v$archived_log;查看默认归档路径
SQL> show parameter db_recovery_file_dest;日志开启归档模式:
SQL> shutdown immediate; SQL> startup mount SQL> alter database archivelog; SQL> alter database open; SQL> archive log list;日志关闭归档模式:
SQL> shutdown immediate; SQL> startup mount SQL> alter database noarchivelog; SQL> alter database open; 4.2 Redo Log Dump使用 ALTER SYSTEM 命令可以把二进制的 Redo Log 文件转储为任何文本编辑器可读的 ASCII 编码文件,有助于我们理解分析二进制结构,该命令的语法如下:
alter system dump logfile 'FileName' scn min MinimumSCN scn max MaximumSCN time min MinimumTime (s) time max MaximumTime (s) layer Layer opcode Opcode dba min FileNumber BlockNumber dba max FileNumber BlockNumber rba min LogFileSequenceNumber BlockNumber rba max LogFileSequenceNumber BlockNumber objno ObjectNumber xid UndoSegmentNumber UndoSlotNumber UndoSequenceNumber;使用 SCN :
SQL> alter system dump logfile '/u01/app/oradata/orcl/redo03.log' scn min 1099234 scn max 1099246;使用 RBA :
SQL> select cpodr_seq,cpodr_bno from x$kcccp where rownum=1; CPODR_SEQ CPODR_BNO ---------- ---------- 9 1514 SQL> DML (insert/update/delete) SQL> select cpodr_seq,cpodr_bno from x$kcccp where rownum=1; CPODR_SEQ CPODR_BNO ---------- ---------- 9 1518 SQL> alter system dump logfile '/u01/app/oradata/orcl/redo03.log' rba min 9 1514 rba max 9 1518;注意:每次 dump 后都需要退出此次会话,重新登录后再 dump,否则结果只会存储到一个文件内。
4.3 查询 dump 路径有两种办法查询 dump 路径。