一、 准备工作

  1. 开归档
  2. 添加补充日志
alter database add supplemental log data; 
select SUPPLEMENTAL_LOG_DATA_MIN from v$database;

在通常情况下,redo log只记录进行恢复所必需的信息,但这些信息有时是不够的。例如在redo log中使用rowid唯一标识一行而不是通过Primary key,如果我们在另外的数据库分析这些日志并想重新执行某些dml时就可能会有问题,因为不同的数据库其rowid代表的内容是不同的。这时候就需要一些额外的信息(columns)加入redo log,这就是supplemental logging。

如果不打开,在分析归档日志时就看不到执行操作的machine、user_name等,对分析操作排查问题会产生很大困扰。

 

二、安装LogMiner

LogMiner的安装非常简单,只需要执行几个脚本。 这里用的是11g,版本不同,请参考官方文档。 

  • dbmslmd.sql:创建DBMS_LOGMNR_D包,该包用来创建数据字典文件。
  • dbmslm.sql:创建DBMS_LOGMNR包,该包用来分析日志文件。  
  • dbmslms.sql:创建dbms_logmnr_session包,该包用来分析session 
conn / as sysdba
@?/rdbms/admin/dbmslmd.sql
@?/rdbms/admin/dbmslm.sql
@?/rdbms/admin/dbmslms.sql

 

三、分析归档日志

1. 根据需要分析的时间找到对应归档日志

ASMCMD> ls -l
Type        Redund  Striped  Time             Sys  Name
...
ARCHIVELOG  UNPROT  COARSE   MAY 09 12:00:00  Y    thread_2_seq_4067.860.975673655
ARCHIVELOG  UNPROT  COARSE   MAY 09 14:00:00  Y    thread_2_seq_4068.316.975680855  <--以此为例(存放12:00 - 14:00的数据)
ARCHIVELOG  UNPROT  COARSE   MAY 09 16:00:00  Y    thread_2_seq_4069.633.975682969

2. 将要分析的归档或redo日志添加到分析队列

SQL> exec dbms_logmnr.add_logfile(LogFileName=>'+FRA/APS/ARCHIVELOG/2018_05_09/thread_2_seq_4068.316.975680855',Options=>dbms_logmnr.addfile);

PL/SQL procedure successfully completed.

要分析多个就执行多次添加

--也可以添加redo日志
exec dbms_logmnr.add_logfile('/data2/logs/redo01.log')

--可以删除添加的日志
exec dbms_logmnr.remove_logfile('/data2/logs/redo01.log')

--对添加入队列的日志进行分析
SQL> exec dbms_logmnr.start_logmnr( options => sys.dbms_logmnr.dict_from_online_catalog);
PL/SQL procedure successfully completed.

SQL> select count(*) from v$logmnr_contents;

  COUNT(*)
----------
    115245

v$logmnr_contents在退出当前会话后会被清空,最好在分析完成后建一张临时表慢慢找

SQL>create table archive_0521 as select to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') as timestamp,sql_redo from v$logmnr_contents;
Table created.

SQL> select min(timestamp),max(timestamp) from archive_0521;

MIN(TIMESTAMP)      MAX(TIMESTAMP)
------------------- -------------------
2018-05-09 12:27:44 2018-05-09 14:27:03

SQL> grant select on archive_0521 to appuser;
Grant succeeded

select * from archive_0521 where timestamp>='2018-05-21 10:14:00' and timestamp<'2018-05-21 10:16:00'

 

四、 logmnr工具包含的过程与视图

dbms_logmnr主要包含:

  • add_logfile / remove_logfile:增/删用于分析的日志文件
  • start_logmnr:开启日志分析,能够开启许多不同的分析选项
  • end_logmnr:终止分析会话,它将回收LogMiner占用的内存

与LogMiner相关的数据字典:

  • v$logmnr_dictionary:LogMiner可能利用的数据字典消息
  • v$logmnr_parameters:目前LogMiner所设定的参数消息
  • v$logmnr_logs:目前用于分析的日志列表
  • v$logmnr_contents:日志分析结果

其中最主要的是v$logmnr_contents视图,主要字段如下:

  • OPERATION:sql操作类型,insert、delete、update、DDL、rollback、commit等
  • SCN:操作时的SCN
  • CSCN:操作提交时的SCN
  • XIDUSN,XIDSLT,XIDSQN:操作所属的事务
  • SEG_OWNER,SEG_NAME,SEG_TYPE:操作对象的属主、名称和类型
  • USERNAME:发出该操作的用户名
  • SQL_REDO:用户执行的SQL,如果原SQL中有密码,那么密码是加密的
  • SQL_UNDO:回退SQL_REDO的SQL。比如redo是insert,undo就是delete,如果操作为DDL那么该列为空。

logminer中生成的各列的信息都是用唯一的数字信息标识的。如果要显示为用户定义的名字,那么就需要数据字典。DBMS_LOGMNR_D.BUILD可以生成数据字典。

详情参考:https://docs.oracle.com/cd/B19306_01/server.102/b14237/dynviews_1154.htm#REFRN30132