Flashback version Query
相对于Flashback Query 只能看到某一点的对象状态, Oracle 10g引入的Flashback Version Query可以看到过去某个时间段内,记录是如何发生变化的。 根据这个历史,DBA就可以快速的判断数据是在什么时点发生了错误,进而恢复到之前的状态。
先看一个伪列 ORA_ROWSCN. 所谓的伪列,就是假的,不存在的数据列,用户创建表时虽然没有指定,但是Oracle为了维护而添加的一些内部字段,这些字段可以像普通文件那样的使用。
最熟悉的伪列就是 ROWID, 它相当于一个指针,指向记录在磁盘上的位置。ORA_ROWSCN 是Oracle 10g 新增的,暂且把它看作是记录最后一次被修改时的SCN。 Flashback Version Query 就是通过这个伪列来跟踪出记录的变化历史。
SQL> create table test (id number(2)); 表已创建。 SQL> insert into test values(1); 已创建 1 行。 SQL> insert into test values(2); 已创建 1 行。 SQL> insert into test values(3); 已创建 1 行。 SQL> select ora_rowscn,id from test; ORA_ROWSCN ID ---------- ---------- 1161066 1 1161066 2 1161066 3
ORA_ROWSCN记录的是最后一次被修改时的SCN,注意是被提交的修改。如果没有提交,这个伪列不会发生变化。
ORA_ROWSCN 缺省是数据块级别的,也就是一个数据块内的所有记录都是一个ORA_ROWSCN,数据块内任意一条记录被修改,这个数据库块内的所有记录的ORA_ROWSCN都会同时改变。
SQL> INSERT INTO TEST VALUES(4); 已创建 1 行。 SQL> SELECT * FROM TEST; ID ---------- 1 2 3 4 SQL> SELECT ORA_ROWSCN FROM TEST; ORA_ROWSCN ---------- 1161066 1161066 1161066 1161066 SQL> COMMIT; 提交完成。 SQL> SELECT ORA_ROWSCN,ID FROM TEST; ORA_ROWSCN ID ---------- ---------- 1161378 1 1161378 2 1161378 3 1161378 4
如果没有提交,ORA_ROWSCN值不会变。
=================Flashback Transaction Query=============================
Flashback Transaction Query也是使用UNDO信息来实现。利用这个功能可以查看某个事务执行的所有变化,它需要访问flashback_transaction_query 视图,这个视图的XID列代表事务ID,利用这个ID可以区分特定事务发生的所有数据变化。
SQL> create table test (id number(2)); 表已创建。 SQL> insert into test values(1); 已创建 1 行。 SQL> insert into test values(2); 已创建 1 行。 -------------------------------------------------------------- SELECT TABLE_NAME,OPERATION FROM flashback_transaction_query where table_name='TEST'; TABLE_NAME OPERATION TEST UNKNOWN TEST UNKNOWN TEST UNKNOWN TEST UNKNOWN
operation为什么都是unknown?解决方法:http://www.cnblogs.com/rusking/p/4215272.html
==========================================================================
FLASHBACK TABLE
Flashback Table也是使用UNDO tablespace的内容来实现对数据的回退。该命令相对简单,输入:flashback table table_name to scn(to timestamp) 即可。注意SYS用户不支持闪回。
注意:如果想要对表进行flashback,必须允许表的row movement.
要查看某表是否启用row movement,可以到user_tables 中查询(或all_tables,dba_tables).
例如:
SQL> select row_movement from user_tables where table_name='EMP2'; ROW_MOVE -------- DISABLED
要启用或禁止某表row movement,可以通过下列语句:
--启用 SQL> ALTER TABLE table_name ENABLE ROW MOVEMENT; 表已更改。 --禁止 SQL> ALTER TABLE table_name DISABLE ROW MOVEMENT; 表已更改。 ------------------------------------------------------- SQL> ALTER TABLE EMP2 ENABLE ROW MOVEMENT; 表已更改。 SQL> SELECT ROW_MOVEMENT FROM USER_TABLES WHERE TABLE_NAME='EMP2'; ROW_MOVE -------- ENABLED ==================== SQL> ALTER SESSION SET NLS_DATE_FORMAT= 2 "YYYY-MM-DD HH24:MI:SS"; 会话已更改。 SQL> SELECT SYSDATE FROM DUAL; SYSDATE ------------------- 2014-10-16 23:01:14 SQL> SELECT CURRENT_SCN FROM V$DATABASE; CURRENT_SCN ----------- 1164486 SQL> DELETE FROM EMP2; 已删除14行。 SQL> FLASHBACK TABLE EMP2 TO SCN 1164486; 闪回完成。 SQL> SELECT * FROM EMP2; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- ------------------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20 7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30 7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30 ……
Flashback table 命令支持同时操作多个表,表名中间以逗号分隔即可,如果你执行一条flashback table命令时同时指定了多个表,要记住单个flashback table 是在同一个事务中,因此这些表的恢复操作要么都成功,要么都失败。
如:
flashback table a,b ,c to scn 1103864;
一些注意事项:
(1)基于undo 的表恢复,需要注意DDL 操作的影响。修改并提交过数据之后,对表做过DDL 操作,包括:drop/modify 列, move 表, drop 分区(如果有的话), truncate table/partition,这些操作会另undo 表空间中的撤销数据失效,对于执行过这些操作的表应用flashback query 会触发ORA-01466 错误。
另外一些表结构修改语句虽然并不会影响到undo 表空间中的撤销记录,但有可能因表结构修改导致undo 中重做记录无法应用的情况,比如对于增加了约束,而flashback query 查询出的undo 记录已经不符合新建的约束条件,这个时候直接恢复显然不可能成功,你要么暂时disable 约束,要么通过适当逻辑,对要恢复的数据进行处理之后,再执行恢复。
(2)基于undo 的表恢复,flashback table 实际上做的也是dml 操作(会在被操作的表上加dml 锁),因此还需要注意triggers 对其的影响,默认情况下,flashback table to scn/timestamp 在执行时会自动disable 掉与其操作表相差的triggers,如果你希望在此期间trigger 能够继续发挥做用,可以在flashback table 后附加 ENABLE TRIGGERS 子句。
=====================Flashback Data Archive略=============
《FROM:http://blog.csdn.net/tianlesoftware/article/details/4677378》