如何恢复DROP的存储过程

如何恢复DROP的存储过程

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

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

SQL>dropprocedureselect_data;

SQL>altersystemswitchlogfile;--切换日志

  系统已更改。

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

SQL>connsysassysdba;--使用sys用户连接

SQL>showparameterutl

NAMETYPEVALUE

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

create_stored_outlinesstring

utl_file_dirstring

设置utl_file_dir路径

--单实例环境

SQL>altersystemsetutl_file_dir='d:demo'scope=spfile;

--RAC环境

SQL>altersystemsetutl_file_dir='d:demo'scope=spfilesid='*';

重启数据库

SQL>Shutdownimmediate

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>executedbms_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>executedbms_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>executedbms_logmnr.start_logmnr  (dictfilename=>'D:\logmnr\dict.ora',options=>dbms_logmnr.ddl_dict_tracking);

PL/SQL过程已成功完成。

查询分析日志结果

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

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

闪回功能恢复

setpagesize0

columntextformata4000

spoolD:\7.txt

SELECTtext

FROMDBA_sourceASOFTIMESTAMPTO_TIMESTAMP('2012-11-2110:40:02','YYYY-MM-DDHH24:MI:SS')

WHEREOWNER='SCOTT'

ANDNAME='SELECT_DATA'

ORDERBYLINE

;

spooloff;

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

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

BearFishShow的方法

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

CREATEORREPLACEFUNCTIONRECOVE_PROCE(del_Timeinvarchar2,

proc_Nameinvarchar2)

RETURNVARCHAR2IS

/**

*

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

*

*del_time对象被删除时间

*

*proc_Name:被删除对象名称

*

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

*

*/

OBJ_NUMNUMBER;

str_Procvarchar2(2000);

str_Endvarchar2(2000):='';

str_Sqlvarchar2(2000);

BEGIN

SELECTobj#

INTOOBJ_NUM

FROMobj$ASOFTIMESTAMPTO_TIMESTAMP(del_Time,'YYYY-MM-DDHH24:MI:SS')

WHERENAME=upper(proc_Name);

foriin(SELECTrowidrid,source

FROMsource$ASOFTIMESTAMPTO_TIMESTAMP(del_Time,'YYYY-MM-DDHH24:MI:SS')

whereobj#=OBJ_NUM

orderbyline)loop

selectsource

intostr_Proc

fromsource$ASOFTIMESTAMPTO_TIMESTAMP(del_Time,'YYYY-MM-DDHH24:MI:SS')

whereobj#=OBJ_NUM

ANDROWID=I.RID

orderbyline;

str_End:=str_End||str_Proc;

endloop;

str_Sql:='CREATEORREPLACE'||str_End;

returnstr_Sql;

exception

whenothersthen

dbms_output.put_line(sqlcode||sqlerrm);

returnnull;

ENDRECOVE_PROCE;

/

setpagesize0

columntextformata4000

spoolD:\7.txt

SELECTRECOVE_PROCE(‘2012-11-2110:40:02’,’SELECT_DATA’)FROMfromDUAL;

spooloff;

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值