错误修改删除数据后的恢复方法(FlashBack)
Oracle ERP维护人员工作再小心也难免会有在正式库中误删或者误改数据并且已经commit的情况发生,那么我就要用到 - Oracle9i中的FlashBack功能,或许很多同事们都在用,下面我谈谈我在使用中的方法和一些感想:
具体方法如下 >>
1. 我们可以使用
SELECT item_cost FROM cst_item_costs AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR) WHERE organization_id = 1 AND yyyymm = 200712 AND item_number = '6384BLCCSL';
来查看1个小时前的数据.
* 这里需要说明几点:
1. AS OF TIMESTAMP expr 是SELECT语句中的FLASHBACK子句
2. SYSTIMESTAMP 是系统提供的时间函数,精确度可以达到微秒级,并提供当前时区
eg. select SYSTIMESTAMP from dual;
SYSTIMESTAMP
---------------------------------------------------------------------------
29-DEC-07 11.16.08.112686 AM +09:00
3. INTERVAL 的作用是用来指定时间区间,下面是它参与运算的法则
Operand1 Operator Operand2 Result Type
-------------------------------------------------------
Datetime - Interval Datetime
我们可以通过修改时间单位和数量来改变倒退时间
TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' day) --查询一天前的数据 TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' minute ) --查询十分钟前的数据 TIMESTAMP (SYSTIMESTAMP - INTERVAL '50' second ) --查询50秒前的数据
4. 关于在FlashBack中的可回朔时间
Oracle中有两个参数能够决定可回朔时间 >>
undo 表空间大小 和 undo_retention 初始化参数.
一般的ERP正式系统里面的 undo tablespace 为 20G左右, undo_retention设置为 3600S.
业务繁忙时间最大可回朔时间约为 2-3h,非业务时间为4-5h,这里需要注意: 最大可回朔时间是由
undo表空间大小及数据库数据变更的频繁程度来决定的.
如果超过最大可回朔时间时,系统会给出有名的 ORA-01555 快照太老(Snapshot too old)错误.
5. 做FlashBack必须要有 FlashBack Any Table 的系统权限.
那么依此类推,我们就可以利用FlashBack来恢复某段时间前的数据了
UPDATE cst_item_costs SET item_cost = (SELECT item_cost FROM cst_item_costs AS OF TIMESTAMP ( SYSTIMESTAMP - INTERVAL '1' HOUR ) WHERE organization_id = 1 AND yyyymm = 200712 AND item_number = '6384BLCCSL') WHERE organization_id = 1 AND yyyymm = 200712 AND item_number = '6384BLCCSL';
* 这里也要说明几点:
a. 在恢复数据前,要检查WHERE条件是否具有唯一性
b. 如果要成批恢复或全表恢复数据的话,要检查是否在指定的时间区间内还有其他会话写入的数据