1、前言

​ 使用DBMS_LOGMNR包对归档日志进行挖掘,重构出DDL和DML等操作,并通过获取的信息进行更深入的分析。目前DBMS_LOGMNR只支持对归档日志进行分析,配置归档后,还需要将dm.ini中的RLOG_APPEND_LOGIC选项置为1或2。
​ DM MPP 环境下不支持DBMS_LOGMNR包。

本次测试使用到的系统包以及视图:
​ DBMS_LOGMNR:ADD_LOGFILE、START_LOGMNR、END_LOGMNR;
​ V$ARCHIVED_LOG、V$LOGMNR_LOGS、V$LOGMNR_PARAMETERS、V$LOGMNR_CONTENTS;

参考文档:《DM8系统包使用手册》 《DM8系统管理员手册》

2、数据库配置

2.1 创建DBMS系统包

SP_CREATE_SYSTEM_PACKAGES(1);   ---创建所有DBMS包
或者
SP_CREATE_SYSTEM_PACKAGES(1,'DBMS_LOGMNR');   ---创建指定DBMS包

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)

可以通过SF_CHECK_SYSTEM_PACKAGES或者SF_CHECK_SYSTEM_PACKAGE进行查看:

SELECT SF_CHECK_SYSTEM_PACKAGES;
或者
SELECT SF_CHECK_SYSTEM_PACKAGE('DBMS_LOGMNR');

2.2 修改数据库配置文件并重启数据

2.2.1 修改dm.ini文件
ARCH_INI = 1
RLOG_APPEND_LOGIC = 1

RLOG_APPEND_LOGIC:是否启用在日志中记录逻辑操作的功能, 取值 范围 0、 1、 2、 3 ,默认0。
0: 不启用; 1、 2、 3 启用。
1: 如果有主键列,记录 UPDATE 和 DELETE 操作时只包含主键列信息,若没有主键列则包 含所有列信息;
2:不论是否有主键列,记录 UPDATE 和 DELETE 操作时都包含所有列的信息;
3: 记录 UPDATE 时包含更新列的信息以及 ROWID,记录 DELETE 时只有 ROWID;

2.2.2 配置dmarch.ini文件
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = E:\dmdbms\data\TEST\arch
ARCH_FILE_SIZE = 64
ARCH_SPACE_LIMIT = 10240

修改完上述两个配置文件后重启数据库生效。

3、添加需要分析的归档日志

添加分析的归档日志需要使用DBMS_LOGMNR包的ADD_LOGFILE方法。

3.1 查找数据库归档日志

SELECT
        NAME         ,
        FIRST_TIME   ,
        NEXT_TIME    ,
        FIRST_CHANGE#,
        NEXT_CHANGE#
FROM
        V$ARCHIVED_LOG;

image-20210419141724280

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

DBMS_LOGMNR.ADD_LOGFILE('E:\dmdbms\data\TEST\arch\ARCHIVE_LOCAL1_0x4C3F1D00[0]_2021-04-19_14-13-18.log');
DBMS_LOGMNR.ADD_LOGFILE('E:\dmdbms\data\TEST\arch\ARCHIVE_LOCAL1_0x4C3F1D00[0]_2021-04-19_14-16-13.log');

###也可以参考Oracle语法

3.3 查询已添加到LOGMNR中的归档日志文件

SELECT
        LOW_SCN  ,
        NEXT_SCN ,
        LOW_TIME ,
        HIGH_TIME,
        LOG_ID   ,
        FILENAME
FROM
        V$LOGMNR_LOGS; 

image-20210419142252891

V$LOGMNR_LOGS 视图描述信息可以查看《DM8 系统管理员手册》

4、归档日志分析

分析归档日志需要使用DBMS_LOGMNR包的START_LOGMNR方法。

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.1 开始进行日志分析

