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 PM7369 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 SCOTTinsert 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>
|