flashback query

                                                                               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,'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

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对应关系

每隔分钟,系统产生一次系统时间标记与scn 的匹配并存入SYS.SMON_SCN_TIME (SMON 进程来进行Update操作),该表中记录了最近1440个系统时间标记与scn 的匹配记录,由于该表只维护了最近的1440 条记录,即最近天内的记录。

对系统时间标记与scn 的每分钟匹配一次做个说明,比如:

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;

 

你可能感兴趣的:(Timestamp,flashback,闪回查询)