在国产数据库全面替代的今天,达梦数据库凭借稳定、高效、安全、兼容友好的优势,已成为金融、政务、运营商、能源等关键行业的核心支撑。日常运维中,我们经常会遇到 DMHS 同步突然卡顿、业务数据莫名被修改、慢 SQL 无迹可寻、误操作需要回追等场景。当常规日志、监控都无法定位问题时,归档日志挖掘就成了最后的 “杀手锏”。
本文将从达梦数据库基础认知讲起,完整拆解归档日志挖掘的原理、环境准备、操作步骤、视图解读。
达梦数据库(DM)是武汉达梦数据自主研发的国产高性能关系型数据库,拥有完全自主知识产权,是国家信创体系核心基础软件。
它具备良好的数据库语法兼容性,在高并发、高可用、安全、灾备、日志管理等企业级能力表现突出,支持完善的备份恢复、归档日志、Redo 日志等底层机制,归档日志挖掘正是基于这些能力实现深度问题定位与数据追溯。
在生产环境中,达梦数据库常与 DMHS、DEM、HSEM 等组件配合使用,归档日志挖掘是其核心高级运维技术。
归档日志挖掘是一种通过分析归档日志文件来恢复数据、查找误操作、获取 SQL 绑定参数值等的重要技术。
现场出现 DMHS 同步延时,源端与目的端日志没有异常日志,数据库 sqllog 日志没有慢 SQL 情况下,现场存在对数据库有网络监控(HSEM 或者 DEM 或者现场监控),且 DMHS 卡顿时间可以与网络监控上时间有对应峰值信息,可以使用归档日志挖掘来确认对应时间点执行了哪条 SQL 造成 DMHS 同步卡顿。
建议在新建的实例上进行日志挖掘,以避免影响源数据库的正常运行。
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"
SELECT PERMANENT_MAGIC, DB_MAGIC FROM V$DM_INI;
修改 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 确认模式和表。
使用包内的过程和函数之前,如果还未创建过系统包,先调用系统过程创建系统包。
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_LOGMNR');
ARCH_INI = 1
RLOG_APPEND_LOGIC = 1
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dbarch/dmarch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0
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
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
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);
dbms_logmnr.end_logmnr();
显示当前会话日志分析的内容。此动态视图还有一些未列出的保留列,查询时均显示 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 信息 |
归档日志挖掘在 DMHS 同步卡顿定位、数据误操作追溯、无迹故障排查等场景中不可替代。在信创落地持续深化的当下,熟练掌握达梦数据库日志挖掘技术,能够大幅提升故障处理效率,为数据库稳定运行提供坚实保障。
文章
阅读量
获赞
