oracle 中关于flashback闪回的介绍
1、必须设定undo保留时间足够大以能够重构需要闪回的数据
ALTER SYSTEM SET UNDORETENTION=;seconds值是undo数据保持的秒数。
Flashback view是由undo retention interval来限制的。
2、包DBMSFLASHBACK提供了需求接口
call dbmsflashback.enableattime(‘2010-10-19:11:00:00’);
call dbmsflashback.disable();
-------------------------------------
enableattime:会话级的enable flashback,映像时间被设定为最接近指定时间戳的scn
enableatsystemchangenumber:将数据库闪回到指定的scn号。
getsystemchangenumber:返回当前的scn。
disable:这个存储过程允许我们在整个会话内停止flashback并将你带回当前时间的数据状态。
----------
dbmsflashback.enable存储过程不可以在有活动事务的时候执行,并且,这个包不能用sys身份执行。
在使用DBMSFLASHBACK.ENABLEATTIME前,你必须设定你的NLSDATEFORMAT的精确程度,Oracle默认的是精确到天
3、timestamp与scn(系统改变号)的对应关系
事实上,Oracle在内部都是使用scn,即使你指定的是as of timestamp,oracle也会将其转换成scn,系统时间标记与scn之间存在一张表,即SYS下的SMONSCNTIME表。
每隔5分钟,系统产生一次系统时间标记与scn的匹配并存入sys.smonscntime表,该表中记录了最近1440个系统时间标记与scn的匹配记录,由于该表只维护了最近的1440条记录,因此如果使用as of timestamp的方式则只能flashback最近5天内的数据(假设系统是在持续不断运行并无中断或关机重启之类操作的话)。SYS.SMONSCNTIME最多拥有1440条记录。这个最大记录数是这样计算出来的,ORACLE平均每5分钟同步一次该表数据,最大保存最近5天的记录,因此就相当于12(每小时更新次数)*24*5=1440。
可以用sql验证一下:
Sql代码
select scn,tochar(timedp,“yyyy-mm-dd hh24:mi:ss“)from sys.smonscntime;
10g中提供了两个函数scntotimestamp()和timestamptoscn()用来执行时间戳和SCN的转换。
下面使用闪回进行演示一下:
1、登陆到数据库。
Sql代码
C:\>sqlplus tivan/tivan
SQL*Plus:Release10.2.0.1.0-Production on星期二10月1922:24:032010
Copyright(c)1982,2005,Oracle.All rights reserved.
连接到:
Oracle Database10g Enterprise Edition Release10.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 dbmsflashback.getsystemchangenumber from dual;
GETSYSTEMCHANGENUMBER
------------------------
1482649
SQL>select count(*)from t1as of scn1482600;
COUNT(*)
----------
8302
SCN=1482600时,t1表中的所有记录都还在。
5、利用闪回恢复数据。
查看验证一下:
Sql代码
SQL>insert into t1select*from t1as of scn1482600;
已创建8302行。
SQL>commit;
提交完成。
结果OK
或者还可以如下操作
Sql代码
SQL>flashback table t1to scn1482600;
SQL>commit;
Commit complete.
--对于drop table t1的操作flashback
SQL>drop table t1;
SQL>COMMIT;
SQL>flashback table t1to before drop;
SQL>commit;
对于怎么取的SCN可以使用timestamptoscn()函数,如:
Sql代码
select timestamptoscn(totimestamp(“2010-10-1921:00:00“,“YYYY-MM-DD HH:MI:SS“))from dual;