flashback query
???????????????????????????????????????????????????????????????????????????????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,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?的对应关系 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; ? 本文出自 “技术” 博客,请务必保留此出处http://www.voidcn.com/article/p-vvxvbgko-pk.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |