Oracle Logminer快速使用详解

时间:2022-03-10 20:25:15

一、Logminer是什么?

LogMiner 是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得Oracle 重做日志文件(归档日志文件)中的具体内容,LogMiner分析工具实际上是由一组PL/SQL包和一些动态视图组成,它作为Oracle数据库的一部分来发布,是oracle公司提供的一个完全免费的工具。

具体的说: 对用户数据或数据库字典所做的所有更改都记录在Oracle重做日志文件RedoLog中,Logminer就是一个解析RedoLog的工具,通过Logminer解析RedoLog可以得到对应的SQL数据。

Oracle 中的RedoLog写入流程: Oracle重做日志采用循环写入的方式,每一个Oracle实例至少拥有2组日志组。Oracle重做日志一般由Oracle自动切换,重做日志文件在当LGWR进程停止写入并开始写入下一个日志组时发生切换,或在用户收到发出ALTER SYSTEM SWITCH LOGFILE时发生切换。如果Oracle数据库开启了归档功能,则在日志组发生切换的时候,上一个日志组的日志文件会被归档到归档目录里。

从上面可知 Oracle里的RedoLog文件分为两种:

  • 当前写的日志组的文件,可通过v$logv$logfile得到
  • 归档的redoLog文件,可通过 v$archived_log 得到

通过循环查找到最新符合要求的RedoLog并让Logminer加载分析,分析的数据在视图 v$logmnr_contents 里,通过读取 v$logmnr_contents 就可以得到 Oracle的实时数据。

二、Logminer快速使用

配置Logminer请参考Oracle配置LogMiner文档。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#1、准备测试数据(test用户)
SQL> conn test/123456
SQL> CREATE TABLE test(id varchar2(100));  
INSERT INTO test (id) values  ('000001'); 
INSERT INTO test (id) values  ('000011');
commit;
 
说明:一下步骤皆在logminer_test用户下执行
#2、查看数据库当前联机日志文件
SQL>SELECT group#, sequence#, status, first_change#, first_time FROM V$log ORDER BY first_change#;
#发现只有redo001是当前状态。
 
#3、将需要解析的在线日志文件加入
SQL>exec dbms_logmnr.add_logfile('/home/oracle/app/oracle/oradata/orcl11g/redo01.log', dbms_logmnr.new);
 
#4、启动Logminer
SQL>
begin
SYS.DBMS_LOGMNR.START_LOGMNR (
options => SYS.DBMS_LOGMNR.skip_corruption +
SYS.DBMS_LOGMNR.no_sql_delimiter +
SYS.DBMS_LOGMNR.no_rowid_in_stmt +
SYS.DBMS_LOGMNR.dict_from_online_catalog +
SYS.DBMS_LOGMNR.string_literals_in_stmt
);
end;
 
#5、查询重做日志
SQL>select * from V$LOGMNR_CONTENTS;
 
#6、停止Logminer
SQL>exec dbms_logmnr.end_logmnr;

三、Logminer的具体使用

 1.配置Logminer

请参考Oracle配置LogMiner文档。

2.使用Logminer

1.指定LogMiner字典。
2.指定重做日志文件列表以进行分析。 使用 DBMS_LOGMNR.ADD_LOGFILE 过程,或指示LogMiner在启动LogMiner时自动创建要分析的日志文件列表(在步骤3中)。
3.启动LogMiner。 使用 DBMS_LOGMNR.START_LOGMNR 程序。
4.请求感兴趣的重做数据。 查询V$LOGMNR_CONTENTS视图。(您必须具有SELECT ANY TRANSACTION查询此视图的权限)
5.结束LogMiner会话。 使用 DBMS_LOGMNR.END_LOGMNR程序。

3.Logminer字典

LogMiner字典作用

Oracle数据字典记录当前所有表的信息,字段的信息等等。LogMiner使用字典将内部对象标识符和数据类型转换为对象名称和外部数据格式。如果没有字典,LogMiner将返回内部对象ID,并将数据显示为二进制数

?
1
INSERT INTO HR.JOBS(JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY)  VALUES('IT_WT','Technical Writer', 4000, 11000);

没有字典,LogMiner将显示:

?
1
2
3
insert into "UNKNOWN"."OBJ# 45522"("COL 1","COL 2","COL 3","COL 4") values
(HEXTORAW('45465f4748'),HEXTORAW('546563686e6963616c20577269746572'),
HEXTORAW('c229'),HEXTORAW('c3020b'));

