« 解出Oracle日志文件中的Redo SQL语句之二 »
Research » http://www.anysql.net/research/my_oracle_logminer_02.html 2007-05-22到目前为止, 形成Redo的SQL语句(先不考虑Row Chain, Row Migration及LOB等情况)是没有问题了. 留下的一个很艰难的任务是如何区分事务. 即解出来的那一些语句是属于一个事务(Transaction)的? 因为Redo SQL解出来已经按照先后顺序了, 只要找出属于同一个事务的Redo记录中的共同点就可以了.
先不考虑日志中的内容, 则会话的SID和SERIAL#值到是很可以用来作为这一样的一根线的, 可惜的是在日志中并没有记录这两个值, 因此这是不行的. 为了找出这一条线, 我们先来看一下标记一个事务为提交的Redo记录(Layer=5, OP=4) :
REDO RECORD - Thread:1 RBA: 0x005e30.00000006.0028 LEN: 0x0050 VLD: 0x01
SCN: 0x031f.05c00827 SUBSCN: 1 08/23/2006 19:08:22
CHANGE #1 TYP:0 CLS:43 AFN:394 DBA:0x6280b402 SCN:0x031f.05c00822 SEQ: 1 OP:5.4
ktucm redo: slt: 0x0018 sqn: 0x000daa6f srt: 0 sta: 9 flg: 0x2
ktucf redo: uba: 0x3b41c2dd.3bce.2d ext: 28 spc: 3560 fbi: 0
从这里面, 我第一眼看到, 以为可以用uba来作为这样的一根线, 但很快发现可能是错误的. 另一个可能的线是XID, 这里面可以找到XID的usn(slt: 0x0018)和wrap(sqn: 0x000daa6f), 但是我不确定有没有slot(ext: 28). 本就对这些东西半懂不懂的, 因为以写MyDUL时是不管回滚段的, 所以还是很不熟悉其格式的.
今天又修改了一下MyLOG程序, 程序的Extract命令输出例子如下:
RBA=0x005e30.00000002.0010, SCN=0x031f.05c00824, XID=0x0012.049.000dc2bb, UBA=0x62c263c4.498b.08
INSERT INTO OBJ_1044190 (COL1,COL2,COL3,COL4,COL5) VALUES (?,?,?,?,?);
RBA=0x005e30.00000002.0188, SCN=0x031f.05c00824, UBA=0x3b41c2dd.3bce.2d
UPDATE OBJ_28267 SET COL84 = ?,COL95 = ?,COL96 = ? WHERE COL84 = ? AND COL95 = ? AND COL96 = ?;
RBA=0x005e30.00000004.0128, SCN=0x031f.05c00824, UBA=0xb4000fe3.1a0a.0e
UPDATE OBJ_28267 SET COL3 = ?,COL20 = ?,COL23 = ?,COL34 = ?,COL35 = ?,COL36 = ?,COL39 = ?,COL40 = ?,COL41 = ?,COL45 = ?,COL51 = ?,COL82 = ?,COL83 = ?,COL84 = ?,COL95 = ?,COL96 = ? WHERE COL3 = ? AND COL20 = ? AND COL23 = ? AND COL34 = ? AND COL35 = ? AND COL36 = ? AND COL39 = ? AND COL40 = ? AND COL41 = ? AND COL45 = ? AND COL51 = ? AND COL82 = ? AND COL83 = ? AND COL84 = ? AND COL95 = ? AND COL96 = ?;
RBA=0x005e30.00000006.0028, UBA=0x3b41c2dd.3bce.2d, Commit Transaction
RBA=0x005e30.00000007.0044, UBA=0xb4000fe3.1a0a.0e, Commit Transaction
输入出中的UBA将会被替换掉, 依我的估计, usn和slot结合起来可以作为控制事务的一条线. 看来一个数据库最多只能有64K(16位)个回滚段, 每个回滚段只能有4096个事务槽(12位). 你可以下载这个文件看看MyLOG的进展.


其实在日志中记录了会话的SID和SERIAL#值的,甚至还有主机名和用户名等等信息,这些信息存储在5.19OP码对应的change中。
不是每个Redo Record中都有SID和SERIAL#的, 不行.
的确区分事务,应该使用xid,是否可考虑直接在输出的时候将同xid的操作放在一起,依此判断事务的完整性。
5.19的出现应该也是有一定的规律的吧,虽然它没有出现在每个redo 记录中。
请教一下:
一个事务提交的时候得到一个SCN,scn又是唯一的, 又记在每一个record里面。
为什么不能用SCN区分事务啊?
搞了2天发现这个问题太菜了啊,博主无视吧,能看看源码就好了。
再求助一下,record 有长度的,vector change有长度吗?log里是怎么区分的。
再就是那么多opcode, 要知道那些才能解析出来啊,没头绪。:(