flashback query 是oracle 9i 之后推出来的一个特性,借助它,我们有可能很方便的恢复误操作(dml 操作)之前的数据。
简单的说,flashback query 允许你查看过去某个时间点的数据,比如说,你可以查看5分钟,或一个小时之前的某个表的数据。这样的话,通过过去数据和现在实际数据的对比,我们就可以很容易的得到误操作所影响到的数据。
flashback 闪回是要用到 undo 的,因此,关于undo_retention 参数的设置和 flashback query 特性是有关系的。
undo_retention 基本上(10g 有特性保证绝对保证) 保证了受dml 影响的数据前影像在undo segment 中至少保留多长时间,那么这个时间保留的越长,允许你flashback query 至过去时刻的范围就越大。undo_retention 要适当设置。
不多说了,看例子。
总的来说,有两个2,第一个2 是说, flashback query 的特性可以使用scn 或者timestamp 来 指定要闪回的时间点;第二个2 是说,flashback query 有两种形式的用法,一种是 select 后面的 as of , 一种是 通过 dbms_flashback 包的 enable_at_time 或者 enable _at_system_change_number 来指定过去的时间点。
SQL> desc test
名称 是否为空? 类型
----------------------------------------- -------- -------------------------
ID NUMBER
SQL> set time on
23:07:24 SQL> select * from test;
ID
----------
1
2
3
4
5
6
7
8
9
10
11
已选择11行。
23:07:29 SQL> delete from test;
已删除11行。
23:07:53 SQL> commit;
提交完成。
23:08:00 SQL> select * from test;
未选定行
23:08:03 SQL> select * from test as of timestamp (sysdate - 1/1440); -- 查看一分钟之前的数据
ID
----------
1
2
3
4
5
6
7
8
9
10
11
已选择11行。
23:08:28 SQL> select dbms_flashback.get_system_change_number from dual; --获得当前的scn 号
GET_SYSTEM_CHANGE_NUMBER
------------------------
699693
23:08:52 SQL> select * from test as of scn 699690;
未选定行
23:09:05 SQL> select * from test as of scn 699666;
未选定行
23:09:14 SQL> select * from test as of scn 699600;
ID
----------
1
2
3
4
5
6
7
8
9
10
11
已选择11行。
23:09:23 SQL>
-- 可以从如下的语句中大致判断下 scn 是在什么时间范围
SQL> select sequence#,first_change#,next_change#,to_char(first_time,'YYYYMMDD HH24:MI:SS') FROM v$log_history;
SEQUENCE# FIRST_CHANGE# NEXT_CHANGE# TO_CHAR(FIRST_TIME,'YYYYMMDDHH
---------- ------------- ------------ ------------------------------
1 534907 565899 20080411 23:19:27
2 565899 573451 20080411 23:23:10
3 573451 612334 20080411 23:28:57
4 612334 639840 20040101 00:07:31
5 639840 661519 20080413 10:00:18
6 661519 688384 20080413 21:44:24
6 rows selected
SQL>
-- 下面是 dbms_flashback 包的方式
23:16:52 SQL> connect dbmgr
输入口令:
已连接。
23:17:00 SQL> exec dbms_flashback.enable_at_time(sysdate-20/1440);
PL/SQL 过程已成功完成。
23:17:21 SQL> select * from sys.test;
ID
----------
1
2
3
4
5
6
7
8
9
10
已选择10行。
23:17:32 SQL> exec dbms_flashback.disable;
PL/SQL 过程已成功完成。
23:17:43 SQL> select * from sys.test;
未选定行
本文出处:http://blog.youkuaiyun.com/kongkongye/archive/2008/04/15/2292341.aspx
从ORACLE 9I开始,ORACLE 引入FLASHBACK QUERY特性,10g对这个性能加以增强
1. Flashback database
2. Flashback drop
3. Flashback versions QUERY
4. Flashback Transaction QUERY
5. Flashback Table
不过除了 Flashback database 是基于Flashback log, 其他都是基于UNDO DATA.
Flashback drop 提供虚拟回收站,允许删除对象重建。
Flashback versions QUERY, Flashback transation QUERY 用语识别或确定要恢复到当前状态的数据行。
Flashback Table 用于恢复单独的表,比如错误的更新了表。
Flashback database 能使整个数据库闪会至特定的时间点,闪会数据库不能对删除数据文件,缩小数据文件恢复,闪回数据库比传统恢复速度更快。
1. flashback 不能解决媒介故障。
2. 数据文件截断。
3. 不能删除表空间并并resetlogs恢复
4. 不能超出回的界限.(SCN时间点)
Flashback area 通过数据库初始文件建立,文件保留长度由RMAN的保留策略决定.
RMAN CONFIGURE RETENTION POLICY 决定.
Alter system set db_recovery_file_dest_size=10M scope=Both;
Alter system set db_recovery_file_dest=’C:oraceflash_recovery_Areaora_t’;
Alter system set db_recovery_file_dest_size=’25M’;--改变flashback area大小.
Alter system set db_recovery_file_dest=’’ 停用flashback area
配置闪回数据库,数据库必须为归档模式:
connect / as sysdba ;
startup mount ;
alter database set db_flashback_retention_target=4320;(分钟为单位,也就是3天)
alter database flashback on;
alter database open;
在RMAN中用flashback database 就很简单:
select oldest_flashback_scn,oldest_flashback_time from v$flashback_database_log可以得到时间或SCN,然后数据库重启动到MOUNT状态:
flashback database to time/scn (to sequence thread number)
alter database open resetlogs;