oracle中关于flashback闪回的介绍 |
1、必须设定undo保留 工夫足够大以 可以重构需要闪回的数据 ALTER SYSTEM SET UNDO_RETENTION=<SECONDS>; 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 ------------------------ 1482649 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; |