LogMiner 配置
source database
The source database is the database that produces all the redo log files that you want LogMiner to analyze.
mining database
The mining database is the database that LogMiner uses when it performs the analysis.
LogMiner dictionary
LogMiner 字典文件允许logminer以实际表名(列名)来替代对象的内部ID,以便于阅读理解。
For example, consider the following the SQL statement:
INSERT INTO HR.JOBS(JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY) VALUES('IT_WT','Technical Writer', 4000, 11000);
Without the dictionary, LogMiner will display:
insert into "UNKNOWN"."OBJ# 45522"("COL 1","COL 2","COL 3","COL 4") values (HEXTORAW('45465f4748'),HEXTORAW('546563686e6963616c20577269746572'),HEXTORAW('c229'),HEXTORAW('c3020b'));
redo log files
The redo log files contain the changes made to the database or database dictionary.
前提条件
source and mining database
- source db 和 mining db 必须运行在相同的硬件平台上;
- mining db可以和source db是同一个,也可以完全分离;
- mining db的版本必须大于或等于source db的版本;
- mining db的字符集必须和source db的字符集相同,或者是source db字符集的超集;
Logminer dictionary
- 产生数据字典的数据库必须和产生redo log files的 source 数据库是同一个;
All redo log files
- 所有redo log files必须来自同一个source database ;
- 所有的redo log files必须有相同的RESETLOGS SCN;
- 必须来自数据库8.0 或以后的版本;
开启补充日志
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
LogMiner Operations and Retrieving Data of Interest
日志挖掘的用户必须要具有EXECUTE_CATALOG_ROLE角色,来执行Logminer的PL/SQL包,并查询V$LOGMNR_CONTENTS视图。
指定Logminer dictionary
日志挖掘需要数据字典来将对象的ID转换成容易理解的对象名称。有三种数据字典方式:
Using the Online Catalog
在你有权限操作source db,并且数据字典定义不会改变的情况下,Oracle建议使用这种方式。这是最有效也是最简单的方式。
EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
注意:使用online catalog只会重新构建最新定义table相关的SQL,一旦一个表被alert了,那么使用online catalog将不会再反映之前版本的table。
Extracting a LogMiner Dictionary to the Redo Log Files
当你没有权限操作source db , 或者你预计挖掘对象的定义将会被改变,Oracle建议将数据字典导出到Redo log Files。
当提取数据字典到redo log中时,所有的DDL将不能执行。因此,提取到redo log files的数据字典中是一致的。
EXECUTE DBMS_LOGMNR_D.BUILD( OPTIONS=> DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
提取数据字典到redo log中会消耗数据库资源,但是选择数据库空闲期来进行的话,不会有任何问题。如果日志被归档了,可以通过以下语句来查询哪些redo log files包含提取了数据字典。
SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN='YES';
SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_END='YES';
Extracting the LogMiner Dictionary to a Flat File
此选项用于以前的版本保持向后兼容。Oracle不建议使用这种方式。
本文档暂不提供详细说明,如果着实需要,请查阅官方文档:
https://docs.oracle.com/cd/B19306_01/server.102/b14215/logminer.htm
指定要分析的redo log files
Automatically
如果是在source db上直接进行日志挖掘,那么就可以自动指定redo log files。LogMiner会根据指定的范围(SCN,TIME)使用数据库控制文件来发现并添加redo log文件到日志挖掘中。
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';
EXECUTE DBMS_LOGMNR.START_LOGMNR(
STARTTIME => '01-Jan-2003 08:30:00',
ENDTIME => '01-Jan-2003 08:45:00',
OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG +
DBMS_LOGMNR.CONTINUOUS_MINE);
Note:
The CONTINUOUS_MINE option requires that the database be mounted and that archiving be enabled.
Manually
使用这种方式,Logminer不必须连接到source db。
首先,添加第一个logfile
EXECUTE DBMS_LOGMNR.ADD_LOGFILE(
LOGFILENAME => '/oracle/logs/log1.f',
OPTIONS => DBMS_LOGMNR.NEW);
随后,可以添加其他的logfile
EXECUTE DBMS_LOGMNR.ADD_LOGFILE(
LOGFILENAME => '/oracle/logs/log2.f',
OPTIONS => DBMS_LOGMNR.ADDFILE);
在当前LogMiner session中,可以通过查询V$LOGMNR_LOGS视图来检查当前Logminer已经分析了哪些日志。
开始Logminer
DBMS_LOGMNR.START_LOGMNR的OPTIONS参数有:
- DICT_FROM_ONLINE_CATALOG
- DICT_FROM_REDO_LOGS
- CONTINUOUS_MINE
- COMMITTED_DATA_ONLY
- only rows belonging to commited transactions are shown in the V$LOGMNR_CONTENTS view
- 可能会耗尽内存
- only rows belonging to commited transactions are shown in the V$LOGMNR_CONTENTS view
- SKIP_CORRUPTION
- any corruptions in the redo log files are skipped during select operations from the V$LOGMNR_CONTENTS view.
- NO_SQL_DELIMITER
- REDO UNDO语句不包含分号
- PRINT_PRETTY_SQL
- 格式化SQL语句,但这种格式化的语句因为没使用标准语法,所以不能拿来直接执行,
- NO_ROWID_IN_STMT
- SQL语句中不包含rowid
- DDL_DICT_TRACKING
- STARTTIME
- ENDTIME
- STARTSCN
- ENDSCN
- The STARTSCN and ENDSCN parameters override the STARTTIME and ENDTIME parameters in situations where all are specified.
获取redo数据
要查询V$LOGMNR_CONTENTS视图,必须具有SELECT ANY TRANSACTION的权限。
SELECT OPERATION, SQL_REDO, SQL_UNDO
FROM V$LOGMNR_CONTENTS
WHERE SEG_OWNER = 'OE' AND SEG_NAME = 'ORDERS' AND
OPERATION = 'DELETE' AND USERNAME = 'RON';
结束Logminer
EXECUTE DBMS_LOGMNR.end_logmnr ;