ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle中多版本恢复(version query &transaction query)

Oracle中多版本恢复(version query &transaction query)

原创 Linux操作系统 作者:dawningwang 时间:2010-12-14 16:40:57 0 删除 编辑

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/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: Row movement的实验
请登录后发表评论 登录
全部评论

注册时间:2010-05-15

  • 博文量
    18
  • 访问量
    26443