注册
DM8日志挖掘
专栏/技术分享/ 文章详情 /

DM8日志挖掘

DM_KSL 2026/09/18 260 0 0
摘要

日志挖掘

一、 概述

DM的 DBMS_LOGMNR 是达梦数据库内置的一个日志挖掘系统包。它的核心作用是分析和解读数据库的归档日志文件,从中还原出历史上的数据操作记录(DML)、结构变更记录(DDL)和权限控制记录(DCL)等,如果数据误操作追踪当发生数据误删除且无法确定具体时间范围或操作语句时,可以利用日志分析工具对归档日志进行挖掘,准确定位问题发生的时段及相关操作,为数据恢复提供依据。

二、 相关函数和视图介绍

相关函数

函数名称 用途
SP_CREATE_SYSTEM_PACKAGES() 用来创建或删除除了 DMGEO、DBMS_JOB、DBMS_WORKLOAD_REPOSITORY 和 DBMS_SCHEDULER(这些包在数据库第一次启动时会自动创建)以外的所有系统包。若在创建过程中某个系统包由于特定原因未能创建成功,会跳过继续创建后续的系统包。(参数值 1 或 0,1 表示创建 DBMS 包,0 表示删除 DBMS 包)
PROCEDURE ADD_LOGFILE() 增加日志文件
COLUMN_PRESENT() 判断某列是否被包含在指定的一行逻辑记录中
END_LOGMINR() 结束 LOGMINR
MINE_VALUE() 以字符串的格式来获取某一条日志中包含的指定列的值
REMOVE_LOGFILE() 从日志列表中移除某个日志文件

相关视图

视图名称 用途
V$LOGMNR_CONTENTS 展示日志分析后还原出的所有操作记录
V$LOGMNR_LOGS 显示当前会话已添加的所有待分析归档日志文件
V$LOGMNR_PARAMETERS 显示当前会话启动分析时 (START_LOGMNR) 所使用的参数。

三、 日志挖掘过程

1. 前置条件

要使用 DBMS_LOGMNR 进行日志挖掘,需要在 dm.ini 配置文件中设置几个关键参数

a) 核心功能参数(必须设置)

ARCH_INI:数据库归档模式参数。必须设置为 1,才能开启数据库的归档模式。DBMS_LOGMNR 只能分析归档日志
RLOG_APPEND_LOGIC:控制日志中记录逻辑信息的详细程度,必须设置为 1、2、3 或 4 等非0值。它决定了挖掘出的 SQL_REDO 等字段能包含多少列信息
0:不启用,无法进行日志挖掘
1:对于有主键的表,UPDATE和DELETE只记录主键列;无主键的表则记录所有列。这是最常用且日志量增加较少的设置。
2:无论有无主键,UPDATE和DELETE都记录所有列信息。这会大幅增加日志量,生产环境慎用
3:记录UPDATE的变更列及ROWID,DELETE只记录ROWID
4:有主键时行为同1;无主键时记录所有列,并提供完整的前后镜像信息。

b) 优化参数(可选,按需配置)

RLOG_IGNORE_TABLE_SET:精细控制需要记录逻辑日志的表,设置为 1 时,记录所有表的逻辑日志;设置为 0 时,则只记录通过 ADD LOGIC LOG 语句显式指定的表。适合需要对特定核心表进行审计的场景
RLOG_APPEND_SYSTAB_LOGIC:控制系统表是否记录逻辑日志,取值为 0 或 1。仅在 RLOG_APPEND_LOGIC 启用后才生效。如果需审计DDL操作,可设置为 1
LOB_MAX_INROW_LEN:控制CLOB、BLOB等大字段在日志中能记录的最大长度,默认值为 900,可调整范围是 900-8000。如果大字段值超过此限制,在 SQL_REDO 中可能只会显示为 OUT_CLOB 等占位符。可根据需要调大该值
查询当前环境参数

select para_name, para_value from v$dm_ini where para_name in ('ARCH_INI','RLOG_APPEND_LOGIC');

image.png
检查DBMS包是否创建

image.png

2. 添加需要分析的归档日志文件

查询归档日志
image.png
添加归档日志文件

