第一章、前言
根据以往的经验,很多操作失误或者用户错误,将导致应用停顿甚至终止,但是,实际上,防止这种误操作的办法是非常用限的。如果没有良好的计划与高超的技术,一个很小的错误将可能导致一个很大的影响,如错误的删除(delete)数据或者是删除(drop)一个表。
[@more@]那怎么样来防止这种“不小心的操作呢”,Oracle从版本9开始,就开始提供了flashback query(闪回查询)的功能,最初的功能也是很有限的,不仅完全依赖于自动Undo(AUM),对于drop,truncate等DDL操作是毫无办法,而且,由于受到Undo空间限制,能闪回的时间也是有限的。Oracle的版本10中,对falshback做了巨大的改进,不再仅仅是局限于AUM的闪回查询了,甚至可以闪回整个数据库,您将真正的回到操作之前的状态。
在以下的章节中,我们将了解到如下的内容
1、 从Oracle 9i开始的flashback query
2、 从Oracle 9i开始的flashback exp
3、 Oracle 10g的flashback database
4、 Oracle 10g 的flashback table
5、 Oracle 10g 的flashback drop
6、 Oracle 10g 的flashback version query
7、 Oracle 10g 的flashback transaction query
第二章、从Oracle 9i开始的flashback query
2.1、Oracle 9i的flashback query
在过去,如果用户错误操作数据后,除了不完全恢复外,没有好的解决办法,到了Oracle9i,这一个难堪局面有所改善。Oracle 9i中提供了一项新的技术手段——flashback query(闪回查询),这个功能的实现,由一个新的包DBMS_FLASH来实现。用户使用闪回查询可以及时取得误操作前的数据,并可以针对错误进行相应的恢复措施。
如果需要用到闪回查询,必须在init.ora或者是spfile.ora中设置以下参数UNDO_MANAGEMENT = AUTO ,在Oracle9i中,该参数默认就是Auto(AUM)。与此相关的其它参数还有:
SQL> show parameter undo
NAME TYPE VALUE
-------------------------------- ----------- -----------
undo_management string AUTO
undo_retention integer 10800
undo_suppress_errors boolean FALSE
undo_tablespace string UNDOTBS
除了确保以上参数中的UNDO_MANAGEMENT = AUTO外,还要注意另外一个参数undo_retention = n(秒),它决定了能往前闪回的最大时间,从参数也可以看到,这个参数决定了Undo最多的保存时间,越大的值,就会需要更多的Undo空间的支持。我们可以通过如下的命令来修改该参数
SQL> ALTER SYSTEM SET undo_retention = 1200;
System altered.
以上的命令,告诉Oracle,Undo信息将保持1200秒(20分钟),这个将确保任何提交后的信息在Undo中将保持20分钟,除了可以一定程度的防止Ora-01555错误外,Falshback query将也直接的应用到其中的信息。
现在,我们用一个简单的例子来说明Oracle 9i的flashback query
1、创建FLASH用户
SQL> create user flash identified by flash;
SQL> grant connect, resource to flash;
SQL> grant execute on dbms_flashback to flash;
SQL> connect flash/flash
2、创建一个测试表
SQL> CREATE TABLE tst(t number(5));
Table created.
SQL> INSERT INTO tst VALUES(1);
1 row created.
SQL> INSERT INTO tst VALUES(2);
1 row created.
SQL> COMMIT;
Commit complete.
SQL> CREATE TABLE keep_date (date_scn_tracking date);
Table created.
SQL> SELECT * FROM tst;
T
----------
1
2
注意:在执行步骤3或者步骤4之前,等待5分钟。
3. 删除记录
SQL> execute dbms_flashback.disable;
PL/SQL procedure successfully completed.
SQL> INSERT INTO keep_date select sysdate from dual;
1 row created.
SQL> COMMIT;
Commit complete.
SQL> DELETE FROM tst WHERE t = 1;
1 row deleted.
SQL> COMMIT;
Commit complete.
SQL> SELECT * FROM tst;
T
----------
2
通过以上的操作,我们插入了两条记录,并删除了其中一条记录,现在的结果是,我们这里只有一条记录了。在以下的操作中,我们将通过flashback query找到删除的记录
4. 闪回查询
SQL> declare
2 restore_scn date;
3 begin
4 select date_scn_tracking into restore_scn from keep_date;
5 dbms_flashback.enable_at_time(restore_scn);
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> SELECT * FROM tst;
T
----------
1
2
可以看到,虽然我们删除记录并提交了,但是通过特定操作,我们还能查询到删除前的两条记录,
这里需要特别注意的是,Oracle 9i是每五分钟记录一次SCN的,并将SCN和对应时间的映射做个纪录。如果原来插入的记录到做闪回的时间在5分钟之内,用基于时间的flashback可能并查询不到记录,因为如果是基于时间点的查询,也是转化为最近的一次SCN,然后从这个SCN开始进行恢复,因此,如果需要精确的查询,我们可以采用基于SCN的flashback,它将能精确的闪回到需要恢复的时间,关于获取SCN,我们可以通过DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER或者LOGMNR。如
DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(SCN_NUM);
来定位你的恢复时间点,下面是使用方法:
SQL> VARIABLE SCN_SAVE NUMBER;
SQL>EXECUTE :SCN_SAVE := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER;
PL/SQL procedure successfully completed.
SQL> print SCN_SAVE;
SCN_SAVE
----------
2.1202E+11
SQL>execute DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(:SCN_SAVE);
最后注意,Oracle 9i的Flashback有如下限制。
·采用时间点的恢复,不能精确到最近5分钟,如果需要更精确的查询,需要采用SCN。
·不能flashback5天以前的数据,这个并不是undo_retention所能决定的。
·闪回查询无法恢复到表结构改变之前,因为闪回查询使用的当前的数据字典。
·由于受到undo_retention的影响,对于undo_retention之前的时间,flashback不保证能成功
·对于drop,truncate等不记录回滚的操作,flashback是无能为力的。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-998809/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-998809/
本文介绍了Oracle从9i版本开始引入的闪回查询功能,详细解释了如何利用DBMS_FLASH包进行误删数据的恢复,并提供了具体实例。此外,还讨论了闪回查询的局限性和配置参数的重要性。
149

被折叠的 条评论
为什么被折叠?



