ITPub博客

首页 > 数据库 > Oracle > [Logmnr]使用logminer找回被误删的数据

[Logmnr]使用logminer找回被误删的数据

原创 Oracle 作者:梓沐 时间:2016-02-15 09:58:41 0 删除 编辑
LogMiner日志挖掘技术在有些时候可以被比作是命悬一线的救命稻草,比方说误删除数据(如delete执行不当),可以通过LogMiner挖掘日志文件将这些数据补插回来

使用LogMiner预览:
1)LogMiner的原理就是找出日志文件(redo file),所对应的undo.如你新增1W行数据,在redo里以insert形式体现,对应的undo即为delete
2)LogMiner所有操作要在单个会话里执行
3)LogMiner是挖掘在线日志或归档日志,因此最好要知道误操作的具体(精确更好)时间,这样能够尽可能少的挖日志,恢复时间将更短
4)LogMiner挖掘之后的数据将保存在V$LOGMNR_CONTENTS.但需要注意一点,它的数据是每次查询时候才去读取的,因此涉及的日志文件多的时候,查询将非常慢.因此建议将视图内容用CATS保存起来,便于后来查询
5)源库的日志文件可以在源库本地做挖掘,也可以在其他机器做挖掘,但有版本和系统要求: 目标操作系统要采用同一字节编码顺序(ENDIAN_FORMAT);数据库版本大于或等于源数据库版本,且字符集相同
6)所有计划纳入挖掘的日志,需要来自同一数据库,且基于同一个RESETLOGS SCN
7)既然LogMiner可以分析日志,那么就可以用于统计哪些表被增删改查最多,可以更深入地了解自身的应用和数据
8)LogMiner可以基于time/SCN进行挖掘,精确
9)使用挖掘技术的用户需要被授权角色或权限: SELECT ANY TRANSACTION , EXECUTE_CATALOG_ROLE
10)如果表被误truncate或误drop,LogMiner恢复不了,可以通过ODU/DUL/PRM/AUL工具来恢复
概念
1)源库:生成归档日志和在线日志的库
2)目标库:执行LogMiner进行日志分析的库
3)字典:英文名为CATALOG,用于把日志中的内部信息翻译成实际的表名、列名等有价值信息
4)源库与目标库可以是同一个,也可以是不同的。如果不同,要求目标库数据库版本高于或等于源库;字符集要相同;操作系统、硬件平台要相同

一、准备工作
1)源库需要开启归档模式
2)源库需要开启最小补充日志
  1. --开启最小补充日志功能
    SQL> alter database add supplemental log data;
    Database altered

    --查询最小补充日志是否开启
    SQL> select supplemental_log_data_min from v$database;
    SUPPLEMENTAL_LOG_DATA_MIN
    -------------------------
    YES

客观的说追加日志不是必需,如果不启用追加日志SESSION_INFO等很多有用的信息解析后都没有,显示会为“UNKNOWN”。

二、 LogMiner字典模式
1、使用在线字典
这种方式是Oracle推荐的,适用于在源库做LogMiner,也是最易用的一种方式。
  1. execute dbms_logmnr.start_logmnr(options => dbms_logmnr.dict_from_online_catalog)
2、把字典放到在线日志文件
适用于源库与目标库不同这样的方式
  1. execute dbms_logmnr_d.build(options=> dbms_logmnr_d.store_in_redo_logs)
3、把字典生成OS上的一个文件
这样的方式是要是为了兼容9i及之前的版本,实际使用中这样的方式需要在源库设定UTL_FILE_DIR参数,不方便。
  1. execute dbms_logmnr_d.build('logmnr_dict.ora','/home/oracle/',dbms_logmnr_d.store_in_flat_file)
Oracle已不推荐这样方式。

三、举例演示
1、重做日志连接
http://blog.csdn.net/u011364306/article/details/49816209

2、归档日志连接
http://blog.csdn.net/u011364306/article/details/49816607

四、一些有用的选项
1、COMMITTED_DATA_ONLY
顾名思义就是只显示已经提交了的,那些正在进行中的及Oracle内部操作都忽略掉了
2、DDL_DICT_TRACKING
适用于在线日志存放LogMiner字典的情况,当表发生了添加字段等情况,字典自动更新。
  1. execute dbms_logmnr.start_logmnr(options =>dbms_logmnr.ddl_dict_tracking + dbms_logmnr.dict_from_redo_logs)
3、 NO_SQL_DELIMITER
去掉SQL_REDO及SQL_UNDO中SQL语句最后的分号,以CURSOR方式循环执行解析出的SQL会很方便和快捷。
  1. execute dbms_logmnr.start_logmnr(options =>dbms_logmnr.no_sql_delimiter + dbms_logmnr.dict_from_redo_logs)
4、NO_ROWID_IN_STMT
在SQL_REDO和SQL_UNDO列语句中去掉ROWID。举例:
  1. execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.no_rowid_in_stmt + dbms_logmnr.dict_from_redo_logs)
五、有用视图
V$LOGMNR_LOGS 添加的需解析的日志列表
V$LOGMNR_CONTENTS 解析结果



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29812844/viewspace-1988823/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
擅长PLS/QL开发,SQL调优和改写,数据库设计

注册时间:2014-08-18

  • 博文量
    161
  • 访问量
    1132239