在数据库运维使用过程中,归档日志处理是常见的运维场景之一。通过分析归档日志,可以解决多种实际问题: 如数据误操作追踪当发生数据误删除且无法确定具体时间范围或操作语句时,可以利用日志分析工具对归档日志进行挖掘,准确定位问题发生的时段及相关操作,为数据恢复提供依据。DBMS_LOGMNR是达梦数据库提供的日志挖掘系统包,能够高效地对归档日志进行分析,重构出DDL、DML和DCL等操作记录,为数据库审计和操作跟踪提供强有力的支持。用户可以通过该包对归档日志进行深度挖掘,获取详细的操作信息,进而开展更深入的分析。
使用注意事项:
1. 环境限制
DMMPP环境下不支持DBMS_LOGMNR包
DMDPC环境下,DBMS_LOGMNR.ADD_LOGFILE仅支持添加同一节点的多个日志进行分析,不支持跨节点日志分析
2. 配置要求使用DBMS_LOGMNR前,需确保:
已配置数据库归档,将dm.ini中的RLOG_APPEND_LOGIC参数设置为 1、2、3 或 4
3.日志分析流程如下:
--查询DBMS包是否创建
SELECT SF_CHECK_SYSTEM_PACKAGES;
SELECT SF_CHECK_SYSTEM_PACKAGE('DBMS_LOGMNR');
SP_CREATE_SYSTEM_PACKAGES:用来创建或删除除了DMGEO 、DBMS_JOB 、DBMS_WORKLOAD_REPOSITORY和DBMS_SCHEDULER (这些包在数据库第一次启动时会自动创建)以外的所有系统包。若在创建过程中某个系统包由于特定原因未能创建成功,会跳过继续创建后续的系统包。
SP_CREATE_SYSTEM_PACKAGES(1); 表示创建DBMS包
SP_CREATE_SYSTEM_PACKAGES(0); 表示删除DBMS包(除了DMGEO、DBMS_JOB、DBMS_WORKLOAD_REPOSITORY和DBMS_SCHEDULER)
日志挖掘相关函数
PROCEDURE ADD_LOGFILE --增加日志文件
COLUMN_PRESENT --判断某列是否被包含在指定的一行逻辑记录中
END_LOGMNR --结束 LOGMNR
MINE_VALUE --以字符串的格式来获取某一条日志中包含的指定列的值
REMOVE_LOGFILE --从日志列表中移除某个日志文件
相关重要视图
V$LOGMNR_CONTENTS --显示当前会话日志分析内容
V$LOGMNR_LOGS --显示当前会话需要分析的归档日志文件
V$LOGMNR_PARAMETERS --显示当前会话
START_LOGMNR --启动日志文件分析的参数
检查dm.ini参数
alter system set 'RLOG_APPEND_LOGIC'=1;
alter system set 'RLOG_IGNORE_TABLE_SET'=1;
alter system set 'RLOG_APPEND_SYSTAB_LOGIC'=0;
备注:
将所有表的逻辑日志记录到重做日志文件中,在 dm.ini 中配置 RLOG_IGNORE_TABLE_SET=1
如果只想记录部分表,则 RLOG_IGNORE_TABLE_SET=0,然后在建表或者修改表的语法中使用 ADD LOGIC LOG。这种方式适合对重点表进行审计。
是否启用在日志中记录系统表逻辑操作的功能,启用RLOG_APPEND_LOGIC 后有效。RLOG_APPEND_SYSTAB_LOGIC 取值为 0 或 1。
select para_name, para_value from v$dm_ini where para_name in ('ARCH_INI','RLOG_APPEND_LOGIC');
日志挖掘过程:
(1)查询有哪些归档日志
select name , first_time , next_time , first_change# , next_change# from v$archived_log;
(2)添加一个或多个需要分析的归档日志文件
- 批量添加日志方法,使用拼接方式处理
[dmdba@dm92 dmarch]$ for i in `ls`;do echo DBMS_LOGMNR.ADD_LOGFILE\(\'"/dm/dmarch/"$i\'\)\;;done
DBMS_LOGMNR.ADD_LOGFILE('+DMDATA/dmarch/DSC/dsc02/ARCHIVE_LOCAL1_0x7043F8DA_EP1_2025-08-11_17-24-11.log');
DBMS_LOGMNR.ADD_LOGFILE('/dm/dmarch/ARCHIVE_LOCAL1_0x303D49C2[0]_2022-12-19_14-12-22.log');
DBMS_LOGMNR.ADD_LOGFILE('/dm/dmarch/ARCHIVE_LOCAL1_0x303D49C2[0]_2022-12-19_14-15-22.log');
---通过动态视图 V$LOGMNR_LOGS 进行查询增加的归档日志文件
select low_scn, next_scn, low_time, high_time, log_id, filename from v$logmnr_logs;
(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'));
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
如果要选择全部模式,则值为1+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 wheretable_name= 'XXX';
注:可以根据需要指定追踪信息,如表名、用户名、时间段等,在数据库中执行的操作会 被解析为单行元组的SQL操作,即在数据库中执行一条 updateXXsetname=xxwhere id<100;则在日志分析结果中会解析为一条条单行元组的 SQL 操作,如:update XXset name=xxwhereid=1;updatetable_namesetname=xxwhereid=2;等所有 id 小于 100 的 SQL 操作。
OPERATION 字段代表操作类型,主要包括 start、insert、update、delete、commit、rollback 等语句。
OPERATION_CODE 代表操作类型代码,1 表示插入操作,2 表示删除操作,3 表示更新操作,6 表示事务起始语句,7 表示提交操作,9 表示批量更新,36 表示回滚操作。
(5)中止归档分析
DBMS_LOGMNR.END_LOGMNR();
注:进行日志挖掘过程中,在 V$LOGMNR_LOGS、V$LOGMNR_CONTENTS 等数据库动态性能视图上会产生分析数据,数据存储在 TEMP 临时表空间上,会话断开或终止归档日志文件分析后,数据会被清除。
文章
阅读量
获赞