用flashback恢復儲存過程

space6212發表於2019-07-19


今天一個朋友問我,刪除了一個儲存過程是否可以恢復,想了想,恢復儲存過程就相當於找到刪除過程前SOURCE$表的資料,可以用flashback功能恢復。
下面的測試過程。


首先建立儲存過程:
SQL> create or replace procedure p_test is
2 begin
3 null;
4 end p_test;
5 /

Procedure created

SQL> col sysdate format a20
SQL> select sysdate from dual;

SYSDATE
--------------------
2007-7-10 23:50:32

SQL> drop procedure p_test;

Procedure dropped

要恢復儲存過程首先需要知道該過程在刪除前對應的OBJECT_ID,這個同樣也可以用flashback得到。

SQL> SELECT obj# FROM obj$ AS OF TIMESTAMP TO_TIMESTAMP('2007-7-10 23:50:32', 'YYYY-MM-DD HH24:MI:SS') WHERE NAME='P_TEST';

OBJ#
----------
7346

在實際中,為了更精確得到OBJ#,可能還需要限制所屬使用者等條件。

要恢復過程,時間就是恢復SOURCE$表在過程被刪除前的資料,這個用flashback是可以輕鬆做到的:
SQL> SELECT * FROM source$ AS OF TIMESTAMP TO_TIMESTAMP('2007-7-10 23:50:32', 'YYYY-MM-DD HH24:MI:SS') where obj#=7346 order by line;

OBJ# LINE SOURCE
---------- ---------- --------------------------------------------------------------------------------
7346 1 procedure p_test is
7346 2 begin
7346 3 dbms_lock.sleep(60);
7346 4 Insert Into x Values(1);
7346 5 Commit;
7346 6 end p_test;

6 rows selected

從上面結果可以看到,儲存過程已經恢復。
注意:
1、flashback是9i後才引起的,之前版本不能用這個方法恢復
2、從刪除到恢復時的時間間隔不能超過undo_retention的設定值

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-63834/,如需轉載,請註明出處,否則將追究法律責任。

相關文章