FLASHBACK QUERY
1 Flashback query(闪回查询)原理
Oracle根据undo信息,利用undo数据,类似一致性读取方法,可以把表置于一个删除前的时间点(或SCN),从而将数据找回。
--因此flashback query能够查询的时间是受undo保留时间限制的,事物提交后undo数据保留时间受下面两个参数影响
1)undo_retention:指定事物commit后undo 将要保存的时间(秒),在ORACLE10g中默认的是900秒。
SQL> alter system set undo_retention=900;--调整undo_retention参数
2)GUARANTEE :保证undo_retention参数所设定的时间有效,这个是10g的新功能。SQL> ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;SQL> ALTER TABLESPACE undotbs1 RETENTION NOGUARANTEE;
--开启或关闭guarantee
3)GUARANTEE参数影响
在没有guarantee的保证下,ORACLE并不能保证能够将undo信息存储900秒,如果undo表空间不足,那么ORACLE将忽略undo_retention的设置,直接覆盖掉以前的undo(覆盖掉最早的undo数据),这个时候有可能会产生ORA-01555错误。如果undo表空间空间足够,那么undo将会保存很长一段时间,直到undo表空间达到maxsize,这个时候才会覆盖undo信息,而且ORACLE会从最早的undo信息开始覆盖。
ORACLE推荐我们为undo 表空间中的datafile 设定MAXSIZE ,不要让它一直自动扩展,如果ORACLE获得了自动扩展的能力,那么旧的undo不会被覆盖,到后来undo表空间会越来越大,越来越大,直到将磁盘空间耗尽(直到扩大到数据文件的最大值,8K的数据块为32G)。
在有guarantee的保证下,ORACLE将会保证undo信息能够保存到undo_retention设定的值之后才被覆盖,如果这个时候同时执行了很多事物,将undo表空间耗完了,那么那个事物会失败,会报ORA-30036 错误,所以使用guarantee一定要慎用,如果非要使用guarantee,那么尽量将undo 表空间设大一点。
2 flashback query语法
1)获取数据删除前的一个时间点和scn,如下:
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') time,to_char(dbms_flashback.get_system_change_number) scn from dual;
TIMESCN
------------------- ----------------------------------------
2014-02-21 09:43:08 556374
--9i之前使用上面的语句
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') time,current_scn scn from v$database;
TIMESCN
------------------- ----------
2014-02-21 09:44:23556400
--9i之后使用如上方法
--
2)模拟误删数据
SQL> delete oltp_compress where object_id='29';
1 row deleted.
SQL> commit;
SQL> select * from oltp_compress where object_id='29';
no rows selected
3)flashback query查询被删除的数据
SQL> select count(1) from oltp_compress as of scn 556400 where object_id='29';
COUNT(1)
----------
1
--利用scn闪回
SQL> select count(1) from oltp_compress as of timestamp to_timestamp('2014-02-21 09:44:23','yyyy-mm-dd hh24:mi:ss') where object_id='29';
COUNT(1)
----------
1
--利用时间闪回(当通过TIMESTAMP 来查询历史数据时,数据库会吧TIMESTAMP转换成SCN,timestamp会被转换成)
3 查看SCN 和TIMESTAMP 的对应关系
select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss') from sys.smon_scn_time order by scn;
10g及之后的版本可以通过如下函数对timestamp和scn进行互相转换
通过scn_to_timestamp函数可以将SCN转换为时间戳
select scn_to_timestamp(8908390522972) scn from dual;
通过timestamp_to_scn可以将时间戳转换为SCN:
select timestamp_to_scn(scn_to_timestamp(8908390522972)) scn from dual;
4 scn和timestamp对应关系
每隔5 分钟,系统产生一次系统时间标记与scn 的匹配并存入SYS.SMON_SCN_TIME 表(由SMON 进程来进行Update操作),该表中记录了最近1440个系统时间标记与scn 的匹配记录,由于该表只维护了最近的1440 条记录,即最近5 天内的记录。
对系统时间标记与scn 的每5 分钟匹配一次做个说明,比如:
SCN:339988 对应 2011-01-25 17:00:00
SCN:339989 对应2011-01-25 17:05:00,
当查询2011-01-25 17:00:00 到2011-01-25 17:04:59 这段时间点内的SCN时,oracle 都会将其匹配为SCN:339988。
--如果SCN 与TIMESTAMP的映射不能写入到smon_scn_time表中,我们就不能进行SCN 与TIMESTAMP转换,就不能利用timestamp进行相关的操作
启用Flashback Query的语法可以接受一个时间标记或者一个SCN。如果使用SCN,那么闪回的时间点就是精确的。如果指定一个时间点,那么这个时间点将会映射为一个精度为3秒钟的SCN。
5 Falshback query查询的局限:
1)不能Falshback到5天以前的数据。
2)闪回查询无法恢复到表结构改变之前,因为闪回查询使用的是当前的数据字典。
3)受到undo_retention参数的影响,对于undo_retention之前的数据,Flashback不保证能Flashback成功。
4)对drop,truncate等不记录回滚的操作,不能恢复。
5)普通用户使用dbms_flashback包,必须通过管理员授权。命令如下:
SQL>grant execute on dbms_flashback to scott;