我们通过之前的学习就会认识到,闪回技术有闪回表、闪回删除、闪回查询、闪回事务查询、闪回事务、闪回数据库以及闪回数据归档。其中,闪回查询、闪回事务查询用来“观察”过去;闪回数据归档并不是一个独立的功能,其功能是扩展闪回查询的时间窗口;闪回表、闪回删表能够以表为单位“回到”过去;闪回事务能够以事务为单位“回到”过去;闪回数据库能够以数据库为单位“回到”过去。
(一)要设定undo保留足够大以能够重构需要闪回数据的时间
ALTER SYSTEM SET UNDO_RETENTION=
注意:seconds值是undo数据保持的秒数。flashbackvie由undoretentioninterval限制。
(二)包DBMS_FLASHBACK提供需求接口
calldbms_flashback.enable_at_time(‘2010-10-19:11:00:00’);
calldbms_flashback.disable();
enable_at_time:会话级的enable flash back,映像时间被设定为最接近指定时间戳的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默认的是精确到天.
(三)timestamp与scn的对应关系
其实,就算指定的是asoftimestamp,在内部Oracle都是使用scn,oracle也会把它转换成scn,系统时间标记与scn之间存在一张sYS下的SMON_SCN_TIME表。
系统每隔5分钟产生一次系统时间标记与scn的匹配并存入sys.smon_scn_time表,该中记录了最近1440个系统时间标记与scn的匹配记录,因为该表只维护了最近的1440条记录,所以假设系统是在持续不断运行并无中断或关机重启之类操作的话用asoftimestamp方式只能flashback最近5天内的数据。SYS.SMON_SCN_TIME最多拥有1440条的这个最大记录数是由ORACLE平均每5分钟同步一次该表数据,最大保存最近5天的记录,因此就相当于每小时更新次数12*24*5=1440计算出来的。
(四)用sql验证:
Sql代码:selectscn,to_char(time_dp,'yyyy-mm-ddhh24:mi:ss')fromsys.smon_scn_time;
10g中提供了两个函数scn_to_timestamp()以及timestamp_to_scn()执行时间戳和SCN的转换。
用闪回演示:
(1)登陆到数据库。
Sql代码:C:\\>sqlplustivan/tivan
SQL*Plus:Release10.2.0.1.0-Productionon星期二10月1922:24:032010
Copyright(c)1982,2005,Oracle.Allrightsreserved.
连接到:
OracleDatabase10gEnterpriseEditionRelease10.2.0.1.0-Production
WiththePartitioning,OLAPandDataMiningoptions
(2)查看表的记录。
Sql代码
SQL>selectcount(*)fromt1
2;
COUNT(*)
----------
8302
(3)删除所有的记录提交。
Sql代码
SQL>deletefromt1
2;
已删除8302行。
SQL>commit;
提交完成。
(4)获得当前SCN
要是可以准确知道删除之前SCN最好,不知道的话可以进行闪回查询尝试。
Sql代码
SQL>selectdbms_flashback.get_system_change_numberfromdual;
GET_SYSTEM_CHANGE_NUMBER
1482649
SQL>selectcount(*)fromt1asofscn1482600;
COUNT(*)
8302
SCN=1482600时,t1表中的全部记录都在。
(5)利用闪回恢复数据。
查看验证一下:
Sql代码
SQL>insertintot1select*fromt1asofscn1482600;
已创建8302行。
SQL>commit;
提交完成。
结果OK
或者还可以如下操作
Sql代码
SQL>flashbacktablet1toscn1482600;
SQL>commit;
Commitcomplete.
--对于droptablet1的操作flashback
SQL>droptablet1;
SQL>COMMIT;
SQL>flashbacktablet1tobeforedrop;
SQL>commit;
对于怎么取的SCN可以使用timestamp_to_scn()函数,如:
Sql代码
selecttimestamp_to_scn(to_timestamp('2010-10-1921:00:00','YYYY-MM-DDHH:MI:SS'))fromdual;
总结:versions_xid为事务号versions_startscn和versions_endscn分别是事务开始时的SCN和修改该行的下一个事务开始时的SCN。首尾衔接这两个字段的SCN号很容易得出真实的修改顺序。要是大家对数据库相关的知识感兴趣的话,可以关注我们的网站课课家教育,我们将会不断的给大家更新资讯。
下一篇:oracle数据类型详解
¥798.00
¥199.00
¥48.00¥180.00
¥48.00¥180.00
¥199.00
¥29.90