加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flashback query

发布时间:2020-12-15 17:43:09 所属栏目:百科 来源:网络整理
导读:??????????????????????????????????????????????????????????????????????????? ????FLASHBACK?QUERY 1??Flashback?query( 闪回查询 ) 原理 Oracle 根据 undo 信息,利用 undo 数据,类似一致性读取方法,可以把表置于一个删除前的时间点 ( 或 SCN) ,从而

???????????????????????????????????????????????????????????????????????????????FLASHBACK?QUERY

1??Flashback?query(闪回查询)原理

Oracle根据undo信息,利用undo数据,类似一致性读取方法,可以把表置于一个删除前的时间点(SCN),从而将数据找回。

--因此flashback?query能够查询的时间是受undo保留时间限制的,事物提交后undo数据保留时间受下面两个参数影响

1undo_retention:指定事物commitundo?将要保存的时间(),在ORACLE10g中默认的是900秒。

SQL>?alter?system?set?undo_retention=900;--调整undo_retention参数

2GUARANTEE?保证undo_retention参数所设定的时间有效,这个是10g的新功能。SQL>?ALTER?TABLESPACE?undotbs1?RETENTION?GUARANTEE;SQL>?ALTER?TABLESPACE?undotbs1?RETENTION?NOGUARANTEE;

--开启或关闭guarantee

3GUARANTEE参数影响

在没有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

3flashback?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转换成SCNtimestamp会被转换成)

3???查看SCN?TIMESTAMP?的对应关系
select?scn,to_char(time_dp,'yyyy-mm-dd?hh24:mi:ss')?from?sys.smon_scn_time?order?by?scn;

10g及之后的版本可以通过如下函数对timestampscn进行互相转换

通过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????scntimestamp对应关系

每隔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)不能Falshback5天以前的数据。

2)闪回查询无法恢复到表结构改变之前,因为闪回查询使用的是当前的数据字典。

3)受到undo_retention参数的影响,对于undo_retention之前的数据,Flashback不保证能Flashback成功。

4)对drop,truncate等不记录回滚的操作,不能恢复。

5)普通用户使用dbms_flashback包,必须通过管理员授权。命令如下:

SQL>grant?execute?on?dbms_flashback?to?scott;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读