分享

17.7 闪回事务查询(Flashback Transaction Query)

 wghbeyond 2011-08-09

17.7  闪回事务查询(Flashback Transaction Query)

事务是关系数据库系统常用到的一个概念,具体来说,事务就是访问数据库时一系列的逻辑相关动作。比如列车订票系统中选择目的地(或车次)、日期和时间、选择座位(上下铺)、出票(总票数减一张)及付费,这一系列的处理构成一个事务。Oracle 11g的闪回事务查询就是对过去某段时间内所完成的事务的查询和撤销。

17.7.1  闪回事务查询概念

闪回事务查询是一种诊断工具,用于帮助识别数据库发生的事务级变化,可以用于事务审计的数据分析。通过闪回事务分析,可以识别在一个特定的时间段内所发生的所有变化,也可以对数据库表进行事务级恢复。

闪回事务查询的基础仍然是依赖于撤销数据(Undodata),它也是利用初始化的数据库参数UNDO_RETENTION来确定已经提交的撤销数据在数据库中的保存时间。

另外,我们在前面介绍的Flashback Version Query可以实现审计一段时间内表的所有改变,但是这仅仅是发现在某个时间段内所进行过的操作,对于错误的事务还不能进行撤销处理。而Flashback Transaction Query可实现撤销处理,因为可以从FLASHBACK_TRANSACTION_QUERY中获得事务的历史操作并撤销语句(undo_sql)。也就是说,我们可以审计一个事务到底做了什么,也可以撤销一个已经提交的事务。

17.7.2  使用闪回事务查询

要使用Flashback Version Query功能,需要用到FLASHBACK_TRANSACTION_QUERY视图,下面是FLASHBACK_TRANSACTION_QUERY的列的解释:

列名称               类型            解释                  

XID                 RAW(8)         --事务标识           

START_SCN          NUMBER         --事务起始SCN        

START_TIMESTAMP   DATE           --事务起始时间       

COMMIT_SCN        NUMBER         --事务提交SCN        

COMMIT_TIMESTAMP  DATE           --事务提交时间戳     

LOGON_USER        VARCHAR2(30)   --登录的用户名       

UNDO_CHANGE#      NUMBER         --撤销改变号         

OPERATION         VARCHAR2(32)   --前滚操作           

TABLE_NAME        VARCHAR2(256)  --表名               

TABLE_OWNER       VARCHAR2(32)   --表拥有者            

ROW_ID            VARCHAR2(19)   --唯一的行标识       

UNDO_SQL          VARCHAR2(4000) --撤销的SQL语句      

下面我们继续使用Oracle系统SCOTT模式下的EMP表为例子,来演示闪回事务查询功能。

示例:闪回事务的详细实例。

1.查看某个时间段内的操作发生的情况:

SQL> select empno ,ename, sal , versions_operation , versions_xid, versions_starttime from scott.my_emp  versions between timestamp minvalue and maxvalue order by empno,versions_starttime;

EMPNO  ENAME     SAL   Version_operation ERSIONS_XID      VERSIONS_STARTTIME   

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

7369   SMITH     800   D                 08001F00B2040000 21-OCT-07 02.21.12 PM

7369   SMITH     800                                                           

7499   ALLEN    1600                                                            

7521   WARD     1250                                                           

7566   JONES    2975                                                           

7654   MARTIN   1250                                                            

7698   BLAKE    2850                                                           

7782   CLARK    2450                                                           

7788   SCOTT    3000                                                           

7839   KING     5000                                                           

7844   TURNER   1500                                                           

7876   ADAMS    1100                                                           

7900   JAMES     950                                                           

7902   FORD     3000                                                           

7934   MILLER   1300                                                           

15 rows selected.                                                                   

2.找出XID为08001F00B2040000的语句的撤销操作(UNDO_SQL)(SCOTT默认下不能查询flashback_transaction_query表):

SQL> conn /as sysdba;

Connected.

SQL> col table_name for a18;

SQL> col table_owner for a10;

SQL> col logon_user for a12;

SQL> set long 1000;

SQL> select logon_user,table_name,table_owner,undo_sql from flashback_transaction_query where table_owner='SCOTT' and xid='08001F00B2040000';

LOGON_USER   TABLE_NAME         TABLE_OWNE

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

UNDO_SQL

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

SYS          MY_EMP             SCOTT

insert into "SCOTT"."MY_EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7369','SMITH','CLERK','7902',TO_DATE('17-12月-80', 'DD-MON-RR'),'800',NULL,'20');

SQL>


3.运行上面找出的SQL语句,即可将以前删除的数据恢复回来:

SQL> conn scott/tiger;

Connected.

SQL>insert into "SCOTT"."MY_EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7369','SMITH','CLERK','7902',TO_DATE('17-12月-80', 'DD-MON-RR'),'800',NULL,'20');

1 row created.


SQL> commit;


Commit complete.


SQL>

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多