Flashback version query 与flashback transaction query
10g的flashback可以闪回到某个时间点上的几个操作。比如:这1秒进行了删除,更新,和插入操作,可通过Flashback version query查询到,在这里称作对不同时间段不同版本进行查询,然后通过flashback transaction query对查询的事务进行撤销操作。这在9i时是没有的,9i只能精确到一个点查询,对这个点内多次的DML操作无法查询。本实验主要是对版本查询进行了实验,并没有真正精确到1秒内多次DML操作,但原理是一样的。
SQL> select * from emp1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
3 abc clerk 1 01-12月-99 1000 0 10
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
SQL> delete from emp1 where empno=7369;
已删除 1 行。
SQL> commit;
提交完成。
SQL> update emp1 set job='manager' where empno=7499;
已更新 1 行。
SQL> commit;
提交完成。
SQL> set linesize 500;
SQL>select versions_starttime,versions_endtime,versions_xid,versions_operation v,empno,ename,job
2 from emp1 versions between timestamp minvalue and maxvalue;
为方便学习,输出内容用下面的表给出:
|
VERSIONS_STARTTIME |
VERSIONS_ENDTIME |
VERSIONS_XID |
V |
EMPNOENAME JOB |
|
13-12月-10 03.21.58 下午 13-12月-10 03.21.16 下午 |
13-12月-10 03.21.16 下午 13-12月-10 03.21.58 下午
|
0A00100093020000 0500110021030000 |
U D |
7499ALLEN manager 7369 SMITH CLERK 3 abc clerk 7369 SMITH CLERK 7499 ALLEN SALESMAN |
其中,VERSIONS_XID在这里相当于关键字,通过它可以找到具体的操作以及还原的SQL.V为U,代表执行的是更新操作:7499 ALLEN 的JOB改为manager;V为D代表删除操作,代表删除7369 SMITH CLERK这条记录。这些可以方便的在表中看出。
SQL> select * from emp1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
3 abc clerk 1 01-12月-99 1000 0 10
7499 ALLEN manager 7698 20-2月 -81 1600 300 30
接着开始还原:
SQL> conn scott/m1234;
已连接。
SQL> select undo_sql from flashback_transaction_query where xid='0A00100093020000';
select undo_sql from flashback_transaction_query where xid='0A00100093020000'
*
第 1 行出现错误:
ORA-01031: 权限不足
SQL> conn sys/m1234 as sysdba;
已连接。
先通过xid= '0A00100093020000’还原更新:
SQL> select undo_sql from flashback_transaction_query where xid='0A00100093020000';
UNDO_SQL
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
update "SCOTT"."EMP1" set "JOB" = 'SALESMAN' where ROWID = 'AAANNGAAEAAAAIUAAC';
同样还原删除:
SQL> select undo_sql from flashback_transaction_query where xid='0500110021030000';
UNDO_SQL
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
insert into "SCOTT"."EMP1"("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> select * from scott.emp1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
3 abc clerk 1 01-12月-99 1000 0 10
7499 ALLEN manager 7698 20-2月 -81 1600 300 30
发现数据并没有更新,原来必须用以上SQL进行“还原”才好,直接复制上面的语句进行还原。这里的DML操作其实就是对开始进行的DML操作的逆操作。
SQL> update "SCOTT"."EMP1" set "JOB" = 'SALESMAN' where ROWID = 'AAANNGAAEAAAAIUAAC';
已更新 1 行。
SQL> insert into "SCOTT"."EMP1"("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 行。
SQL> select * from scott.emp1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
3 abc clerk 1 01-12月-99 1000 0 10
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
可以思考一下本次实验的还原与基于SCN或时间戳的还原本质上是不是一样?
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22528444/viewspace-681784/ ,如需转载,请注明出处,否则将追究法律责任。