环境:
23:47:03 hr@ORCL (^ω^) select * from v$version where rownum=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
1 原理介绍
flashback query只能“穿越”到过去的某个时间点上的数据库版本,但是在当前时间和过去的某个时间点上,一个表中的数据可能已经被变更多次,单一版本可能无法满足恢复的需求。通过flashback version query能够查看指定时间段内undo表空间中被提交的记录的不同版本。
flashback version query的伪列说明
versions_startscn versions_starttime | 记录了操作时的SCN或时间,如果为空,表示在查询范围外创建的 |
versions_endscn versions_endtime | 记录了失效时的SCN或时间,配合version_operation列查看,如果为空,或者被删除、或者 该记录当前时间在当前表不存在 |
versions_operation | I:insert D:delete U:update |
versions_operation | 事务ID |
2 实验
23:38:26 hr@ORCL (^ω^) select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
3930808
23:38:48 hr@ORCL (^ω^) update t1 set empno=122 where ename='Water';
已更新 1 行。
23:39:42 hr@ORCL (^ω^) commit;
提交完成。
23:40:06 hr@ORCL (^ω^) delete t1 where rownum<5;
已删除4行。
23:40:25 hr@ORCL (^ω^) commit;
提交完成。
23:40:29 hr@ORCL (^ω^) insert into t1 values(155,'qao');
已创建 1 行。
23:40:56 hr@ORCL (^ω^) insert into t1 values(156,'qinqin');
已创建 1 行。
23:41:19 hr@ORCL (^ω^) commit;
提交完成。
23:41:22 hr@ORCL (^ω^) select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
3931066
23:46:34 hr@ORCL (^ω^) select empno,ename,versions_startscn,versions_endscn,versions_operation,versions_xid
23:47:00 2 from t1 versions between scn 3930808 and 3931066;
EMPNO ENAME VERSIONS_STARTSCN VERSIONS_ENDSCN VE VERSIONS_XID
---------- ---------- ----------------- --------------- -- ----------------
155 qao 3930985 I 04002000D4030000
111 Linshuibin 3930897 D 06002F00B6040000
122 Water 3930897 D 06002F00B6040000
122 Water 3930883 3930897 U 02001100BD040000
111 Water 3930883
111 Linshuibin 3930897
7566 JONES 3930897 D 06002F00B6040000
7521 WARD 3930897 D 06002F00B6040000
7521 WARD 3930897
7566 JONES 3930897
7788 SCOTT
7844 TURNER
7900 JAMES
7902 FORD
156 qinqin 3930985 I 04002000D4030000
110 Think
已选择16行。