[dmdba@localhost arch]$ for i in `ls`;do echo DBMS_LOGMNR.ADD_LOGFILE\(\'"/dmdata/arch/"$i\'\)\;;done
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x14054747_EP0_2026-07-17_16-15-31.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x14054747_EP0_2026-07-17_17-03-58.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x14054747_EP0_2026-07-17_17-32-15.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x14054747_EP0_2026-07-27_09-08-55.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x14054747_EP0_2026-07-28_16-59-04.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x14054747_EP0_2026-07-28_17-22-52.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x14054747_EP0_2026-07-28_17-26-20.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x14054747_EP0_2026-07-29_14-08-52.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x7A7B9DA6_EP0_2026-07-17_14-51-55.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x7A7B9DA6_EP0_2026-07-17_14-52-08.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x7A7B9DA6_EP0_2026-07-17_14-52-10.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x7A7B9DA6_EP0_2026-07-17_14-52-12.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x7A7B9DA6_EP0_2026-07-17_14-52-25.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x7A7B9DA6_EP0_2026-07-17_14-52-37.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x7A7B9DA6_EP0_2026-07-17_14-53-06.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x7A7B9DA6_EP0_2026-07-17_14-54-17.log');

image.png

这里后面8个归档日志是旧的归档日志DB_MAGIC是2054921638(文件名中0x7A7B9DA6)前面8个归档日志DB_MAGIC是335890247(文件名中0x14054747),然而当前数据库的DB_MAGIC是335890247,所以我这里只添加前面8个归档日志,如果添加的归档日志文件与当前数据库的DB_MAGIC不一致后续启动分析的时候会报错:[-712]:归档日志MAGIC错误,另外也可以通过dmmdf工具来修改归档日志文件的DB_MAGIC与当前数据库DB_MAGIC一致,在添加日志,然后就可以启动分析。
image.png
通过动态视图 V$LOGMNR_LOGS 进行查询增加的归档日志文件

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

image.png

3. 启动日志分析

DBMS_LOGMNR.START_LOGMNR(
    options => 2130,
    starttime => to_date('2026-07-17 16:15:00', 'YYYY-MM-DD HH24:MI:SS'),
    endtime => to_date('2026-07-29 15:00:00', 'YYYY-MM-DD HH24:MI:SS')
);

image.png

START_LOGMNR方法有一下几个选项:
1、STARTSCN IN BIGINT DEFAULT 0  ---分析时或者加载时的过滤条件,日志起始序列号,默认0,表示无限制。
2、ENDSCN IN BIGINT DEFAULT 0    ---分析时或者加载时的过滤条件,日志结束序列号,默认0,表示无限制。
3、STARTTIME IN DATETIME DEFAULT '1988/1/1' ---分析时或者加载时的过滤条件,日志起始时间,默认1988/1/1。
4、ENDTIME IN DATETIME DEFAULT '2110/12/31' ---分析时或者加载时的过滤条件,日志结束时间,默认2110/12/31。
5、DICTFILENAME IN VARCHAR DEFAULT ''  ---离线字典的全路径名,默认为空。如果选用离线字典模式,则需要指定该选项。
6、OPTIONS IN INTDEFAULT 0     ---挖掘可选模式,可以选择某一个模式也可以,选择几个模式组合。各模式可以通过 + 或者按位或来进行组合。
如下:
--------
OPTIONS可选值有如下几个:
   COMMITTED_DATA_ONLY:对应值为2,仅从已交的事务的日志中挖掘信息
   DICT_FROM_ONLINE_CATALOG:对应值16,使用在线字典
   NO_SQL_DELIMITER:对应值64,拼写的SQL语句最后不添加分隔符
   NO_ROWID_IN_STMT:对应值2048,拼写的SQL语句中不包含ROWID
如果要选择全部模式,则值为2+16+64+2048=2130,那OPTIONS值为2130。

4. 查看分析结果

select TIMESTAMP ,START_TIMESTAMP ,COMMIT_TIMESTAMP ,OPERATION ,OPERATION_CODE ,ROLL_BACK ,TABLE_NAME ,ROW_ID ,USERNAME ,DATA_OBJ# , DATA_OBJV# , SQL_REDO, REDO_VALUE, UNDO_VALUE from V$LOGMNR_CONTENTS where table_name= 'xxxxx';
可以根据需要指定追踪信息,如表名、用户名、时间段等,在数据库中执行的操作会 被解析为单行元组的SQL操作,即在数据库中执行一条 update xxxxx set name=xxxx where id<100;则在日志分析结果中会解析为一条条单行元组的 SQL 操作,如:update XX set name=xx whereid=1;update table_name set name=xx whereid=2;等所有 id 小于 100 的 SQL 操作。
OPERATION 字段代表操作类型,主要包括 start、insert、update、delete、commit、rollback 等语句。
OPERATION_CODE 代表操作类型代码,1 表示插入操作,2 表示删除操作,3 表示更新操作,6 表示事务起始语句,7 表示提交操作,9 表示批量更新,36 表示回滚操作。
字段名 描述
TIMESTAMP 该条记录(如 DML 操作)的创建时间。
START_TIMESTAMP 该记录所在事务的起始时间。
COMMIT_TIMESTAMP 该记录所在事务的提交时间。
OPERATION 操作类型,如 INSERT, UPDATE, DELETE, DDL, COMMIT 等。
OPERATION_CODE 操作类型对应的数字代码。
ROLL_BACK 记录是否被回滚,1 表示是,0 表示否。
TABLE_NAME 操作对象的表名。
ROW_ID 操作所影响的数据行的行号。
USERNAME 执行该操作的用户名。
DATA_OBJ# 数据对象的 ID。
DATA_OBJV# 数据对象的版本号。
SQL_REDO 可以重新执行以重做操作的 SQL 语句。
REDO_VALUE 重做操作相关的数值。
UNDO_VALUE 撤销操作相关的数值。

5. 结束日志分析

DBMS_LOGMNR.END_LOGMNR();
注:进行日志挖掘过程中,在 V$LOGMNR_LOGS、V$LOGMNR_CONTENTS 等数据库动态性能视图上会产生分析数据,数据存储在 TEMP 临时表空间上,会话断开或终止归档日志文件分析后,数据会被清除。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服