oracle闪回:闪回查询(FlashbackQuery)来源: 发布时间:星期四, 2009年2月12日 浏览:129次 评论:0
作者:gototop 、介绍 在过去如果用户误删/更新了数据后作为用户并没有什么直接思路方法来进行恢复他们必须求助DBA来对数据库进行恢复到了Oracle9i这个难堪局面有所改善Oracle 9i中提供了项新技术手段--闪回查询用户使用闪回查询可以及时取得误操作前数据并可以针对进行相应恢复措施而这切都无需DBA干预 下面我们通过个例子来具体介绍说明闪回查询使用方法 2、举例 1、使用闪回查询前必须确定下面两个参数: UNDO_MANAGEMENT = AUTO undo_retention = 1200; #这个时间可以随便设他表示在系统中保留提交了UNDO信息时间1200就是保留20分钟 2、使用闪回查询 SQL> conn sys/sys as sysdba Connected. SQL> create user flash identied by flash; User created. SQL> grant connect, resource to flash; Grant succeeded. SQL> grant execute _disibledevent=> 1 row deleted. 15:00:35 SQL> commit; Commit complete. 15:00:38 SQL> select * from t; A ---------- www.ncn.cn www.ncn.cn 15:08:22 SQL> execute DBMS_FLASHBACK.ENABLE_AT_TIME(to_date(\'2003-05-16 15:00:00\')); PL/SQL procedure successfully completed. 15:09:02 SQL> select * from t; A ---------- gototop www.ncn.cn www.ncn.cn 15:16:43 SQL> execute DBMS_FLASHBACK.DISABLE; PL/SQL procedure successfully completed. 15:17:05 SQL> select * from t; A ---------- www.ncn.cn www.ncn.cn 3、使用闪回查询恢复数据: 15:36:55 SQL> select * from t; no rows selected 15:36:57 SQL> insert o t values(\'www.ncn.cn\'); 1 row created. 15:37:15 SQL> / 1 row created. 15:37:16 SQL> / 1 row created. 15:37:17 SQL> / 1 row created. 15:37:18 SQL> / 1 row created. 15:37:19 SQL> commit; Commit complete. 15:37:21 SQL> / Commit complete. 15:37:22 SQL> / Commit complete. 15:37:23 SQL> select * from t; A ---------- www.ncn.cn www.ncn.cn www.ncn.cn www.ncn.cn www.ncn.cn www.ncn.cn 6 rows selected. 15:37:28 SQL> 15:38:44 SQL> delete t; 6 rows deleted. 15:38:50 SQL> commit; Commit complete. 15:38:53 SQL> commit; Commit complete. 15:38:54 SQL> / Commit complete. 15:38:57 SQL> declare 15:39:28 2 cursor flash_recover is 15:39:28 3 select * from t; 15:39:28 4 t_recode t%rowtype; 15:39:28 5 begin 15:39:28 6 DBMS_FLASHBACK.ENABLE_AT_TIME(to_date(\'2003-05-16 15:37:23\')); 15:39:28 7 open FLASH_RECOVER; 15:39:28 8 DBMS_FLASHBACK.DISABLE; 15:39:28 9 loop 15:39:28 10 FETCH FLASH_RECOVER INTO t_recode; 15:39:28 11 EXIT WHEN FLASH_RECOVER%NOTFOUND; 15:39:28 12 insert o t values (t_recode.a); 15:39:28 13 end loop; 15:39:28 14 CLOSE FLASH_RECOVER; 15:39:28 15 commit; 15:39:28 16 end; 15:39:28 17 / PL/SQL procedure successfully completed. 15:39:28 SQL> 15:39:28 SQL> 15:39:31 SQL> select * from t; A ---------- www.ncn.cn www.ncn.cn www.ncn.cn www.ncn.cn www.ncn.cn 15:39:35 SQL> 我们可以已经恢复了5条纪录但我们要恢复6条纪录为什么会少条呢?原因就在下面 3、局限性 1、闪回查询是基于SCN虽然我执行是: DBMS_FLASHBACK.ENABLE_AT_TIME(to_date(\'2003-05-16 15:37:23\')); 但Oracle并不会精确这个时间点而是ROUND DOWN到最近次SCN然后从这个SCN开始进行恢复而Oracle 9i是每 5分钟记录次SCN并将SCN和对应时间映射做个纪录 这正是上面我们进行恢复时少了条原因因此如果使用DBMS_FLASHBACK.ENABLE_AT_TIME来进行恢复为了避免恢复失败我可以先等5分钟然后再进行恢复 使用DBMS_FLASHBACK.ENABLE_AT_TIME进行恢复还有个缺点那就是在Oracle 9i中SCN和对应时间映射信息只会保留5天因此我们无法通过DBMS_FLASHBACK.ENABLE_AT_TIME来恢复5天前数据如果你想使用闪回查询来恢复5天前数据你必须自己来确定需要恢复SCN然后使用 DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(SCN_NUMBER); 来定位你恢复时间点下面是使用思路方法: 15:58:58 SQL> VARIABLE SCN_SAVE NUMBER; 16:13:43 SQL> EXECUTE :SCN_SAVE := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER; PL/SQL procedure successfully completed. 16:13:50 SQL> pr SCN_SAVE; SCN_SAVE ---------- 2.1202E+11 16:28:34 SQL> execute DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(:SCN_SAVE); PL/SQL procedure successfully completed. 另外在使用DBMS_FLASHBACK.ENABLE_AT_TIME前你必须设定你NLS_DATE_FORMAT精确程度Oracle默认是精确到天如果你不设定像上面例子你不会得到预期结果 2、如果你使用sysdate和DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER来获取时间点或者SCN值你必须注意它们取得都是当前时间点和SCN值 3、你只能在事务开始时进入闪回查询模式如果的前有DML操作则必须COMMIT 4、闪回查询无法恢复到表结构改变的前闪回查询使用当前数据字典 0
相关文章读者评论发表评论 |