---指定多个组合选项
DBMS_LOGMNR.START_LOGMNR(OPTIONS=>2128 , STARTTIME=>TO_DATE('2021-04-19 14:13:18','YYYY-MM-DD HH24:MI:SS') , ENDTIME=>TO_DATE('2021-04-19 14:16:01','YYYY-MM-DD HH24:MI:SS'));   

---指定单个日志分析选项
dbms_logmnr.start_logmnr(options=>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG, STARTTIME=>TO_DATE('2021-04-19 14:13:18','YYYY-MM-DD HH24:MI:SS') , ENDTIME=>TO_DATE('2021-04-19 14:16:01','YYYY-MM-DD HH24:MI:SS'));
或者
dbms_logmnr.start_logmnr(options=>16, STARTTIME=>TO_DATE('2021-04-19 14:13:18','YYYY-MM-DD HH24:MI:SS') , ENDTIME=>TO_DATE('2021-04-19 14:16:01','YYYY-MM-DD HH24:MI:SS'));

可以在当前会话通过V$LOGMNR_PARAMETERS 视图查看当前会话START_LOGMNR的参数。

4.2 查看当前会话日志分析的内容

SELECT
        OPERATION_CODE,
        OPERATION,
        SCN           ,
        SQL_REDO      ,
        TIMESTAMP     ,
        SEG_OWNER     ,
        TABLE_NAME
FROM
        V$LOGMNR_CONTENTS
WHERE
        SEG_OWNER       = 'SYSDBA'
    AND OPERATION_CODE IN (3, 1, 2);  ---这里只查询日志中的insert、update、delete语句;

image-20210419152146679

V$LOGMNR_CONTENTS视图更多内容可以查看《DM8 系统管理员手册》

4.3 终止日志文件分析

需要使用DBMS_LOGMNR包的END_LOGMNR方法。

DBMS_LOGMNR.END_LOGMNR();    

4.4 使用上需要注意的地方

1、上述日志分析的所有操作包括ADD_LOGFILE、START_LOGMNR、END_LOGMNR以及查询V L O G M N R P A R A M E T E R S 、 V LOGMNR_PARAMETERS 、V LOGMNRPARAMETERSVLOGMNR_CONTENTS都需要在同一个会话中进行。

2、上述日志分析的操作流程(ADD_LOGFILE、START_LOGMNR)可以放到存储过程或者匿名块中一起执行执行,如下:

begin
  dbms_logmnr.add_logfile('E:\dmdbms\data\TEST\arch\ARCHIVE_LOCAL1_0x4C3F1D00[0]_2021-04-19_14-13-18.log',OPTIONS => DBMS_LOGMNR.ADDFILE);
  dbms_logmnr.add_logfile('E:\dmdbms\data\TEST\arch\ARCHIVE_LOCAL1_0x4C3F1D00[0]_2021-04-19_14-16-13.log',OPTIONS => DBMS_LOGMNR.ADDFILE);
  dbms_logmnr.add_logfile('E:\dmdbms\data\TEST\arch\ARCHIVE_LOCAL1_0x4C3F1D00[0]_2021-04-19_15-26-57.log');
  dbms_logmnr.start_logmnr(options=>2128,STARTTIME=>TO_DATE('2021-04-19 14:13:18','YYYY-MM-DD HH24:MI:SS') , ENDTIME=>TO_DATE('2021-04-19 14:16:01','YYYY-MM-DD HH24:MI:SS'));
end;
/

5、结语

​ 达梦数据库使用DBMS_LOGMNR包进行日志分析在操作上与Oracle相同,也能较好的对归档日志文件进行分析。与Oracle还存在一些区别,目前达梦数据库还无法使用DBMS_LOGMNR分析REDO日志。达梦数据库DBMS_LOGMNR包分析后V$LOGMNR_CONTENTS中SQL_UNDO目前暂不支持,没有直接可执行的回退SQL。

​ 期待达梦数据库越来越完善。
更多资讯请上达梦技术社区了解:https://eco.dameng.com

更多推荐