Logminer字典选项

LogMiner字典的选项支持三种:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R2CA7hWc-1633660733574)(http://note.youdao.com/yws/res/612/WEBRESOURCEb0b3ba1b987bc083fc09c6dae89c77e2)]

4.指定Logminer重做日志文件

要启动新的重做日志文件列表,需要使用 DBMS_LOGMNR.NEW 以表明这是新列表的开始

?
1
2
3
EXECUTE DBMS_LOGMNR.ADD_LOGFILE(
   LOGFILENAME => '/oracle/logs/log1.dbf',
   OPTIONS => DBMS_LOGMNR.NEW);

可以使用下列语句额外再添加日志文件

?
1
2
3
EXECUTE DBMS_LOGMNR.ADD_LOGFILE(
   LOGFILENAME => '/oracle/logs/log2.dbf',
   OPTIONS => DBMS_LOGMNR.ADDFILE);

5.启动LogMiner

使用 DBMS_LOGMNR.START_LOGMN 启动Logminer。可以指定参数:

指定LogMiner如何过滤返回的数据(例如,通过开始和结束时间或SCN值)

指定用于格式化LogMiner返回的数据的选项

指定要使用的LogMiner词典

主要的参数有:

?
1
2
3
4
5
6
7
8
9
10
OPTIONS参数说明:
  * DBMS_LOGMNR.SKIP_CORRUPTION - 跳过出错的redlog
  * DBMS_LOGMNR.NO_SQL_DELIMITER - 不使用 ';'分割redo sql
  * DBMS_LOGMNR.NO_ROWID_IN_STMT - 默认情况下,用于UPDATEDELETE操作的SQL_REDO和SQL_UNDO语句在where子句中包含“ ROWID =”。
  *                                但是,这对于想要重新执行SQL语句的应用程序是不方便的。设置此选项后,“ ROWID”不会放置在重构语句的末尾
  * DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG - 使用在线字典
  * DBMS_LOGMNR.CONTINUOUS_MINE - 需要在生成重做日志的同一实例中使用日志
  * DBMS_LOGMNR.COMMITTED_DATA_ONLY - 指定此选项时,LogMiner将属于同一事务的所有DML操作分组在一起。事务按提交顺序返回。
  * DBMS_LOGMNR.STRING_LITERALS_IN_STMT - 默认情况下,格式化格式化的SQL语句时,SQL_REDO和SQL_UNDO语句会使用数据库会话的NLS设置
  *                                       例如NLS_DATE_FORMAT,NLS_NUMERIC_CHARACTERS等)。使用此选项,将使用ANSI / ISO字符串文字格式

示例

?
1
2
3
4
5
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);

6 在V$LOGMNR_CONTENTS中查询感兴趣的重做数据

Logminer会解析redoLog里的日志加载到 v L O G M N R C O N T E N T S 视 图 里 , 我 们 只 需 要 使 用 s q l 查 询 即 可 获 取 对 应 数 据 v LOGMNR_CONTENTS 视图里,我们只需要使用 sql查询 即可获取对应数据 v LOGMNRC​ONTENTS视图里,我们只需要使用sql查询即可获取对应数据vLOGMNR_CONTENTS视图相关字段 https://docs.oracle.com/cd/B19306_01/server.102/b14237/dynviews_1154.htm

主要字段有:

数据类型 描述
SCN NUMBER oracle为每个已提交的事务分配唯一的scn
OPERATION VARCHAR2(32) INSERT UPDATE DELETE DDL COMMIT ROLLBACK…
SEG_OWNER VARCHAR2(32) schema
TABLE_NAME VARCHAR2(32) 表名
TIMESTAMP DATE 数据库变动时间戳
SQL_REDO VARCHAR2(4000) 重建的SQL语句,该语句等效于进行更改的原始SQL语句

示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
    scn,
    timestamp,
    operation,
    seg_owner,
    table_name,
    sql_redo,
    row_id,
    csf
FROM
    v$logmnr_contents
WHERE
    scn > ?

查询出来的数据示例:

Oracle Logminer快速使用详解

到此这篇关于Oracle Logminer使用的文章就介绍到这了,更多相关Oracle Logminer内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/KaiKaiWaWa/article/details/120647294