DBMS_LOGMNR 包

用户可以使用 DBMS_LOGMNR 包对归档日志进行挖掘,重构出 DDL 和 DML 等操作,并通过获取的信息进行更深入的分析。

目前 DBMS_LOGMNR 只支持对归档日志进行分析,配置归档后,还需要将 dm.ini 中的 RLOG_APPEND_LOGIC 选项置为 1、2、3 或 4。

DM MPP 环境下不支持 DBMS_LOGMNR 包。DMDPC 使用 DBMS_LOGMNR 时, DBMS_LOGMNR.ADD_LOGFILE 只能添加同一个节点的多个日志同时进行分析,不支持同时分析不同节点的日志。

9.1 相关方法

  1. ADD_LOGFILE

增加日志文件。

语法如下:

PROCEDURE	ADD_LOGFILE (
	LOGFILENAME		IN		VARCHAR,
	OPTIONS			IN		INT		DEFAULT	DBMS_LOGMNR.ADDFILE,
    RAFTID			IN      INT
);

参数详解

  • LogFileName

    增加的文件的全路径。

  • Options

    可选配置参数,具体的可选配置包括:

    ◆ DBMS_lOGMNR."NEW"结束当前 LOGMNR(调用 LOGMNR_END),并增加指定文件(如果已经 START,则不可增加)

    ◆ DBMS_lOGMNR.ADDFILE 在当前 LOGMNR 中增加日志文件(如果已经 START,则不可增加)

    ◆ DBMS_lOGMNR.REMOVEFILE 从当前 LOGMNR 中去除一个日志文件

  • RAFTID

    用于 DMDPC 环境下指定 RAFT 组的 RAFT_ID,后续 DBMS_LOGMNR 包相关操作都在该 RAFT 组的主节点执行。非 DMDPC 环境忽略此参数。当调用 END_LOGMNR()或 REMOVE_LOGFILE()清除所有日志时,指定的 RAFTID 不再生效。若想 RAFTID 继续生效,需要调用 ADD_LOGFILE()重新指定。

  1. COLUMN_PRESENT

判断某列是否被包含在指定的一行逻辑记录中。

对于虚拟列 COLUMN_PRESENT 时,INSERT 语句的 REDO_VALUE 值可挖掘;UNDO_VALUE 值可挖掘;DELETE 语句的 UNDO_VALUE 值可挖掘,REDO_VALUE 值不可挖掘;UPDATE 语句的 REDO_VALUE 值和 UNDO_VALUE 值均不可挖掘。

语法如下:

FUNCTION COLUMN_PRESENT (
	SQL_REDO_UNDO	IN		BIGINT,
	COLUMN_NAME		IN		VARCHAR		DEFAULT	''
) RETURN INT;

参数详解

  • sql_redo_undo

    REDO 或 UNDO 记录的唯一标识,对应 V$LOGMNR_CONTENTS 中的 REDO_VALUE 或 UNDO_VALUE 字段。

  • column_name

    由模式名.表名.列名组成的字符串。

返回值

0 或 1,0 表示该值不可以挖掘,1 表示可以挖掘

  1. END_LOGMNR

语法如下:

PROCEDURE END_LOGMNR();

功能说明:

结束 LOGMNR。

  1. MINE_VALUE

以字符串的格式来获取某一条日志中包含的指定列的值。

语法如下:

FUNCTION	MINE_VALUE(
	SQL_REDO_UNDO	IN		BIGINT,
	COLUMN_NAME		IN		VARCHAR		DEFAULT ''
) RETURN VARCHAR;

参数详解

  • sql_redo_undo

    REDO 或 UNDO 记录的唯一标识,对应 V$LOGMNR_CONTENTS 中的 REDO_VALUE 或 UNDO_VALUE 字段。

  • column_name

    由模式名.表名.列名组成的字符串。

返回值

以字符串的格式返回某一条日志中包含的指定列的值。

在获取某个指定值时,需要确认其可以被挖掘,否则会返回 null。

MINE_VALUE 的挖掘结果与记录日志的内容有关,影响参数包括:RLOG_APPEND_LOGIC、RLOG_LLOG_COMPRESS。

RLOG_APPEND_LOGIC 取值影响如下:

RLOG_APPEND_LOGIC 取值 0 1 2 3 4
INSERT 不可挖掘 可挖掘 REDO_VALUE 值 可挖掘 REDO_VALUE 值 可挖掘 REDO_VALUE 值 不可挖掘
UPDATE 不可挖掘 含有主键列:可挖掘主键列的 REDO_VALUE 值和 UNDO_VALUE 值
不含有主键列:可挖掘 REDO_VALUE 值和 UNDO_VALUE 值
可挖掘 REDO_VALUE 值和 UNDO_VALUE 值 不可挖掘 不可挖掘
DELETE 不可挖掘 含有主键列:可挖掘主键列的 UNDO_VALUE 值
不含有主键列:可挖掘 UNDO_VALUE 值
可挖掘 UNDO_VALUE 值 不可挖掘 不可挖掘
  1. 取值为 0 时:不在日志中记录逻辑操作,不可挖掘。
  2. 取值为 1 时:如果有主键列,则 DELETE 操作只记录主键列的信息,UPDATE 操作只记录更新列和主键列的信息,此时可挖掘主键列的 UNDO_VALUE 值。如果不含有主键列,则与 RLOG_APPEND_LOGIC 取值为 2 相同。
  3. 取值为 2 时:记录 UPDATE 和 DELETE 操作时包含所有非 CLOB 和 BLOB 列的信息。
  4. 取值为 3 时:记录 UPDATE 时包含更新列的信息以及 ROWID,记录 DELETE 时只有 ROWID;不可挖掘 UPDATE 和 DELETE 的 UNDO_VALUE 值。
  5. 取值为 4 时:只生成事务以及 DDL 相关的逻辑日志,不可挖掘 INSERT\DELETE\UPDATE 的 REDO_VALUE 值和 UNDO_VALUE 值。

