现在的位置: 首页 > 综合 > 正文

错误并不消极–对flashback的错误认识让我收获了更多

2013年10月01日 ⁄ 综合 ⁄ 共 3215字 ⁄ 字号 评论关闭

 

     

     以前对flashback没有全面的认知,把flashback table和flashback database混为一团, 从而在一次给网友解答flashback的过程中,导致网友的问题没有得到完整的解决,其实flashback table并不是10g才有的功能,而且flashback table也不是通过flashback log来进行恢复的,而是通过undo tablespace来进行恢复的,所以他们之间有着很大的差异。Oracle数据库大版版主liuyi8903及时发现我的错误认识,在他的帮助下,我重新加强了对flashback的学习。

     

    flashback(闪回)是Oracle10g里新加入的一个非常有用的一个feature。通过flashback的功能,我们可以避开传统的recover的方式去恢复一些我们进行的误操作。不过相当recovery来说。这两个还是有差别的。 

     

    1. recovery的恢复是基于数据文件的,先要restore备份好的数据文件,flashback是基于flashback log文件的,所以基点不一样,recovery是基于备份的时间上的,可以恢复到备份至完整归档的任何一个时刻,而flashback是基于 flashback log的,而log的存储时效是受限于db_flashback_retention_target这个参数的(以分钟为单位,默认1440分钟,即24 小时)。 

     

    2. recovery的恢复是应用redo记录的,所以会对期间我们不关心的数据也进行修补,而flashback可以只针对我们关心的数据进行修补。 

     

    3. recovery的恢复可以恢复数据文件物理损坏或者日志物理损坏,而flashback是基于flashback log的,只能处理由于用户的错误的逻辑操作,比如删除了表,删除了用户等。 

     

    由此可见,其实flashback和recovery的恢复还是有不少本质的差别的,因此我们要针对着相应的情况来进行相应的选择。 

     

    flashback具体来说有4种常用的操作,这几种操作虽然都冠以flashback,但是还是有着一些较大的差别, 

     

    1、flashback database(闪回数据库) 

    对应flashback database来说,一般用来处理误删除了user或者一些错误的数据操作。 

    要使用flash database的特性。我们一定要启动flashback功能, 

    SQL>alter database flashback on; 如果要关闭使用alter database flashback off; 

    同时要配置和检查参数db_flashback_retention_target,这个是控制flashback log的保留时间的参数,默认是1440分钟,即24小时。我们也只能恢复到这个时间之内。 

     

    使用如下 

    SQL>shutdown immediate; 

    SQL>startup open exclusive; 

    SQL>flashback database to timestamp to_date(’2009-05-13 00:35:50′, ‘yyyy-mm-dd hh24:mi:ss’); 

    或者基于scn号 

    SQL>flashback database to scn 5342420; 

    先用read only模式打开数据库,确定恢复的正确性,如果不对,调整时间或者scn,直到确认数据恢复正确。以resetlogs的方式打开数据库,由于 flashback log和redo log是分开的,所以即使resetlogs,闪回区的内容依然存在,我们一样能够能够闪回到以resetlog打开数据库点之钱的那个状态上,只有当 flashback的开关关掉以后,闪回区的内容将自动删除。 

     

    2. flashback drop(闪回删除) 

     

    用来恢复被误drop掉的表的恢复,这里有一个我以前错误理解的一个地方,其实这里的flash drop已经脱离了flashback log,在10g的版本里,Oracle在表删除以后,并没有真的把这个表删除,而是对删除表做了重命名,并且用recycle bin来对其进行管理,我们可以通过user_recyclebin和dba_recyclebin来进行查询. 

    SQL>select * from user_recyclebin或者是select * from dba_recyclebin; 

    通过flashback table testtable to before drop. 

    有时可能一个表被反复的建立和drop,这样在recycle一个origianl name的有多个记录相对,默认将是恢复最后一个,如果要指定恢复一个可以用他们的可以通过指定name的方式 

     

    3. flashback table(闪回表) 

    有时,不小心,对表进行了错误的update,那么我们就可以通过这个feature来进行恢复,比如,我们update … set … where ..或者delete 了表里不应该的数据,我们可以使用flashback table testtable to timestamp to_date((’2009-05-13 00:35:50′, ‘yyyy-mm-dd hh24:mi:ss’)),这里要注意和前两个不同的,这里是利用undo表做恢复的基准,所以有关undo的参数undo_management和 undo_retention对这个有影响。具体可以看看这两个参数的说明文档。注,flashback table是只能处理DML操作过后的语句的恢复,如果在期间有DDL语句操作到这个表上,做flashback table时将报错ORA-01466: unable to read data - table definition has changed。在做flashback table时先要alter table t enable row movement。 

     

    4. flashback query(闪回查询) 

     

    闪回查询好像以前版本有过,在10g里。使用select * from t as of timestamp 或者 select * from t as of scn .flash query也是利用unod表空间里的undo数据,所以和3一样, 

     

    原来对这几个flashback的feature的理解是一致的,都是基于flashback log的,这个是我一个错误的认识,通过以上的描述可以看到,只有flashback database是基于flashback log的,所以只有在flashback on的时候才能使用,而其他几个分别和undo以及数据库字典dba_recyclebin/user_recyclebin,所以flashback不 考虑flashback_on的状况。

     

    注可以通过 SQL>select * from v$database;来查询flashback_no的值。 

    这样我就对flashback有了更全面的了解了

     

    在出现了错误的时候我们需要端正自己的认识,重新深入的再次学习,不仅从这个错误中认识到自己的不足,而且还通过大家一起的讨论有了更清晰的认识, 不要害怕错误,错了不是一件光彩的事,无意义的隐瞒的错误更是一件愚蠢的事,在我们学习Oracle的过程中,难免会犯一些错误,知错能改,善莫大焉,如果从错误中能够汲取教训,学到以前遗漏的东西,这个错误就是很有价值的。  所以说错误不是消极的,消极的是我们对待错误的态度。

     

    抱歉!评论已关闭.