如何恢复DROP的存储过程

如何恢复DROP的存储过程

--此方法,适用开启归档模式的Oracle 数据库

当你DROP掉存储过程时,首先

SQL>drop procedure select_data;

SQL> alter system switch logfile;--切换日志

  系统已更改。

查看flash_recovery_area文件下下最新的归档日志

SQL> conn sys as sysdba;--使用sys用户连接

SQL> show parameter utl

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

create_stored_outlines               string      

utl_file_dir                         string      

设置utl_file_dir路径

--单实例环境

SQL> alter system set utl_file_dir='d:demo' scope=spfile;

--RAC环境

SQL> alter system set utl_file_dir='d:demo' scope=spfile sid='*';

重启数据库

SQL> Shutdown immediate

SQL> Startup ;

建立字典文件(环境为windows)

--dict.ora为文件名d:\demo,为路径名

SQL>executedbms_logmnr_d.build('dict.ora','d:\logmnr',dbms_logmnr_d.store_in_flat_file);

PL/SQL 过程已成功完成。

建立日志分析列表

SQL>execute dbms_logmnr.add_logfile(logfilename=>'E:\app\ZT\flash_recovery_area\lyz\ARCHIVELOG\2012_11_21\O1_MF_1_29_8BRJ6S2J_.ARC',options=>dbms_logmnr.new);

PL/SQL 过程已成功完成。

--继续添加日志

SQL>execute dbms_logmnr.add_logfile(logfilename=>'E:\app\ZT\flash_recovery_area\lyz\ARCHIVELOG\2012_11_21\O1_MF_1_30_8BRJSY77_.ARC',options=>dbms_logmnr.addfile);

PL/SQL 过程已成功完成。

启动LogMiner

SQL>execute dbms_logmnr.start_logmnr  (dictfilename=>'D:\logmnr\dict.ora',options=>dbms_logmnr.ddl_dict_tracking);

PL/SQL 过程已成功完成。

查询分析日志结果

PS:不知道为何显示的用户为UNKONW,有知道的告诉我下

查看到存储过程DROP的时间点,试用闪回功能恢复,脚本如下

闪回功能恢复

set pagesize 0

column text format a4000

spool D:\7.txt

SELECT text

       FROM DBA_source AS OF TIMESTAMP TO_TIMESTAMP('2012-11-21 10:40:02', 'YYYY-MM-DD HH24:MI:SS')

      WHERE OWNER = 'SCOTT'

        AND NAME = 'SELECT_DATA'

       ORDER BY LINE

     ;

spool off;

此时在D盘下的7.txt文件里就是被DROP的存储过程select_data

在Eygle大神指点的方向下,我发现还有一种方法可以实现恢复,也感谢

BearFishShow 的方法

创建恢复函数,此方法来自http://bbs.csdn.net/topics/370143351,感谢BearFishShow

CREATE OR REPLACE FUNCTION RECOVE_PROCE(del_Time  in varchar2,

                                        proc_Name in varchar2)

  RETURN VARCHAR2 IS

/**

*

*  function Name :存储过程或function 删除后恢复方法 

*

*  del_time 对象被删除时间

*

*  proc_Name :被删除对象名称 

*

*  return :返回重建对象的语句

*

*/

  OBJ_NUM  NUMBER;

  str_Proc varchar2(2000);

  str_End  varchar2(2000) := '';

  str_Sql  varchar2(2000);

BEGIN

  SELECT obj#

    INTO OBJ_NUM

    FROM obj$ AS OF TIMESTAMP TO_TIMESTAMP(del_Time, 'YYYY-MM-DD HH24:MI:SS')

   WHERE NAME = upper(proc_Name);

 

  for i in (SELECT rowid rid, source

              FROM source$ AS OF TIMESTAMP TO_TIMESTAMP(del_Time, 'YYYY-MM-DD HH24:MI:SS')

             where obj# = OBJ_NUM

             order by line) loop

    select source

      into str_Proc

      from source$ AS OF TIMESTAMP TO_TIMESTAMP(del_Time, 'YYYY-MM-DD HH24:MI:SS')

     where obj# = OBJ_NUM

       AND ROWID = I.RID

     order by line;

    str_End := str_End || str_Proc;

  end loop;

 

  str_Sql := 'CREATE OR REPLACE ' || str_End;

  return str_Sql;

exception

  when others then

    dbms_output.put_line(sqlcode || sqlerrm);

    return null;

END RECOVE_PROCE;

/

set pagesize 0

column text format a4000

spool D:\7.txt

SELECT RECOVE_PROCE(‘2012-11-21 10:40:02’,’SELECT_DATA’)       FROM from DUAL;

spool off;

此时在D盘下的7.txt文件里就是被DROP的存储过程select_data(创建语句)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值