注册
达梦logmnr使用及和oracle的logminer区别
培训园地/ 文章详情 /

达梦logmnr使用及和oracle的logminer区别

MEVIUS 2025/11/21 67 1 0

达梦数据库LOGMNR使用

介绍前景
在 Oracle 数据库生态中,LogMiner 是一项广为人知的日志分析工具,能够对在线或归档重做日志(Redo Log)进行解析,从中提取出完整的 DML(数据操作语言)和 DDL(数据定义语言)语句。该工具广泛应用于审计追踪、误操作恢复、数据变更分析及异构系统数据同步等关键场景。达梦数据库(DM Database)作为国产主流关系型数据库,也提供了功能高度相似的日志挖掘组件——LOGMNR(即 DBMS_LOGMNR 包),在使用范式和应用场景上具有良好的对标性。本文将系统介绍达梦 LOGMNR 的启用条件、配置方法、操作流程及典型用例,帮助 DBA 和开发人员高效利用该能力。

使用方法
首先LOGMNR和LogMiner相同是属于数据库自身的一个组件,通常都是装完数据库就默认自动安装该组件,就拿oracle来说如果在DBA SOURCE中没有查到这个包可以通过执行以下自带脚本来安装该组件
$ORACLE_HOME/rdbms/admin/dbmslm.sql
$ORACLE HOME/rdbms/admin/dbmslmd.sql
来实现安装LogMiner组件
检查语句为
SELECT DISTINCT name FROM DBA_SOURCE WHERE TYPE = 'PACKAGE' AND NAME IN ('DBMS LOGMNR','DBMS LOGMNR_D'):

在达梦数据库也类似
检查语句为
select * from DBA_SOURCE where type like 'PACKAGE%' and name like '%LOG%'
image.png

若该命令没有查询到LOGMNR组件
则可以通过执行实现
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_LOGMNR');
image.png

在oracle中使用LogMiner进行全库日志挖掘的前置条件是开启归档和开启附加日志,检查命令如下
-- 检查数据库是否处于归档模式
SELECT log_mode FROM v$database;

-- 如果未开启,需要启用归档
alter system set log_archive_dest_1='LOCATION=/archivelog';
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;

-- 检查归档日志信息
SELECT name, log_mode, database_role FROM v$database;

-- 检查补充日志状态
SELECT supplemental_log_data_min, supplemental_log_data_pk, supplemental_log_data_ui 
FROM v$database;

-- 如果未开启,需要启用补充日志
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;

在达梦数据库中使用LOGMNR进行全库日志挖掘的前置条件也类似,首先必要的是开启归档
-- 检查数据库是否处于归档模式
select * from v$dm_arch_ini;

-- 如果未开启,需要启用归档
alter database mount;
ALTER DATABASE ADD ARCHIVELOG ‘DEST = /date/arch, TYPE =
local,FILE_SIZE = 256, SPACE_LIMIT = 10240';
alter database archivelog;
alter database open;

其次开启该参数RLOG_APPEND_LOGIC
以下对该参数进行讲解
在 dm.ini 文件中将 RLOG_APPEND_LOGIC 选项设为 1 或者 2。
设置为 1 时,如果有主键列,记录 UPDATE 和 DELETE 操作时只包含主键列信息;反之,则包含所有列信息。
设置为 2 时,不论是否有主键列,记录 UPDATE 和 DELETE 操作时都包含所有列的信息。设置为此参数会大幅增加日志量,生产环境慎用。
设置为 3 时,记录 UPDATE 操作时包含更新列的信息以及 ROWID,记录 DELETE 操作时只有 ROWID 。
如果目的是查找准确的恢复点,可以选择 1 或者 3,如果是以日常审计为目的,应设置为 2,当然也可以在表级开启记录全日志。
该解释源自于文章
https://eco.dameng.com/community/article/6bca9620fed06013fe6120e3d12e0377

这里我准备设置参数RLOG_APPEND_LOGIC为2
首先先查询该参数value值
SELECT SF_GET_PARA_VALUE(2,'RLOG_APPEND_LOGIC');
image.png

