--此方法,适用开启归档模式的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(创建语句)