Oracle undo镜像数据探究(六)

2014-11-24 12:33:01 · 作者: · 浏览: 2
换得到:0000000001 0000011110011111110100 可以得到是file 1,block 124916.
可以断定该表存在于system,如下:
SQL> col file_name for a70
SQL> select a.table_name,a.tablespace_name,b.file_name from user_tables a,dba_data_files b where a.tablespace_name=b.tablespace_name and a.table_name='T';
TABLE_NAME TABLESPACE_NAME FILE_NAME
------------------------------ -------------------- ----------------------------------------------------------------------
T SYSTEM /opt/app/oracle/RHYS/system01.dbf
SQL>
然后,在跟随盖老师,看一下system01.dbf这个数据文件内容信息。转储信息如下:
Block header dump: 0x0041e7f4
Object id on Block Y
seg/obj: 0x11e0d csc: 0x00.9bb647 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x41e7f3 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000c.007.0000005a 0x020005d5.033a.27 ---- 4 fsc 0x0003.00000000
0x02 0x0014.001.00000044 0x02000628.037b.06 C--- 0 scn 0x0000.009b94a8
bdba: 0x0041e7f4
data_block_dump,data header at 0x7f6e9e263a5c
当我们修改数据的时候会对相应的数据加锁,更直接说该 锁存在于数据块中,并且存在itl(事务槽信息),可以现在数据块中itl的详细内容了
其中包括xid,uba,flag,lock status,scn
xid代表事务id,其中包括undo段号,槽位号,wrap,然后我们转换一下该xid,可以看到undo.segment.number 为12,占用的槽位是7,wrap#为:90
我们查看一下事务视图进行一下确认。
1* select xidusn,xidslot,xid,name,ubasqn,ubarec,ubafil,ubablk from v$transaction where xidusn=12
XIDUSN XIDSLOT XID NAME UBASQN UBAREC UBAFIL UBABLK
---------- ---------- ---------------- ---------- ---------- ---------- ---------- ----------
12 7 0C0007005A000000 826 39 8 1493
SQL>
然后摘录一下undo header事务表部分如下:
0x07 10 0x80 0x005a 0x0003 0x0000.00000000 0x020005d5 0x0000.000.00000000 0x00000001 0x00000000 0
然后我们在看一下 这个事务的信息;
eg:
SQL> select xid,start_scn,commit_scn,operation,table_name,row_id,undo_sql from flashback_transaction_query where xid='0C0007005A000000';
XID START_SCN COMMIT_SCN OPERATION TABLE_NAME ROW_ID UNDO_SQL
---------------- ---------- ---------- -------------------------------- -------------------------------------------------------------------------------- ------------------- --------------------------------------------------------------------------------
0C0007005A000000 10196237 UNKNOWN T
0C0007005A000000 10196237 UNKNOWN T
0C0007005A000000 10196237 UNKNOWN T
0C0007005A000000 10196237 UNKNOWN T
0C0007005A000000 10196237 BEGIN
SQL>
为什么undo_sql没有信息呢?我想是没有commit。稍后再看。
在数据块中的itl中存在一个uba,这正是该数据的前镜像信息。0x020005d5.033a.27转换一下,为20005d5(前镜像地址),033a为事务sequence号,
27为irb
如:
********************************************************************************
UNDO BLK:
xid: 0x000c.007.0000005a seq: 0x33a cnt: 0x27 irb: 0x2