Oracle 10g的日志文件格式和8i/9i有很大的不同, 这是早就知道的. 一直没有对10g版本的日志格式没有深入研究, 即然最近更深入地研究了日志格式, 不如将10g的也解决了吧. 昨晚大约花了2个多小时, 终于可以将10g日志文件中的Log Record一个一个地分开来了, 9i中区分Change的那部份代码不能直接用在10g上, 还是花点时间研究一下, 估计也就是保留字节变多了或变少了, 应当不难.

    下面是用Oracle 10g的DUMP LOGFILE命令生成Trace文件, 然后用grep "RBA:"命令整出来的最前五行和最后五行:

REDO RECORD - Thread:1 RBA: 0x000059.00000002.0010 LEN: 0x0070 VLD: 0x05
REDO RECORD - Thread:1 RBA: 0x000059.00000003.0010 LEN: 0x0290 VLD: 0x05
REDO RECORD - Thread:1 RBA: 0x000059.00000004.00b0 LEN: 0x005c VLD: 0x01
REDO RECORD - Thread:1 RBA: 0x000059.00000005.0010 LEN: 0x0290 VLD: 0x05
REDO RECORD - Thread:1 RBA: 0x000059.00000006.00b0 LEN: 0x005c VLD: 0x01
......
REDO RECORD - Thread:1 RBA: 0x000059.00001990.0014 LEN: 0x0118 VLD: 0x01
REDO RECORD - Thread:1 RBA: 0x000059.00001990.012c LEN: 0x05a4 VLD: 0x01
REDO RECORD - Thread:1 RBA: 0x000059.00001993.0100 LEN: 0x00d8 VLD: 0x01
REDO RECORD - Thread:1 RBA: 0x000059.00001993.01d8 LEN: 0x00d8 VLD: 0x01
REDO RECORD - Thread:1 RBA: 0x000059.00001994.00c0 LEN: 0x0060 VLD: 0x01

    下面是用我自已的工具, 输出的最前五行和最后五行, 我也数过总共的行数, 两者是相等的.

RBA=0x000059.00000002.0010, LEN=0x0070 VLD=0x05
RBA=0x000059.00000003.0010, LEN=0x0290 VLD=0x05
RBA=0x000059.00000004.00b0, LEN=0x005c VLD=0x01
RBA=0x000059.00000005.0010, LEN=0x0290 VLD=0x05
RBA=0x000059.00000006.00b0, LEN=0x005c VLD=0x01
......
RBA=0x000059.00001990.0014, LEN=0x0118 VLD=0x01
RBA=0x000059.00001990.012c, LEN=0x05a4 VLD=0x01
RBA=0x000059.00001993.0100, LEN=0x00d8 VLD=0x01
RBA=0x000059.00001993.01d8, LEN=0x00d8 VLD=0x01
RBA=0x000059.00001994.00c0, LEN=0x0060 VLD=0x01

    一个Log Record代表一个数据库的原子操作, 因此这一步是很关键的一大步.