一、 准备工作
- 开归档
- 添加补充日志
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