注册
达梦数据库归档日志挖掘
培训园地/ 文章详情 /

达梦数据库归档日志挖掘

十之八九💫 2026/04/28 724 0 0

在国产数据库全面替代的今天,达梦数据库凭借稳定、高效、安全、兼容友好的优势,已成为金融、政务、运营商、能源等关键行业的核心支撑。日常运维中,我们经常会遇到 DMHS 同步突然卡顿、业务数据莫名被修改、慢 SQL 无迹可寻、误操作需要回追等场景。当常规日志、监控都无法定位问题时,归档日志挖掘就成了最后的 “杀手锏”。

本文将从达梦数据库基础认知讲起,完整拆解归档日志挖掘的原理、环境准备、操作步骤、视图解读。

一、先认识达梦数据库

达梦数据库(DM)是武汉达梦数据自主研发的国产高性能关系型数据库,拥有完全自主知识产权,是国家信创体系核心基础软件。

它具备良好的数据库语法兼容性,在高并发、高可用、安全、灾备、日志管理等企业级能力表现突出,支持完善的备份恢复、归档日志、Redo 日志等底层机制,归档日志挖掘正是基于这些能力实现深度问题定位与数据追溯。

在生产环境中,达梦数据库常与 DMHS、DEM、HSEM 等组件配合使用,归档日志挖掘是其核心高级运维技术。

二、归档日志挖掘概述

归档日志挖掘是一种通过分析归档日志文件来恢复数据、查找误操作、获取 SQL 绑定参数值等的重要技术。

典型使用场景

现场出现 DMHS 同步延时,源端与目的端日志没有异常日志,数据库 sqllog 日志没有慢 SQL 情况下,现场存在对数据库有网络监控(HSEM 或者 DEM 或者现场监控),且 DMHS 卡顿时间可以与网络监控上时间有对应峰值信息,可以使用归档日志挖掘来确认对应时间点执行了哪条 SQL 造成 DMHS 同步卡顿。

三、分析方法

建议在新建的实例上进行日志挖掘,以避免影响源数据库的正常运行。

1. 部署日志分析数据库

步骤1:备份源数据库

  • 联机备份
BACKUP DATABASE BACKUPSET '/data/dmbak/BACKUP_FILE_01';
  • 脱机备份
./dmrman CTLSTMT="BACKUP DATABASE '/data/dmdata/TEST/DAMENG/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/data/dmbak/BACKUP_FILE_01'" ./dmrman CTLSTMT="RESTORE DATABASE '/data/dmdata/TEST/dm.ini' FROM BACKUPSET '/data/dmbak/BACKUP_FILE_01'" ./dmrman CTLSTMT="RECOVER DATABASE '/data/dmdata/TEST/dm.ini' FROM BACKUPSET '/data/dmbak/BACKUP_FILE_01'" ./dmrman CTLSTMT="RECOVER DATABASE '/data/dmdata/TEST/dm.ini' UPDATE DB_MAGIC"

步骤2:查询源数据库的 PERMANENT_MAGIC 和 DB_MAGIC

SELECT PERMANENT_MAGIC, DB_MAGIC FROM V$DM_INI;

步骤3:使用 dmmdf 工具修改新建实例的 db_magic

修改 SYSTEM.DBF、DAMENG01.LOG 和 DAMENG02.LOG 文件中的 db_magic,使其与源数据库的 db_magic 一致。

执行命令:

./dmmdf TYPE=1 file=/data/dmdata/TEST/DAMENG/SYSTEM.DBF ./dmmdf TYPE=2 file=/data/dmdata/TEST/DAMENG/DAMENG01.log ./dmmdf TYPE=2 file=/data/dmdata/TEST/DAMENG/DAMENG02.log

也可以新建实例后修改归档日志的 db_magic 后进行日志挖掘:

./dmmdf TYPE=2 file=/dbarch/dmarch/ARCHIVE_LOCAL1_20140505155106577.log

特别说明:
也可以不使用备份恢复方式对归档日志进行挖掘,但是查询 V$LOGMNR_CONTENTS 视图时模式名和表名都会显示异常,需要查询源数据库 SYS.DBA_OBJECTS 确认模式和表。
image.png

四、归档日志挖掘完整操作流程

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

SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_LOGMNR');

第1步 配置环境

  1. 修改 dm.ini 中的参数
ARCH_INI = 1
RLOG_APPEND_LOGIC = 1
  1. dmarch.ini 需要配置本地归档,举例如下
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dbarch/dmarch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0

第2步 添加归档日志文件

  1. 查询有哪些归档日志
select name , first_time , next_time , first_change# , next_change# from v$archived_log;

设查询结果如下:

/dbarch/dmarch/ARCHIVE_LOCAL1_0x2D3FAE6C_EP0_2025-07-30_11-18-24.log 2025-07-30 11:18:24 2025-07-30 11:18:24 153440 160860
  1. 添加一个或多个需要分析的归档日志文件