RLOG_LLOG_COMPRESS 取值影响:

取值为 1 时开启对 INSERT 逻辑日志的压缩功能,此时不可挖掘 INSERT 操作的 REDO_VALUE 和 UNDO_VALUE 值。

对 UPDATE 逻辑日志挖掘某列的 REDO_VALUE 值时,若该列不是更新列,则返回该列的旧值信息,等效于挖掘 UNDO_VALUE 值。

  1. REMOVE_LOGFILE

从日志列表中移除某个日志文件。

语法如下:

PROCEDURE	REMOVE_LOGFILE ( 
	LOGFILENAME		IN	VARCHAR
);

参数详解

  • LogFileName

待移除的日志文件名。

  1. START_LOGMNR

根据指定的模式和条件来开始某个会话上的 LOGMNR,一个会话上仅能 START 一个 LOGMNR。

语法如下:

PROCEDURE 	START_LOGMNR ( 
	STARTSCN		IN		BIGINT		DEFAULT 0,
	ENDSCN			IN		BIGINT		DEFAULT 0,
	STARTTIME		IN		DATETIME	DEFAULT '1988/1/1',
	ENDTIME			IN		DATETIME	DEFAULT '2110/12/31',
	DICTFILENAME	IN		VARCHAR		DEFAULT '',
	OPTIONS			IN		INT			DEFAULT	0 
);

参数详解

  • startScn

    分析时或者加载时的过滤条件,日志起始序列号,缺省为 0,表示无限制。

  • endScn

    分析时或者加载时的过滤条件,日志结束序列号,缺省为 0,表示无限制。

  • startTime

    分析时或者加载时的过滤条件,日志起始时间,缺省为 1988/1/1。

  • endTime

    分析时或者加载时的过滤条件,日志结束时间,缺省为 2110/12/31。

  • DictFileName

    离线字典的全路径名,缺省为空。目前 DM 暂不支持离线字典功能。

  • Options

    提供如下表所列的可选模式,各模式可以通过 + 或者按位或来进行组合。其它位的值如 1、4、8 等目前不支持,配置后不会报错,但是没有效果。例如,组合全部模式,则取值计算方法为 2+16+64+2048=2130,那么 Options 值取就是 2130。

Options 对应值 说明
COMMITTED_DATA_ONLY 2 仅从已提交的事务的日志中挖掘信息
DICT_FROM_ONLINE_CATALOG 16 使用在线字典
NO_SQL_DELIMITER 64 拼写的 SQL 语句最后不添加分隔符
NO_ROWID_IN_STMT 2048 拼写的 SQL 语句中不包含 ROWID

拼写的 SQL 语句使用的是当前系统中的表信息。表定义不同的两个同名表(例如同名不同列)被认定为是两个不同的表。如果 SQL 中包含的表不存在则该 SQL 语句不能被挖掘。

使用在线字典拼写 SQL 语句前,会先判断日志数据的虚拟列信息与表的虚拟列信息是否匹配,若不匹配,则不使用表信息。

9.2 举例说明

使用包内的过程和函数之前,如果还未创建过系统包,请先调用系统过程创建系统包。

SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_LOGMNR');

一下示例展示日志分析工具使用流程。

第 1 步 配置环境

(1)修改 dm.ini 中的参数,如下:

ARCH_INI = 1
RLOG_APPEND_LOGIC = 1

(2)dmarch.ini 需要配置本地归档,举例如下:

[ARCHIVE_LOCAL1]
   ARCH_TYPE = LOCAL
   ARCH_DEST = d:\dmdata\arch
   ARCH_FILE_SIZE = 128 #单位Mb
   ARCH_SPACE_LIMIT = 0 #单位Mb,0表示无限制,范围1024~4294967294M

第 2 步 添加归档日志文件

(1) 查询有哪些归档日志

select name , first_time , next_time , first_change# , next_change# from
v$archived_log;

设查询结果如下:

d:\DMdata\arch\ARCHIVE_LOCAL1_20140505155106577.log
2014-05-05 15:51:06.000000 2014-05-05 15:51:07.000000
1                     23303

(2) 添加一个或多个需要分析的归档日志文件

dbms_logmnr.add_logfile('d:\DMdata\arch\ARCHIVE_LOCAL1_20140505155106577.log');

如要查看通过 ADD_LOGFILE 添加的归档日志文件,可以通过动态视图 V$LOGMNR_LOGS 进行查询,如下:

select low_scn, next_scn, low_time, high_time, log_id, filename from v$logmnr_logs;

查询结果如下:

1                          23303
2014-05-05 15:51:06.000000 2014-05-05 15:51:07.000000  0
d:\DMdata\arch\ARCHIVE_LOCAL1_20140505155106577.log

第 3 步 启动归档日志文件分析

dbms_logmnr.start_logmnr(Options=>2128 , Starttime=>to_date('2014-03-04
17:36:00','YYYY-MM-DD HH24:MI:SS') , Endtime=>to_date('2014-06-04
17:36:02','YYYY-MM-DD HH24:MI:SS'));

如要查看归档日志文件的分析结果,可以通过动态视图 V$LOGMNR_CONTENTS 进行查询,如下:

select operation_code , scn, sql_redo , timestamp ,seg_owner, table_name from
V$LOGMNR_CONTENTS where seg_owner = 'SYSDBA' and operation_code in (3,1,2);

第 4 步 终止归档日志文件分析

dbms_logmnr.end_logmnr();
微信扫码
分享文档
扫一扫
联系客服