LogMiner and supplemental logging
1.0 logminer 简介
logminer是oracle自带的一种工具。其实它就是一系列的可以在SQLPLUS中运行的package。logminer可以挖掘oracle的redo log。简单的说,就是可以通过logminer阅读redo log。本节包括以下内容
1.1 logminer组成介绍
logminer的使用环境中包含如下4个元素:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
源数据库
源数据库就是生成redo log的数据库。这些redo log将被logminer挖掘读取。
redo log文件
这里的redo log文件就是源数据库生成的redo log。logminer将会读取这些文件
logminer字典
在redo log存储的信息都是以oracle内部标示方式标示的。比如说,order这个表,在redo log可能会被标记成002.那么用logminer读取出来的结果页是002.这给使用者造成了不便。 而logminer字典就是解决这个问题的。通过logminer字典可以把这些难以理解的标示转化成易懂的数据。
mining数据库
就是运行logminer的数据库。因为我们知道logminer是一系列的pl/sql package,所以需要有个数据库来运行它们。 源数据库也可以当做是mining数据库。
所以,这4者的关系基本就是,源数据库生成redo log文件, redo log数据文件被传递给mining数据库。 logminer读取redo log文件并借助logminer字典把信息翻译成人类能理解的信息。
1.2 logminer使用简介
这里主要介绍使用logminer的大概流程。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1. 指定logminer字典
在这一步可以通过DBMS_LOGMNR_D.BUILD 这个存储过程来指定 logminer字典,也可以在第三步,启动logminer的时候指定
2. 指定需要读取的redo log
在这一步可以通过DBMS_LOGMNR.ADD_LOGFILE来指定redo log文件。也可以在第三步启动logminer的时候指定
3。启动logminer
使用这个存储过程DBMS_LOGMNR.START_LOGMNR
4. 查询v$logmnr_content视图
这个视图存储着刚刚logminer挖掘到的信息
2.0 logminer字典
logminer字典是用来把redo log的一些不易懂信息转化成人类可读信息的。 logminer字典有三种方式指定:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1. 使用oracle的数据字典。
如果你的源数据库和mining数据库是同一个数据库。那么也许你就可以使用当前的oracle数据字典来做logminer字典。 但注意,这里说的是也许。也就是说,不是一定可以这么做的。 那么什么时候不可以呢? 如果表的列定义改变了,这种方式就不可取了。因为这时候oracle的数据字典信息也改变了,但是redo log中存储了表改变之前的信息。用现在的数据字典去翻译改变之前的表,很显然是不可能的。
2. 生成一个logminer 字典并放入redo log
如果你的mining数据库和源数据库不是同一个,很显然你不能用第一种方式。如果表的定义会改变,很显然你也不能用第一种方式。这两种情况你需要生成一个logminer字典并存入redo log。
3. 生成一个logminer字典存入文件
这只是为了向以前版本的oracle兼容
3.0 启动logminer
启动logminer要使用 DBMS_LOGMNR.START_LOGMN
这个存储过程。在启动的时候可以使用如下option
-
DICT_FROM_ONLINE_CATALOG
— See Using the Online Catalog -
DICT_FROM_REDO_LOGS
— See Start LogMiner -
CONTINUOUS_MINE
— See Redo Log File Options -
COMMITTED_DATA_ONLY
— See Showing Only Committed Transactions -
SKIP_CORRUPTION
— See Skipping Redo Corruptions -
NO_SQL_DELIMITER
— See Formatting Reconstructed SQL Statements for Reexecution -
PRINT_PRETTY_SQL
— See Formatting the Appearance of Returned Data for Readability -
NO_ROWID_IN_STMT
— See Formatting Reconstructed SQL Statements for Reexecution -
DDL_DICT_TRACKING
— See Tracking DDL Statements in the LogMiner Dictionary
4.0 查询V$LOGMNR_CONTENTS
logminer查到的信息存储在v$logmnr_contents这个表中。本节包含以下内容:
4.1 logminer中可以查到什么内容
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
对数据库更改的类型 INSERT, UPDATE, DELETE, 或者 DDL (OPERATION column).
发生更改时刻的SCN (SCN column).
commit更改时刻的SCN (COMMIT_SCN column).
Transcation (XIDUSN, XIDSLT, and XIDSQN columns).
表名以及表的用户名 (SEG_NAME and SEG_OWNER columns).
提交SQL语句的用户名 (USERNAME column).
如果是一条DML生成的redo,这里会记载一条DML语句。该语句和真实提交的DML语句不完全相同,但运行的结果是一样的 (SQL_REDO column).
如果是一条DDL生成的redo,这里会记载一条DDL语句。该语句和真实提交的DDL语句完全相同 (SQL_REDO column).
如果是一条DML语句生成的redo,这里会记载着其对应的UNDO语句 (SQL_UNDO column).
如果是一条DDL生成的redo,这里会是NULL(SQL_UNDO column).
4.2 v$logmnr_contents的内容是怎么来的
v$logmnr_content这个视图与其他的系统视图不一样。其它的视图存储的数据是在oracle的表中存储的。而该视图的数据其实存储在redo log文件上。只有当你启动了logminer来挖掘redo log后,你才能查询这个视图。在你查询的时候,该视图才会包含数据。为了更有效率的查询该视图的内容,你可以考虑创建一个表,然后把该视图的内容存储进去。这样就可以采用oracle对于表的查询优化。
4.3 使用这个视图的一些窍门