oracle回滚到某一时间 oracle的事务与锁与回滚段block的一点研究
oracle的事务与锁与回滚段block的一点研究
SQL> create table a as select rownum a from t where rownum < ;
表已创建
SQL> alter table a initrans ;
表已更改
SQL> update a set a = where a in ( );
已更新 行
SQL> alter system dump datafile block ;
系统已更改
Start dump data blocks tsn: file#: minblk maxblk
buffer tsn: rdba: x c ( / )
scn: x e seq: x flg: x tail: x e
frmt: x cval: x type: x =trans data
Block header dump: x c
Object id on Block? Y
seg/obj: x be csc: x e itc: flg: O typ: DATA
fsl: fnx: x ver: x
Itl Xid Uba Flag Lck Scn/Fsc
x xid: x be uba: x c cd c fsc x
data_block_dump
我们看到该块上第一个 trans x 的一些标记信息
scn: x e seq: x scn号
x xid: x be uba: x c cd c (表示该事务更新 条记录) fsc x
下面是数据中的一些内容
block_row_dump:
tab row @ x fb
tl: fb: H FL lb: x ( x 表示 该编号事务所更新数据) cc:
col : [ ] c
tab row @ x fa
tl: fb: H FL lb: x cc:
col : [ ] c
tab row @ x fa
tl: fb: H FL lb: x cc:
col : [ ] c
tab row @ x f
tl: fb: H FL lb: x cc:
col : [ ] c
tab row @ x f e
tl: fb: H FL lb: x cc:
col : [ ] c
tab row @ x f
tl: fb: H FL lb: x cc:
col : [ ] c
tab row @ x f c
tl: fb: H FL lb: x cc:
col : [ ] c
tab row @ x f
tl: fb: H FL lb: x cc:
col : [ ] c
tab row @ x f a
tl: fb: H FL lb: x cc:
col : [ ] c
tab row @ x f
tl: fb: H FL lb: x cc:
然后我们继续在另外一个sqlplus中进行
SQL> update a set a = where a in ( );
已更新 行
SQL> alter system dump datafile block ;
系统已更改
SQL>
我们可以看到已经多了一个事务信息
Start dump data blocks tsn: file#: minblk maxblk
buffer tsn: rdba: x c ( / )
scn: x e seq: x flg: x tail: x e
frmt: x cval: x type: x =trans data
Block header dump: x c
Object id on Block? Y
seg/obj: x be csc: x e itc: flg: O typ: DATA
fsl: fnx: x ver: x
Itl Xid Uba Flag Lck Scn/Fsc
x xid: x be uba: x c cd c fsc x
x xid: x a c uba: x d f fsc x
data_block_dump
然后数据也发生了变化
block_row_dump:
tab row @ x f a
tl: fb: H FL lb: x cc:
col : [ ] c
tab row @ x c
tl: fb: H FL lb: x cc:
col : [ ]
tab row @ x f
tl: fb: H FL lb: x cc:
col : [ ] c
tab row @ x c b
tl: fb: H FL lb: x cc:
col : [ ]
tab row @ x f
tl: fb: H FL lb: x cc:
col : [ ] c
tab row @ x c
tl: fb: H FL lb: x cc:
col : [ ]
tab row @ x f
tl: fb: H FL lb: x cc:
col : [ ] c
tab row @ x c
tl: fb: H FL lb: x cc:
col : [ ]
tab row @ x f
tl: fb: H FL lb: x cc:
col : [ ] c
tab row @ x f
tl: fb: H FL lb: x cc:
col : [ ] c b
tab row @ x f
tl: fb: H FL lb: x cc:
数据中的每行中都有标记 事务信息(编号)
这个时候我们查询x$bh
SQL> select dataobj# from obj$ where name = A ;
DATAOBJ#
SQL> select count(*) from x$bh where obj = ;
COUNT(*)

我们看到这个时候 data buffer 中有 个block
然后再在新的sqlplus中更新
SQL> update a set a = where a = ;
已更新 行
SQL>
这个时候我们发现
SQL> select count(*) from x$bh where obj = ;
COUNT(*)
SQL>
这说明一个问题
当更新的时候新增加了一个块 这个块里面的数据 就是 回滚段中保存的数据
lishixinzhi/Article/program/Oracle/201311/18474