注册
JAVA调用DM Logmnr进行归档日志分析方法
专栏/Database Thinking/ 文章详情 /

JAVA调用DM Logmnr进行归档日志分析方法

胡li 2022/04/11 2453 3 0
摘要 DM Logmnr是达梦数据库的日志分析工具,包括JNI接口和C接口,DM Logmnr JNI接口由位于DM安装目录的jar文件夹下com.dameng.logmnr.jar包提供,logmnr.jar包括LogmnrDll和LogmnrRecord两个类。LogmnrDll提供日志挖掘分析的所有接口,LogmnrRecord用于存放调用LogmnrDll日志分析后的结果数据(日志分析结果数据保存在LogmnrRecord的成员变量中)。LogmnrDll类定义的是静态方法,所有方法都可以直接通过类名方式调用。详细接口参数说明可参考《DM8程序员手册》。

步骤一:在使用 Logmnr 包中的接口之前,需要先开启两个日志相关参数:一是开启归档(设置INI 参数 ARCH_INI 为 1);二是开启在日志中记录逻辑操作的功能(设置 INI 参数RLOG_APPEND_LOGIC 为 1、2 或者 3)。

步骤二:在SYSDBA用户下创建t_testlogmnr表,插入表数据,并测试更新和删除和truncate操作,sql语句如下:

create table t_testlogmnr(id int,name varchar(50));
insert into t_testlogmnr values(1,'杨明');
insert into t_testlogmnr values(2,'达梦');
insert into t_testlogmnr values(3,'测试');
insert into t_testlogmnr values(4,'韩梅梅');
insert into t_testlogmnr values(5,'李四');
insert into t_testlogmnr values(6,'王五');
insert into t_testlogmnr values(7,'Jack');
update t_testlogmnr set id=id+10 where id<10;
delete t_testlogmnr where id in(11,12);
commit;
truncate table t_testlogmnr;

步骤三:更新归档

alter system ARCHIVE log current;

查看归档,此时查看V$ARCHIVED_LOG视图可获取最新归档日志(序列号最大的为最新归档日志),假设获取的最新归档日志为“F:\dmdbms_190Pack4\data\DAMENG\arch_local\ARCHIVE_LOCAL1_0x5D02A98E[0]_2021-06-24_15-56-09.log”

select sequence# seq, name , to_char(first_time,'yyyy-mm-dd hh24:mi:ss') first_time, to_char(next_time,'yyyy-mm-dd hh24:mi:ss') next_time, first_change# , next_change# from v$archived_log;

步骤四:在Eclipse界面将com.dameng.logmnr.jar包添加到程序中。在Eclipse工程中,右键工程选择【构建路径】->【配置构建路径】,打开JAVA构建配置页面,在“库(Library)”页签中,点击【添加外部JAR】,选择com.dameng.logmnr.jar包,并选择本地库位置(因Logmnr是JNI接口,运行时需调用达梦动态库dll文件,所以需要配置本地库路径,否则无法正常运行),点击【编辑】,填写达梦数据库(驱动)安装bin目录,依次点击【确定】。如下图所示。
https://blog.csdn.net/hu5350026/article/details/118198516
image.png

步骤五:在JAVA工程中新建TestLogmnr类,代码中指定需要分析的归档日志文件“F:\dmdbms_190Pack4\data\DAMENG\arch_local\ARCHIVE_LOCAL1_0x5D02A98E[0]_2021-06-24_15-56-09.log”,并将分析的归档日志结果数据输出至文件“F:\dmdbms_190Pack4\result.txt”中,每一行表示一个操作语句,不同属性用“|”分割,换行符为“回车换行”,代码参考如下。

package cn.com.test;

import java.io.File;
import java.io.FileOutputStream;
import com.dameng.logmnr.LogmnrDll;
import com.dameng.logmnr.LogmnrRecord;
public class dbmslog {
public static void main(String[] args) {
try
{
//初始化LOGMNR环境
LogmnrDll.initLogmnr(); 
//创建连接
long connid = LogmnrDll.createConnect("localhost", 5230, "SYSDBA",  "SYSDBA");
//添加归档日志文件
LogmnrDll.addLogFile(connid,"F:\\dmdbms_190Pack4\\data\\DAMENG\\arch_local\\ARCHIVE_LOCAL1_0x5D02A98E[0]_2021-06-24_15-56-09.log",3);
//启动日志分析
LogmnrDll.startLogmnr(connid, -1, null, null); 
//获取数据
LogmnrRecord[] arr = LogmnrDll.getData(connid, 100);
/*    将获取的归档日志信息输出至文件中      */
File file = new File("F:\\dmdbms_190Pack4\\result.txt");
FileOutputStream out = new FileOutputStream(file);
StringBuffer sb = new StringBuffer();
String lineendstr = "\r\n";//定义转换字符
String split = "|";//定义分隔符

//定义表头
sb.append("Xid|Operation|OperationCode|Scn|StartScn|CommitScn|Timestamp"
		+ "|SegOwner|TableName|RowId|Rbasqn|rsId|sqlRedo"+lineendstr);
System.out.println("日志分析结果打印:");
for (int i = 0; i < arr.length; i++) {
//if(arr[i].getTableName().equals("T_TESTLOGMNR")){
	sb.append(arr[i].getXid()+split);
	sb.append(arr[i].getOperationCode()+split);
	sb.append(arr[i].getOperation()+split);
	
	sb.append(arr[i].getScn()+split);
	sb.append(arr[i].getStartScn()+split);
	sb.append(arr[i].getCommitScn()+split);
	
	sb.append(arr[i].getTimestamp()+split);
	sb.append(arr[i].getSegOwner()+split);
	sb.append(arr[i].getTableName()+split);
	sb.append(arr[i].getRowId()+split);
	sb.append(arr[i].getRbasqn()+split);
	sb.append(arr[i].getRsId()+split);
	sb.append(arr[i].getSqlRedo()+lineendstr);
//}
}
System.out.println("结果打印完毕");
out.write(sb.toString().getBytes("GBK"));
out.flush();
out.close();
LogmnrDll.endLogmnr(connid, 0);
LogmnrDll.closeConnect(connid);
LogmnrDll.deinitLogmnr();
}catch (Exception e) {
	e.printStackTrace();
	}
	}
	}

运行后生成的本地文件如下:
image.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服