dbms_logmnr.add_logfile('/dbarch/dmarch/ARCHIVE_LOCAL1_0x2D3FAE6C_EP0_2025-07-30_11-18-24.log');

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

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

查询结果如下:

153440 160482 2025-07-30 11:18:24 2025-07-30 11:22:46 0 /dbarch/dmarch/ARCHIVE_LOCAL1_0x2D3FAE6C_EP0_2025-07-30_11-18-24.log

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

dbms_logmnr.start_logmnr(Options=>2128 , Starttime=>to_date('2025-07-30 11:18:24','YYYY-MM-DD HH24:MI:SS') , Endtime=>to_date('2025-07-30 11:22:46','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 operation_code in (3,1,2);

image.png

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

dbms_logmnr.end_logmnr();

五、V$LOGMNR_CONTENTS 介绍

显示当前会话日志分析的内容。此动态视图还有一些未列出的保留列,查询时均显示 NULL。

序号 数据类型 说明
1 SCN BIGINT 当前记录的 LSN
2 START_SCN BIGINT 当前事务的起始 LSN
3 COMMIT_SCN BIGINT 当前事务的截止 LSN
4 TIMESTAMP DATETIME 当前记录的创建时间
5 START_TIMESTAMP DATETIME 当前事务的起始时间
6 COMMIT_TIMESTAMP DATETIME 当前事务的截止时间
7 XID BINARY(8) 当前记录的事务 ID 号,为 BIGINT 类型的事务 ID 直接转换为 16 进制,并在前面补 0
8 OPERATION VARCHAR(32) 操作类型
9 OPERATION_CODE INTEGER 操作类型编码,对应关系如下:
0:INTERNAL(内部操作)
1:INSERT(插入)
2:DELETE(删除)
3:UPDATE(更新)
4:BATCH_UPDATE(批量更新)
5:DDL(数据定义)
6:START(事务开始)
7:COMMIT(提交)
9:SEL_LOB_LOCATOR(LOB 定位符查询)
10:LOB_WRITE(LOB 写入)
11:LOB_TRIM(LOB 截断)
25:SELECT_FOR_UPDATE(锁定查询)
28:LOB_ERASE(LOB 清除)
34:MISSING_SCN(SCN 缺失)
36:ROLLBACK(回滚)
37:SEQ MODIFY(序列修改)
38:XA_COMMIT(XA 事务提交)
255:UNSUPPORTED(不支持操作)
10 ROLL_BACK INTEGER 当前记录是否被回滚,1:是,0:否
11 SEG_OWNER VARCHAR(128) 操作的模式名
12 TABLE_NAME VARCHAR(128) 操作的表名
13 ROW_ID VARCHAR(20) 对应记录的行号
14 USERNAME VARCHAR(128) 执行这条语句的用户名
15 RBASQN INTEGER 对应的归档日志文件号
16 RBABLK INTEGER RBASQN 所指日志文件的块号,从 0 开始
17 RBABYTE INTEGER RBABLK 所指块号的块内偏移
18 DATA_OBJ# INTEGER 对象 ID 号
19 DATA_OBJV# INTEGER 对象版本号
20 SQL_REDO VARCHAR(4000) 客户端发送给数据库的 SQL 语句
21 SQL_UNDO VARCHAR(4000) 暂不支持
22 RS_ID VARCHAR(32) 记录集 ID
23 SSN INTEGER 连续 SQL 标志。如果 SQL 长度超过单个 sql_redo 字段能存储的长度,则 SQL 会被截断成多个 SQL 片段在结果集中“连续”返回
24 CSF INTEGER 与 SSN 配合,最后一个片段的 csf 值为 0,其余片段的值均为 1。没因超长发生截断的 SQL 该字段值均为 0
25 REDO_VALUE BIGINT 用于数据挖掘新值
26 UNDO_VALUE BIGINT 用于数据挖掘旧值
27 CSCN BIGINT 与 COMMITSCN 一样,已过时
28 SESSION_INFO VARCHAR(64) 语句来源机器的 IP 地址
29 SESSION_ID BIGINT 当前记录的会话 ID 信息

六、运维实战要点

  1. 日志挖掘务必在独立新建实例执行,严禁直接在源生产库操作,避免影响业务运行。
  2. 必须保证分析实例与源库的 DB_MAGIC 一致,否则无法正常解析归档日志。
  3. 必须开启 ARCH_INI=1 与 RLOG_APPEND_LOGIC=1,否则无法提取完整 SQL 语句。
  4. 挖掘时尽量缩小时间范围,提升解析效率,减少资源消耗。
  5. 挖掘结束后及时执行 end_logmnr(),释放会话与系统资源。
  6. 归档日志文件需完整无损坏,避免解析中断或结果缺失。

七、结语

归档日志挖掘在 DMHS 同步卡顿定位、数据误操作追溯、无迹故障排查等场景中不可替代。在信创落地持续深化的当下,熟练掌握达梦数据库日志挖掘技术,能够大幅提升故障处理效率,为数据库稳定运行提供坚实保障。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服