暂无图片
暂无图片
4
暂无图片
暂无图片
1
暂无图片

Oracle19c Logminer恢复存储过程实战案例

原创 咖啡哥 2023-06-17
635

背景

某系统,供应商运维的,直接在生产修改存储过程内容,没有备份,出问题后需要回滚。找不到原来的存储过程代码。跑来求救。时间过去了好几个小时,无法通过flashback闪回了。只能通过Logminer日志挖掘的方式来恢复原来的内容。

Logminer 基本使用步骤

19C,在CDB下面执行。在pdb下面执行会报错。
注意:以下整个操作只能在同一个会话里面执行!!否则查询V$LOGMNR_CONTENTS会看不到结果。
为了方便其他人查看,所以在第四步中,将需要的查询结果保存到了一个临时表中。

<1>. Specify a LogMiner dictionary. 指定Logminer字典

exec dbms_logmnr_d.build(options=>dbms_logmnr_d.store_in_redo_logs);
复制

<2>. Specify a list of redo log files for analysis. 指定需要挖掘的redo或者archivelog日志文件

–添加一个用new,会覆盖掉之前的文件

exec dbms_logmnr.add_logfile(logfilename=>'+FRA/newuums/archivelog/2019_12_12/thread_2_seq_99153.8812.1026829075',options=>dbms_logmnr.new);
复制

–添加多个使用addfile,一般推荐使用这个

exec dbms_logmnr.add_logfile(logfilename=>'+FRA/newuums/archivelog/2019_12_12/thread_2_seq_99153.8812.1026829075',options=>DBMS_LOGMNR.ADDFILE);
复制

根据误操作时间查询出对应的归档日志【强烈推荐,直接使用该方式即可】

SELECT distinct 'exec dbms_logmnr.add_logfile(logfilename=>''' || name ||''',options=>dbms_logmnr.addfile);' sql,
       FIRST_TIME,
       completion_time
  FROM gV$ARCHIVED_LOG
 WHERE completion_time between
       to_date('2020-05-28 12:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2020-05-28 12:30:00','yyyy-mm-dd hh24:mi:ss')
   and dest_id = 1
 order by 1;
复制

直接在sqlplus中执行上面的结果即可。

–查看添加的日志列表:

select filename from V$LOGMNR_LOGS;
复制

<3>. Start LogMiner. 开始日志挖掘

EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
复制

<4>. Request the redo data of interest. 查询V$LOGMNR_CONTENTS获取挖掘的结果

这个视图经常使用的字段:operation\seg_owner\seg_name\table_name\sql_redo

存储过程对应的系统表名叫:SOURCE$

select t.timestamp,t.seg_owner,t.seg_name,t.table_name,t.sql_redo,t.os_username,t.machine_name,t.session_info from v$logmnr_contents;
Select SQL_UNDO from v$logmnr_contents where SQL_REDO  like '%存储过程名称%';
Select * from v$logmnr_contents where operation='DDL';

create table t_hqh_logminer01 as Select * from v$logmnr_contents where SQL_REDO  like '%存储过程名称%';

create table t_hqh_logminer02 as Select * from v$logmnr_contents where table_name='SOURCE$';
复制

找到需要的SQL_UNDO内容,找开发确认无误后,恢复存储过程。

<5>. End the LogMiner session. 结束日志挖掘

EXECUTE DBMS_LOGMNR.END_LOGMNR;
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

huayumicheng
暂无图片
1年前
评论
暂无图片 0
Oracle19c Logminer恢复存储过程实战案例
1年前
暂无图片 点赞
评论