视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
oracle中关于flashback闪回的介绍
2020-11-09 13:40:54 责编:小采
文档


1、必须设定undo保留时间足够大以能够重构需要闪回的数据 ALTER SYSTEM SET UNDO_RETENTION=; seconds值是undo数据保持的秒数。 Flashback view是由undo retention interval来的。 2、包DBMS_FLASHBACK提供了需求接口 call dbms_flashback.enable_at_tim

  1、必须设定undo保留时间足够大以能够重构需要闪回的数据

  ALTER SYSTEM SET UNDO_RETENTION=; seconds值是undo数据保持的秒数。

  Flashback view是由undo retention interval来的。

  2、包DBMS_FLASHBACK提供了需求接口

  call dbms_flashback.enable_at_time(‘2010-10-19:11:00:00’);

  call dbms_flashback.disable();

  -------------------------------------

  enable_at_time:会话级的enable flashback,映像时间被设定为最接近指定时间戳的scn

  enable_at_system_change_number:将数据库闪回到指定的scn号。

  get_system_change_number:返回当前的scn。

  disable:这个存储过程允许我们在整个会话内停止flashback并将你带回当前时间的数据状态。

  ----------

  dbms_flashback.enable存储过程不可以在有活动事务的时候执行,并且,这个包不能用sys身份执行。

  在使用DBMS_FLASHBACK.ENABLE_AT_TIME前,你必须设定你的NLS_DATE_FORMAT的精确程度,Oracle默认的是精确到天

  3、timestamp 与scn(系统改变号) 的对应关系

  事实上,Oracle在内部都是使用scn,即使你指定的是as of timestamp,oracle也会将其转换成scn,系统时间标记与scn之间存在一张表,即SYS下的SMON_SCN_TIME表。

  每隔5分钟,系统产生一次系统时间标记与scn的匹配并存入sys.smon_scn_time表,该表中记录了最近1440个系统时间标记与scn的匹配记录,由于该表只维护了最近的1440条记录,因此如果使用as of timestamp的方式则只能flashback最近5天内的数据(假设系统是在持续不断运行并无中断或关机重启之类操作的话)。SYS.SMON_SCN_TIME最多拥有1440条记录。这个最大记录数是这样计算出来的,ORACLE平均每5分钟同步一次该表数据,最大保存最近5天的记录,因此就相当于12(每小时更新次数)*24*5=1440。

  可以用sql验证一下:

  Sql代码

  select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss') from sys.smon_scn_time;

  10g中提供了两个函数scn_to_timestamp() 和timestamp_to_scn() 用来执行时间戳和SCN的转换。

  下面使用闪回进行演示一下:

  1、登陆到数据库。

  Sql代码

  C:>sqlplus tivan/tivan

  SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 10月 19 22:24:03 2010

  Copyright (c) 1982, 2005, Oracle. All rights reserved.

  连接到:

  Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

  With the Partitioning, OLAP and Data Mining options

  2、查看表的记录。

  Sql代码

  SQL> select count(*) from t1

  2 ;

  COUNT(*)

  ----------

  8302

  3、删除所有的记录提交。

  Sql代码

  SQL> delete from t1

  2 ;

  已删除8302行。

  SQL> commit;

  提交完成。

  4、获得当前SCN

  如果能够确切知道删除之前SCN最好,如果不知道,,可以进行闪回查询尝试。

  Sql代码

  SQL> select dbms_flashback.get_system_change_number from dual;

  GET_SYSTEM_CHANGE_NUMBER

  ------------------------

  14829

  SQL> select count(*) from t1 as of scn 1482600;

  COUNT(*)

  ----------

  8302

  SCN=1482600时,t1表中的所有记录都还在。

  5、利用闪回恢复数据。

  查看验证一下:

  Sql代码

  SQL> insert into t1 select * from t1 as of scn 1482600;

  已创建8302行。

  SQL> commit;

  提交完成。

  结果OK

  或者还可以如下操作

  Sql代码

  SQL>flashback table t1 to scn 1482600;

  SQL> commit;

  Commit complete.

  --对于drop table t1 的操作flashback

  SQL> drop table t1;

  SQL>COMMIT;

  SQL> flashback table t1to before drop;

  SQL>commit;

  对于怎么取的SCN可以使用timestamp_to_scn() 函数,如:

  Sql代码

  select timestamp_to_scn(to_timestamp('2010-10-19 21:00:00','YYYY-MM-DD HH:MI:SS')) from dual;

下载本文
显示全文
专题