Can U restore the dropped procedure?
database December 23rd, 2009这是个挺极端的话题,因为标题中问题的前提是:没有任何备份。
不要抱怨,“命苦不能怪政府,点背不能怨社会” ^_^
而我一个同事,就真正碰上这样的问题。当然,最后也成功恢复了。
有人会想到logminer和archive log,但是sp被删除时archive log并不记录sp的文本内容。当然logminer有用处,起码能定位到准确的删除时间。
存储过程的文本内容通常被记录在source$中。
SQL> conn blue/blue
Connected.
SQL> create or replace procedure sp_test2
2 is
3 begin
4 dbms_output.put_line(‘procedure restore’);
5 end;
6 /
Procedure created.
SQL> conn / as sysdba
Connected.
SQL> select s.obj#,s.source from source$ s,obj$ o
2 where s.obj#=o.obj#
3 and o.name=’SP_TEST’;
OBJ# SOURCE
———- ————————————————–
53258 procedure sp_test
53258 is
53258 begin
53258 dbms_output.put_line(‘procedure restore’);
53258 end;
不过可惜的是,当sp或整个schema被drop后,source$中对应的内容也一并被删除。
21:56:42 SQL> drop procedure blue.sp_test;
Procedure dropped.
21:56:54 SQL> select s.obj#,s.source from source$ s,obj$ o
21:57:20 2 where s.obj#=o.obj#
21:57:20 3 and o.name=’SP_TEST’;
no rows selected
我们想要得到的,是过去某个时间点里source$中的内容。
然而,sys schema下不支持flashback table,Oracle不允许你这么干,如果部分数据字典表被回退到过去的时间点,这全乱套了。
有人用flashback database,没错,这确实可以实现,只是,这也太小题大作了吧?辛辛苦苦几十年,一下回到解放前。
so,why not flashback query?
21:59:53 SQL> select obj#,name from obj$ as of timestamp sysdate-5/1440
21:59:55 2 where name =’SP_TEST’;
OBJ# NAME
———- ——————————
53258 SP_TEST
22:00:22 SQL> select obj#,source from source$ as of timestamp sysdate-6/1440
22:00:24 2 where obj#=53258;
OBJ# SOURCE
———- ————————————————–
53258 procedure sp_test
53258 is
53258 begin
53258 dbms_output.put_line(‘procedure restore’);
53258 end;
回到最开始的话题,2点警示:
1、制订完善的备份策略并实施
2、规划日常操作

December 30th, 2009 at 8:36 pm
sys schema下还支持 flashback query,又学到一招:)