oracle数据恢复,重点介绍通过日志分析LOGMNR工具恢复的方法
背景,业务数据表被删除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;
版权声明
本文仅代表作者观点,不代表博信信息网立场。