sys@ORCL> SELECT * FROM v$rollname a WHERE a.usn=9;
USN NAME
---------- ------------------------------
9 _SYSSMU9$
sys@ORCL> alter system dump undo header '_SYSSMU9$';
System altered.
sys@ORCL> select spid from v$process where addr in (select paddr from v$session where sid in (select sid
2 from v$mystat where rownum=1));
SPID
------------
10086
scott@ORCL> update emp set sal=4000 where empno=7788;
1 row updated.
scott@ORCL> update emp set sal=4000 where empno=7782;
1 row updated.
scott@ORCL> update emp set sal=40000 where empno=7698;
1 row updated.
会话2:sys用户
把回滚块1557dump出来
sys@ORCL> select spid from v$process where addr in (select paddr from v$session where sid in (select sid from v$mystat where rownum=1));
SPID
------------
11146
sys@ORCL> alter system dump datafile 2 block 1557;
System altered.
*-----------------------------
* Rec #0x14 slt: 0x1a objn: 51148(0x0000c7cc) objd: 51148 tblspc: 4(0x00000004)
* Layer: 11 (Row) opc: 1 rci 0x13
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
KDO undo record:
KTB Redo
op: 0x02 ver: 0x01
op: C uba: 0x00800615.0105.13
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x01000020 hdba: 0x0100001b
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 5(0x5) flag: 0x2c lock: 0 ckix: 191
ncol: 8 nnew: 1 size: 1
col 5: [ 3] c2 1d 33
c2 1d 33转换为10进制就是2850.这是最后被更新的记录的旧值。也就是update emp set sal=4000 where empno=7698。
注意,这里有几个参数需要关注:
1)参数rci 0x13,该参数代表的就是undo chain(同一个事务中的多次修改,根据chain链接关联),此处的rci 0x13指向第二次修改update emp set sal=4000 where empno=7782.此时,如果有其他进程查询scott.emp表,则oracle需要构造一致性读来把数据展现给用户。
scott@ORCL> select to_number('01000020','xxxxxxxx') from dual;
TO_NUMBER('01000020','XXXXXXXX')
--------------------------------
16777248
scott@ORCL> select dbms_utility.data_block_address_file(16777248) from dual;
DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(16777248)
----------------------------------------------
4
scott@ORCL> select dbms_utility.data_block_address_block(16777248) from dual;
DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(16777248)
-----------------------------------------------
32
再将4号文件的第32个块dump出来:
sys@ORCL> select spid from v$process where addr in (select paddr from v$session
2 where sid in (select sid from v$mystat where rownum=1));
SPID
------------
13929
sys@ORCL> alter system dump datafile 4 block 32;
System altered.