现场开发人员报告误删了生产库一个表全部数据,是生产数据,负任重大,需要恢复。幸好用的是delete,恢复数据还是比较容易。
SQL> select count(*) from t1;
COUNT(*)
----------
0
记录全被删除了。
数据库版本是10g,数据有大约上万条,首先用flashback version query试试:
SQL> select *
from t1 versions
between timestamp to_timestamp('2011-5-9 13:00:00','yyyy-mm-dd hh24:mi:ss')
and to_timestamp('2011-5-9 13:10:00','yyyy-mm-dd hh24:mi:ss');
from t1 versions
*
ERROR at line 2:
ORA-30052: invalid lower limit snapshot expression
看来时间超过限制。
想过用日志挖掘,但这么多的数据undo sql也不少,如何抽丝剥茧也是一大难题。看看闪回查询(flashback query):
SQL> select count(*) from t1 as of timestamp to_timestamp('2011-5-9 13:00:00','yyyy-mm-dd hh24:mi:ss');
COUNT(*)
----------
90014
和开发人员确认和被删之前记录数相符,干脆用闪回表方法恢复,不用中间表,开启表上的行迁移:
SQL> Alter table t1 enable row movement;
Table altered.
闪回:
SQL> flashback table t1 to timestamp to_timestamp('2011-5-9 13:00:00','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
SQL> select count(*) from t1;
COUNT(*)
----------
90014
数据已经恢复
取消行迁移:
SQL> Alter table t1 disable row movement;
Table altered.
需要注意的一点flashback table的一些限制:
1)启用行移动 alter table table_name enable row movement;
2)不能用于闪回系统表、远程表、外部表;
3)不能跨越DDL语句,即闪回期间如果发生了DDL,则闪回失败
4)9i只能闪回5分钟内的数据,10g有所增强,可以延长到5天,只要undo没有被覆盖