闪回版本查询Flashback Version Query(2)

如果Undo_Retention保留的时间比较长,而恰恰数据库系统是一个事务操作频繁的系统,那么Oracle如果想要坚持undo_retention,就必须维持一个比较大可拓展的Undo Tablespace。这时候,如果恰恰Undo Tablespace的文件被设置为不可拓展的,那么Oracle也就不能保证undo_retention的理想值了。

参数retention grantee是设置在undo tablespace的参数设置。如果设置了这个参数,就表示Oracle一定要保证undo_retention的理想设置值,即使不能完成事务过程。

Flashback Query和Flashback Version Query,都是依赖Undo过期数据的来构建前镜像的操作。

与Flashback Query不同的是,Flashback Version Query引入了一些数据表“伪列”,可以提供对数据版本的操作和检索。下面通过一个SQL来查看。

SQL> select versions_xid xid, versions_startscn start_scn, versions_endscn endscn, versions_operation operation, empno from test versions between scn minvalue and maxvalue;

XID              START_SCN    ENDSCN OPERATION EMPNO

---------------- ---------- ---------- --------- -----

7369

7499

数据表test,显然没有诸多的列定义。从这个情况看,flashback query提供了一种数据行级别的版本查询操作。先来看一下引入的数据伪列含义,本截图是从Oracle 11g官方文档中提取出的截图。

ü  Versions_Startxxx表示数据行的最开始出现时间,可以使用SCN或者timestamp表示,如果这个字段为null,表示该数据从undo数据中没有找到对应的版本记录;

ü  Versions_Endxxx表示数据行的截止时间,如果为空,表示数据为当前记录或者已经经过delete操作;

ü  Versions_xid为事务对应的唯一标识,表示该数据行的变化是被哪个事务操作的;

ü  Versions_operation:操作内容;

3、操作实验

下面经过一系列实验,来确定Flashback Version Query使用。原始数据情况如下:

SQL> select * from test;

EMPNO ENAME            SAL

----- ---------- ---------

7369 SMITH        800.00

7499 ALLEN        1600.00

进行数据增加操作。

SQL> select versions_xid xid, versions_startscn start_scn, versions_endscn endscn, versions_operation operation, empno from test versions between scn minvalue and maxvalue;

XID              START_SCN    ENDSCN OPERATION EMPNO

---------------- ---------- ---------- --------- -----

7369

7499

0A001B00D3870100  24306083            I          1000

versions_operation表示“I”,为新增加的数据。start_scn为数据插入的SCN记录,xid为事务的标示。

SQL> update test set sal=200 where empno=7369;

1 row updated

SQL> commit;

Commit complete

SQL> select versions_xid xid, versions_startscn start_scn, versions_endscn endscn, versions_operation operation, empno, sal from test versions between scn minvalue and maxvalue;

XID              START_SCN    ENDSCN OPERATION EMPNO      SAL

---------------- ---------- ---------- --------- ----- ---------

0200110020160000  24306146            U          7369    200.00

24306146            7369    800.00

7499  1600.00

0A001B00D3870100  24306083            I          1000    200.00

U表示数据修改后的版本数据。如果删除数据,如下操作:

SQL> delete test where empno=7499;

1 row deleted

SQL> commit;

Commit complete

SQL> select versions_xid xid, versions_startscn start_scn, versions_endscn endscn, versions_operation operation, empno, rowid from test versions between scn minvalue and maxvalue;

XID              START_SCN    ENDSCN OPERATION EMPNO ROWID

---------------- ---------- ---------- --------- ----- ------------------

0A001100D3870100  24306188            D          7499 AAAtPCAABAAAeu5AAB

0200110020160000  24306146            U          7369 AAAtPCAABAAAeu5AAA

24306146            7369 AAAtPCAABAAAeu5AAA

24306188            7499 AAAtPCAABAAAeu5AAB

0A001B00D3870100  24306083            I          1000 AAAtPCAABAAAeu6AAA

通过上面的数据,是可以做到跟踪整个Undo_retention中数据变化的情况。下面监控一下事务标记信息。

SQL> delete test;

2 rows deleted

SQL> select xid from v$transaction;

XID

----------------

0A000300C3870100

SQL> commit;

Commit complete

SQL> select versions_xid xid, versions_startscn start_scn, versions_endscn endscn, versions_operation operation, empno, rowid from test versions between scn minvalue and maxvalue;

XID              START_SCN    ENDSCN OPERATION EMPNO ROWID

---------------- ---------- ---------- --------- ----- ------------------

0A000300C3870100  24306249            D          7369 AAAtPCAABAAAeu5AAA

0A001100D3870100  24306188            D          7499 AAAtPCAABAAAeu5AAB

0200110020160000  24306146  24306249 U          7369 AAAtPCAABAAAeu5AAA

24306146            7369 AAAtPCAABAAAeu5AAA

24306188            7499 AAAtPCAABAAAeu5AAB

0A000300C3870100  24306249            D          1000 AAAtPCAABAAAeu6AAA

0A001B00D3870100  24306083  24306249 I          1000 AAAtPCAABAAAeu6AAA

7 rows selected

从v$transaction中获取到的数据XID,可以在其中对应上。

4、结论

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ecc860aa2e1f35a58c2bf9c2553dc502.html