LogMiner 是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle 重做日志文件(归档日志文件)中的具体内容,LogMiner分析工具实际上是由一组PL/SQL包和一些动态视图组成,可以通过它分析在线日志和归档日 志获取数据库过往详细、具体的操作,非常有用。
使用LogMiner的原因:
1、当数据库发生了误操作,需要不完全恢复,为确认误操作准确的时间点或SCN号,此时需用到LogMiner。
2、传统恢复一个上TB或是恢复一个几百GB表空间中的一个小表,标准的操作是把整个表空间恢复到之前的状态,然后再应用归档日志,加上搭建恢复环境的时间,整个时间会很长。
通过LogMiner可以换一种恢复思维,能通过它解析到这个表上所有的DML操作,可以做反向修复。合理的使用会大幅降低此情况恢复的复 杂度和时间。
3、可以把LogMiner当成最强大的数据库审计工具。
4、在过去的某个时间数据库很忙或是产生了大量的归档日志,通过LogMiner可以知道是哪些操作,哪个表占比较大,主要矛盾在哪。
2、创建测试用户 U_LOG,并授予权限
3、使用 U_LOG 用户登录,创建测试表 TT,并初始化数据
4、查询当前redo log file,和当前SCN号
5、模拟用户误操作,删除tt_id为 7 的数据
6、查询操作之后的SCN号
使用 logminer 尝试找到误操作的数据,并恢复。
7、添加联机重做日志文件(可以添加多个归档日志文件)
8、开始LogMiner,这里使用了 SCN的区间 ,不指定的话就是整个redo log file的内容
9、logminer 提取的日志信息会格式化后存放在视图 v$logmnr 中,此视图只对当前会话有效 ,所以转存到表tt_logminer中
10、结束LogMiner
11、查询结果表 tt_logminer,查看误操作的用户,登录机器等信息
至此:可以例如 SQL_UNDO 的脚本恢复数据。
有用的选项:
1、COMMITTED_DATA_ONLY
顾名思义就是只显示已经提交了的,那些正在进行中的及Oracle内部操作都忽略掉了,5的举例里使用的就是这个选项。
2、NO_ROWID_IN_STMT
在SQL_REDO和SQL_UNDO列语句中去掉ROWID。
使用LogMiner的原因:
1、当数据库发生了误操作,需要不完全恢复,为确认误操作准确的时间点或SCN号,此时需用到LogMiner。
2、传统恢复一个上TB或是恢复一个几百GB表空间中的一个小表,标准的操作是把整个表空间恢复到之前的状态,然后再应用归档日志,加上搭建恢复环境的时间,整个时间会很长。
通过LogMiner可以换一种恢复思维,能通过它解析到这个表上所有的DML操作,可以做反向修复。合理的使用会大幅降低此情况恢复的复 杂度和时间。
3、可以把LogMiner当成最强大的数据库审计工具。
4、在过去的某个时间数据库很忙或是产生了大量的归档日志,通过LogMiner可以知道是哪些操作,哪个表占比较大,主要矛盾在哪。
下面的范例环境是11G R2,数据库为归档模式。
准备工作:
1、设置数据库为追加日志模式 (默认是Minimal),否则无法跟踪到DML语句
- SQL> show user
- USER is "SYS"
-
- SQL> alter database add supplemental log data;
- Database altered.
-
- SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
SUPPLEME
--------
YES
- SQL> create user u_log identified by u_log default tablespace yjk_data;
- User created.
-
- SQL> grant connect,resource,create table to u_log;
- Grant succeeded.
-
- SQL> grant select_catalog_role,execute_catalog_role to u_log;
- Grant succeeded.
-
- SQL> grant select any transaction to u_log;
- Grant succeeded.
-
- SQL> grant execute on dbms_flashback to u_log;
- Grant succeeded.
- SQL> conn u_log/u_log
- Connected.
-
- SQL> create table tt(tt_id int,tt_name varchar2(200));
- Table created.
-
- SQL> insert into tt select rownum,'ttname'||rownum from dual connect by rownum<11;
- 10 rows created.
-
- SQL> commit;
-
- SQL> select * from tt;
TT_ID TT_NAME
---------- --------------------
1 ttname1
2 ttname2
3 ttname3
4 ttname4
5 ttname5
6 ttname6
7 ttname7
8 ttname8
9 ttname9
10 ttname10
10 rows selected.
- SQL> select MEMBER from v$logfile where group# in (select group# from v$log where status ='CURRENT');
MEMBER
----------------------------------------
/u01/oradata/orcl/redo03.log - SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
7841296
- SQL> delete from tt where tt_id=7;
- 1 row deleted.
-
- SQL> commit;
- Commit complete.
- SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
7841309
使用 logminer 尝试找到误操作的数据,并恢复。
7、添加联机重做日志文件(可以添加多个归档日志文件)
- SQL> exec dbms_logmnr.add_logfile(logfilename => '/u01/oradata/orcl/redo03.log', options => dbms_logmnr.new);
-
- PL/SQL procedure successfully completed.
8、开始LogMiner,这里使用了 SCN的区间 ,不指定的话就是整个redo log file的内容
- SQL> exec dbms_logmnr.start_logmnr(options => dbms_logmnr.dict_from_online_catalog,startscn => 7841296,endscn => 7841309);
-
- PL/SQL procedure successfully completed.
9、logminer 提取的日志信息会格式化后存放在视图 v$logmnr 中,此视图只对当前会话有效 ,所以转存到表tt_logminer中
- SQL> create table tt_logminer nologging as select * from v$logmnr_contents;
-
- Table created.
- SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();
-
- PL/SQL procedure successfully completed.
- SQL> select scn,USERNAME,os_username,machine_name, SQL_REDO, SQL_UNDO from tt_logminer where seg_owner='U_LOG' and seg_name='TT';
SCN USERNAME OS_USERNAM MACHINE_NA SQL_REDO SQL_UNDO
---------- ---------- ---------- ---------- ------------------------------------------------------------ ----------------------------------------
7841306 U_LOG oracle silent delete from "U_LOG"."TT" where "TT_ID" = '7' and "TT_NAME" = insert into "U_LOG"."TT"("TT_ID","TT_NAM
'ttname7' and ROWID = 'AAAWBIAAHAAAACUAAG'; E") values ('7','ttname7');
有用的选项:
1、COMMITTED_DATA_ONLY
顾名思义就是只显示已经提交了的,那些正在进行中的及Oracle内部操作都忽略掉了,5的举例里使用的就是这个选项。
- SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.COMMITTED_DATA_ONLY);
在SQL_REDO和SQL_UNDO列语句中去掉ROWID。
- SQL> 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/28909249/viewspace-2077507/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28909249/viewspace-2077507/