该参数为动态参数可以直接修改
SP_SET_PARA_VALUE(1,'RLOG_APPEND_LOGIC',2);
image.png
再查询

第一个数字设置1
表示同时修改内存中的参数值和 dm.ini 参数文件,该设置通常无需重启数据库即可生效
第一个数字设置2
表示仅修改 dm.ini 参数文件,而内存中的参数值保持不变,服务器需要重启后新的设置才会生效1。

开始进行测试
create table testlogmnr4(id int primary key,name VARCHAR(20));
insert into testlogmnr4 values(1,'hsx');
insert into testlogmnr4 VALUES(2,'aaa');
insert into testlogmnr4 VALUES(3,'bbb');
insert into testlogmnr4 VALUES(4,'ccc');
insert into testlogmnr4 VALUES(5,'ddd');
commit;

切换归档
alter system switch logfile;
alter system archive log current;

select * from testlogmnr4;
delete from TESTLOGMNR4 where id=1;
update testlogmnr4 set name='eeee' where id=5;
commit;

切换归档
alter system switch logfile;
alter system archive log current;

现在我们查询归档日志详细信息
select RECID, SEQUENCE#,FIRST_TIME,NEXT_TIME,BLOCKS,BLOCK_SIZE,NAME
from v$archived_log order by FIRST_TIME desc ;
image.png

将归档日志加入logmnr中
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x1F1D5307_EP0_2025-11-20_16-13-31.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x1F1D5307_EP0_2025-11-20_16-11-40.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x1F1D5307_EP0_2025-11-20_16-06-31.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x1F1D5307_EP0_2025-11-20_16-04-24.log');
DBMS_LOGMNR.ADD_LOGFILE('/dmdata/arch/ARCHIVE_LOCAL1_0x1F1D5307_EP0_2025-11-20_15-59-13.log');

Options
COMMITTED DATA ONLY 2 仅从已交的事务的日志中挖掘信崽
DICT FROM ONLINE CATALOG 16 使用在线字典
NO SQL DELIMITER 64 拼写的 SQL 语句最后不添加分隔符
NO ROWID IN STMT 2048 拼写的 SQL 语句中不包含ROWID
如果想多选则是
2+16=18
2+16+64=82
16+2048=2066
16:基础模式(推荐)
18(2+16):仅提交事务 + 在线字典
2066(16+2048):无 ROWID 的干净 SQL
-- 全量分析
DBMS_LOGMNR.START_LOGMNR(OPTIONS=>16);

查询归档信息结果
SELECT OPERATION_CODE , OPERATION, SCN, SQL_REDO, TIMESTAMP ,SEG_OWNER, TABLE_NAME FROM V$LOGMNR_CONTENTS

OPERATION_CODE, -- 操作类型编码(1=INSERT, 2=DELETE, 3=UPDATE, 5=DDL)
OPERATION, -- 操作名称(如 "DELETE")
SCN, -- 系统变更号
SQL_REDO, -- 重构的 SQL 语句
TIMESTAMP, -- 操作发生时间
SEG_OWNER, -- 模式名
TABLE_NAME -- 表名

image.png

结束logmnr执行
DBMS_LOGMNR.END_LOGMNR();

image.png

结束以后同oracle一样v$logmnr_contents是会话级数据,数据存储TEMP空间中只要断开会话会自动释放,数据就再查不到了。

补充还可以通过时间筛选
按时间窗口分析(精确到秒)
DBMS_LOGMNR.START_LOGMNR(OPTIONS=>16 ,
STARTTIME=>TO_DATE('2025-11-20 15:57:00','YYYY-MM-DD HH24:MI:SS') ,
ENDTIME=>TO_DATE('2025-11-20 16:05:00','YYYY-MM-DD HH24:MI:SS'));

注意事项与最佳实践
性能影响:开启 RLOG_APPEND_LOGIC=2 会导致 Redo 日志体积成倍增长,建议仅在必要时启用,并监控 I/O 负载。
日志保留策略:确保归档日志在挖掘完成前不被清理,否则将丢失分析依据。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服