欢迎来到天天文库
浏览记录
ID:50992504
大小:48.02 KB
页数:8页
时间:2020-03-08
《Oracle10g更强大的回闪数据库功能.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Oracle10g更强大的回闪数据库功能【IT168服务器学院】用一个简单的SQL语句将一个表或者整个数据库恢复到以前的某一点。 除夕之夜,Acme银行的数据库管理员(DBA)John正在和他的朋友们一起狂欢,倒计时迎接新的一年的到来。就在子夜钟声敲响、人群欢呼之时,他的寻呼机突然响了。在银行的数据中心,在年末进行利息累机批处理簿记过程中发生了错误,所有的利息计算都不准确。幸好开发团队找出了错误所在,并开发一个应急纠正模块,但这一纠正模块不能恢复已经造成的破坏。部门经理问John是否有什么方法能往回倒一些时间,将数据库恢复至该批处理开始之前的状态,该批处理大约是在晚上
2、11:00开始的。 对于DBA们来说,这不是一件很熟悉的事吗?John的选择是什么呢? 在Oracle数据库10g之前,John可能会做一个"时间点"恢复,来将数据库恢复至所希望的某一时刻的状态。不幸的是,银行的定期日常备份大约就是在那个时间开始,这就意味着他将不得不用接近24小时的有价值的归案日志来恢复数据库。 Oracle9i数据库中提供的另一种选择是使用回闪查询特性来重建到晚上11:00为止的该表的各行,并手动生成一组不同的表。这一方法尽管理论上可行,但如果表的数量很大,则会变得不切合实际。 幸运的是,John现在的数据库是Oracle数据库1
3、0g,所以他拥有更多的选择。 回闪表 让我们来看一下上面的情况。出问题的年末批处理可能仅影响少数表。例如,它可能仅用新的账户结余更新了ACCOUNTS表。如果确实是这种情况,则John可以使用回闪表特性,它会将一个表恢复到一个过去的时间点的状态。 执行回闪表操作不需要特殊的设置。唯一的要求是表必须具有可移动的行--或者是在创建表时设置,或者是在以后利用ALTERTABLEACCOUNTSENABLEROWMOVEMENT语句设置。FLASHBACKTABLE语句从撤消段中(undosegment)读取该表的过去映像,并利用Oracle9i中引入的回闪查询重
4、建表行。 如果模式所有者之外的非DBA用户执行回闪表操作,她需要拥有对该表的SELECT、DELETE、INSERT、ALTER和FLASHBACK权限,或者拥有等价的ANYTABLE系统权限。 对于John来说,ACCOUNTS像以下的样子: ACCOUNT_NO NUMBER(12), BALANCE NUMBER(15,2) STATUS CHAR(1) STATUS的列值通常为"A"(active,活动),但是当利息计算应用程序启动时,所有的账户均被冻结,此状态也被更新为"F"(frozen,冻结)。当对每一账户都计算了利息后,该状态
5、被更新为"I"(interestapplied,利息已计算)。 下面是John用使用回闪表特性的步骤: 他索要一个大概的时间点,在这一点上数据库必须被重新检查,答案是大约晚上11:00。 他定义一个期望返回到的逻辑参考点。下面是他现在查询该表时所看到的内容: selectstatus,count(*) fromACCOUNTS groupbystatus; STATUS COUNT(*) ------ -------- I 27088 F 19999 该输出显示到目前为止已经有27088个账户被处
6、理(状态=I)。此前的状态为"A",这不是John所希望返回的位置。所希望的逻辑参考点应该是所有账户的状态都为"F"的时间点。他必须恢复到所有账户状态都为"F"的状态,这大约发生于晚上11:00。 他检查一个状态="I"的当前示例账户,以便为未来的校验测试设定一个基线: selectaccount_no,balance fromACCOUNTS wherestatus='I' andrownum<2; ACCOUNT_NO BALANCE ----------- -------- 21633 3913.49 他发出这一语句将ACCOUN
7、TS表恢复至那个时间: flashbacktableACCOUNTStotimestamp to_timestamp('12/31/200323:00:00','mm/dd/yyyyhh24:mi:ss'); 瞧!整个表被恢复到那个时间的状态了。只要撤消段中所保存的撤消数据允许,John便可以回闪到过去的某个时间点。John也可以不用时间标记(stamp),而是使用系统改变数目(systemchangenumber,SCN),如下所示: flashbacktableACCOUNTS toSCN
此文档下载收益归作者所有