学堂 学堂 学堂公众号手机端

oracle数据恢复,重点介绍通过日志分析LOGMNR工具恢复的方法

lewis 5年前 (2020-01-21) 阅读数 6 #技术


背景,业务数据表被删除8天后发现丢失,里面数据很重要。通过每天的数据备份包找到了10号的数据,但是有5条数据11号备份前就没了。所以找不到了。

第一种,备份文件找不到


第二种,闪回方法查询,找不到,因为查询查过了五天,找不回。

第三种,最后成功解决了。通过查询解析日志找回。

第二种回退回滚脚本这里介绍下,没准你的数据就能找回了。

select * from GZYY02 as of timestamp to_timestamp('2019-06-24 20:10:38', 'yyyy-mm-dd hh24:mi:ss'); alter table GZYY02 enable row movement; flashback table GZYY02 to timestamp TO_TIMESTAMP('2019-06-24 20:10:38', 'yyyy-mm-dd hh24:mi:ss');

开始第三种,我认为是终极解决方式。LOGMNR工具。

我用的Oracle 11G 不需要单独安装这个工具,之前的版本需要安装另行百度下。

然后11G不需要设置字典,设置参数,直接通过下面的语句查询日志的路径

select * from v$sqlarea ;
SELECT * FROM v$session;
SELECT * FROM v$session a,v$sqlarea b
WHERE b.ADDRESS = a.PREV_SQL_ADDR;

查询出日志位置,一般指向本地服务器的本地某个文件夹。

结合回复数据的时间日期。我们要找10号和11号两个备份数据中间 数据,查询一共95个日志文件,一个50M 一共两三个G。

通过PLSQL的命令行窗口运行一下脚本

(1)分析在线重作日志文件 注意下面红色部分,第一个后后面的参数不一样,我们曾经不到参数执行,导致一直不能添加,执行好多次其实就分析了一个日志文件。

A. 创建列表

B. 添加其他日志文件到列表

SQL> exec sys.dbms_logmnr.add_logfile(LogFileName=>'c:\oradata\jssweb\arc\20120911_35.arc',options=>dbms_logmnr.new);

--SQL> exec sys.dbms_logmnr.add_logfile(LogFileName=>'c:\oradata\jssweb\arc\20120911_36.arc',options=>dbms_logmnr.addfile);

(2)分析离线日志文件

到现在为止,我们已经分析得到了重作日志文件中的内容。动态性能视图v$logmnr_contents包含LogMiner分析得到的所有的信息。

SELECT sql_redo FROM v$logmnr_contents;

如果我们仅仅想知道某个用户对于某张表的操作,可以通过下面的SQL查询得到,该查询可以得到用户DB_ZGXT对表SB_DJJL所作的一切工作。

执行下面那句,哪怕只有一天的也执行了10分钟左右。所以最好增加一个条件限制

. 抓取待恢复的信息到临时表
SQL> create table tmp_logmnr as
2 select operation,sql_redo,sql_undo from v$logmnr_contents
3 where seg_name='T1' and operation='DELETE'
4 and timestamp between to_date('2008-09-22 11:32:25','yyyy-mm-dd hh24:mi:ss')
5 and to_date('2008-09-22 11:32:45','yyyy-mm-dd hh24:mi:ss');

tmp_logmnr是实体表名,分析结果会插入里面。operation='DELETE' 要带上,百分之99。9%都是delete语句。因为我怀疑所有更新插入操作oracle底层都是先删除再插入。

有了实体表,所有的insert语句都能找到了。数据就在这里。

结束LogMiner会话 虽然关闭plsql命令行窗口也能结束会话。但是还是希望执行下结束命令

  SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR;

版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门