环境:
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行。