接口使用说明

Logmnr包是达梦数据库的日志分析工具,达梦提供了JNI接口和C接口,供应用程序直接调用。

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

9.1 JNI 接口

logmnr.jar包是达梦数据库的日志分析工具的JNI接口,供应用程序直接调用。

一般调用过程如下:

  1. 初始化LOGMNR环境;
  2. 创建一个分析日志的连接;
  3. 添加需要分析的日志文件;
  4. 启动日志文件分析;
  5. 获取完成分析的日志数据;
  6. 终止日志文件分析;
  7. 关闭当前连接;
  8. 销毁LOGMNR环境。

9.1.1 接口说明

logmnr.jar包括两个类:LogmnrDll和LogmnrRecord。logmnr.jar位于DM安装目录的jar文件夹下,例如:D:\dmdbms\jar\logmnr.jar。LogmnrDll中包含了所有功能接口;LogmnrRecord是日志分析结果数据的返回值对应的对象类型。

9.1.1.1 初始化环境

函数原型

int LogmnrDll.initLogmnr();

功能说明

初始化LOGMNR环境。

参数说明

无。

返回值

0:初始化成功;

< 0的值和异常:初始化失败。

9.1.1.2 创建连接

函数原型

long LogmnrDll.createConnect(String hostName, int port, String userName, String password);

功能说明

创建一个分析日志的连接。

参数说明

hostName:ip或主库名。

port:端口号。

userName:用户名。

password:密码。

返回值

创建的数据库连接标识ID。

9.1.1.3 添加日志文件

函数原型

int LogmnrDll.addLogFile(long connId, String logFileName, int option)

功能说明

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

参数说明

connId:数据库连接标识ID。

logFileName:需要分析的归档日志文件名(绝对路径)。

option:可选配置参数。包括以下值:

1:结束当前日志挖掘(隐式调用endLogmnr,以前添加的归档日志文件将被清除),并增加新的归档日志文件。
2:删除日志文件。
3:增加的归档日志文件名。

返回值

0:添加成功;

< 0的值和异常:添加失败。

注意事项

如果当前已经startLogmnr,则addLogFile将报错,如果需要添加新的日志文件,需要先调用endLogmnr结束当前日志分析后再添加文件。

9.1.1.4 移除日志文件

函数原型

int LogmnrDll.removeLogFile(long connId, String logFileName);

功能说明

移除指定的归档日志文件。

参数说明

connId:数据库连接标识ID。

logFileName:需要移除档日志文件名(绝对路径)。

返回值

0:移除成功;

< 0的值和异常:移除失败。

注意事项

同addLogFile一样,如果当前已经startLogmnr,则removeLogFile将报错,如果需要移除日志文件,需要先调用endLogmnr结束当前日志分析后再移除文件。

9.1.1.5 启动日志分析

函数原型

int LogmnrDll.startLogmnr(long connId, long trxid, String startTime, String endTime);

功能说明

启动当前会话的归档日志文件分析,对添加的归档日志文件进行日志分析。

参数说明

connId:数据库连接标识ID。

trxid:分析归档日志的事务id号,默认为-1,表示不区分事务号。

startTime:分析归档日志的起始时间,默认1988/1/1。

endTime:分析归档日志的结束时间,默认2110/12/31。

返回值

0:启动成功;

< 0的值和异常:启动失败。

9.1.1.6 获取数据

函数原型

LogmnrRecord[]LogmnrDll.getData(long connId, int rownum);

功能说明

获取日志文件分析结果数据。

参数说明

connId:数据库连接标识ID。

rownum:获取行数。

返回值

获取的logmnr记录,为LogmnrRecord对象数组。

9.1.1.6.1 LogmnrRecord对象说明

LogmnrRecord对象支持的成员变量如下表所示。获取和设置这些变量可以使用相应的“get+成员变量”和“set+成员变量”方法。

成员变量 类型 说明
scn long 当前记录的LSN
startScn long 当前事务的起始LSN
commitScn long 当前事务的截止LSN
timestamp String 当前记录的创建时间
startTimestamp String 当前事务的起始时间
commitTimestamp String 当前事务的截止时间
xid String 当前记录的事务ID号
operation String 操作类型包括start、insert、update、delete、commit、rollback等语句
operationCode String 操作类型。插入操作值为1,更新操作值为3,删除操作值为2,事务起始语句值为6,提交操作值为7,回滚操作值为36
rollBack int 当前记录是否被回滚(1是0否)
segOwner String 执行这条语句的用户名
tableName String 操作的表名
rowId String 对应记录的行号
rbasqn int 对应的归档日志文件号
rbablk int RBASQN所指日志文件的块号从0开始
rbabyte int RBABLK所指块号的块内偏移
dataObj int 对象ID号
dataObjv int 对象版本号
sqlRedo String 当前记录对应的sql语句
rsId Stirng 记录集ID
ssn int 连续sql标志。如果sql长度超过单个sql_redo字段能存储的长度,则sql会被截断成多个sql片段在结果集中“连续”返回
csf int 与SSN配合。最后一个片段的csf值为0,其余片段的值均为1。没因超长发生截断的sql该字段值均为0
status int 日志状态。默认为0

9.1.1.7 终止日志分析

函数原型

int LogmnrDll.endLogmnr(long connId, int option);

功能说明

终止当前会话的归档日志文件分析。

参数说明

connId:数据库连接标识ID。

options:可选模式如下:

0:清除当前会话的归档日志文件分析环境,再次分析时需要重新add_logfile。

1:保留当前会话的归档日志文件分析环境,不需要重新add_logfile。

返回值

0:终止成功;

< 0的值和异常:终止失败。

9.1.1.8 关闭连接

函数原型

int LogmnrDll.closeConnect(long connId);

功能说明

关闭当前连接,清理字典缓存等。

参数说明

connId:数据库连接标识ID。

返回值

0:关闭成功;

< 0的值和异常:关闭失败。

9.1.1.9 销毁环境

函数原型

boolean LogmnrDll.deinitLogmnr();

功能说明

销毁LOGMNR环境。

参数说明

无。

返回值

0:添加销毁;

< 0的值和异常:销毁失败。

9.1.1.10 设置属性

函数原型

int LogmnrDll.setAttr(long connId, int attr, int attr_value)

功能说明

设置属性。

有如下属性可以配置:

LogmnrDll.LOGMNR_ATTR_PARALLEL_NUM:并行线程数,有效值(2,16);

LogmnrDll.LOGMNR_ATTR_BUFFER_NUM:任务缓存节点数,有效值(8,1024);

LogmnrDll.LOGMNR_ATTR_CONTENT_NUM:结果缓存节点数,有效值(256, 2048);

LOGMNR_ATTR_TRX_END:是否查找事务结束记录,默认为1,取值0或1;

LOGMNR_ATTR_TRX_WAIT_TIME:查找事务结束记录的最大等待时间,默认60s,取值范围(0,600),设置成0表示死等,只有LOGMNR_ATTR_TRX_END为1时才有效。

参数说明

connId:数据库连接标识ID。

attr:属性名。

attr_value:属性值。

返回值

0:添加成功;

< 0的值和异常:添加失败。

9.1.2 编程实例

下面用一个例子来说明dmlogmnr接口的使用方法。

数据库安装在本机上,端口号为5236,用户名和密码均为SYSDBA。

开启两个日志相关参数:一是开启归档(设置INI参数ARCH_INI为1);二是开启在日志中记录逻辑操作的功能(设置INI参数RLOG_APPEND_LOGIC为1、2或者3)。

要分析的日志为D:\dmdata\arch\ARCHIVE_LOCAL1_20160704082303068.log。分析的结果放在D:\dmdata\result.txt中。其中logmnr.jar包放在DM数据库安装目录的jar文件夹下。

在项目中创建类名为dbmslob,代码实现如下:

import java.io.PrintStream;
import com.dameng.logmnr.LogmnrDll;
import com.dameng.logmnr.LogmnrRecord;
public class dbmslob {
	public static void main(String[] args) {
 	try
		{
			LogmnrDll.initLogmnr();
			long connid = LogmnrDll.createConnect("localhost", 5236, "SYSDBA",	"SYSDBA");		LogmnrDll.addLogFile(connid,"D:\\dmdata\\arch\\ARCHIVE_LOCAL1_20160704082303068.log",3);			 	LogmnrDll.startLogmnr(connid, -1, null, null);
			LogmnrRecord[] arr = LogmnrDll.getData(connid, 100);
			PrintStream ps = new PrintStream("D:\\dmdata\\result.txt");
	          System.setOut(ps);
	          System.out.println("日志分析结果打印:");
	          for (int i =  0; i < arr.length; i++) {
				System.out.println("-----------------------------" + i + "-----------------------------" + "\n");
				System.out.println("xid:" + arr[i].getXid() + "\n");
				System.out.println("operation:" + arr[i].getOperation() + "\n");
				System.out.println("sqlRedo:" + arr[i].getSqlRedo() + "\n");
				System.out.println("########################" + i + "########################" + "\n");
				System.out.println("scn:" + arr[i].getScn() + "\n");
				System.out.println("startScn:" + arr[i].getStartScn() + "\n");
				System.out.println("commitScn:" + arr[i].getCommitScn() + "\n");
				System.out.println("timestamp:" + arr[i].getTimestamp() + "\n");
				System.out.println("startTimestamp:" + arr[i].getStartTimestamp() + "\n");
				System.out.println("commitTimestamp:" + arr[i].getCommitTimestamp() + "\n");
				System.out.println("operationCode:" + arr[i].getOperationCode() + "\n");
				System.out.println("rollBack:" + arr[i].getRollBack() + "\n");
				System.out.println("segOwner:" + arr[i].getSegOwner() + "\n");
				System.out.println("tableName:" + arr[i].getTableName() + "\n");
				System.out.println("rowId:" + arr[i].getRowId() + "\n");
				System.out.println("rbasqn:" + arr[i].getRbasqn() + "\n");
				System.out.println("rbablk:" + arr[i].getRbablk() + "\n");
				System.out.println("rbabyte:" + arr[i].getRbabyte() + "\n");
				System.out.println("dataObj:" + arr[i].getDataObj() + "\n");
				System.out.println("dataObjv:" + arr[i].getDataObjv() + "\n");
				System.out.println("//dataObjd:" + arr[i].getDataObjd() + "\n");
				System.out.println("rsId:" + arr[i].getRsId() + "\n");
				System.out.println("ssn:" + arr[i].getSsn() + "\n");
				System.out.println("csf:" + arr[i].getCsf() + "\n");
				System.out.println("status:" + arr[i].getStatus() + "\n");
				System.out.println("########################" + i + "########################" + "\n");
	      }  
	    	System.out.println("结果打印完毕");
		ps.flush();
	     ps.close();		  
		LogmnrDll.endLogmnr(connid, 1);
		LogmnrDll.deinitLogmnr();
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
}

分析的结果在D:\dmdata\result.txt中查看。

9.2 C接口

dmlogmnr_client.dll是达梦数据库的日志分析工具的C接口,供应用程序直接调用。dmlogmnr_client C接口依赖的动态链接库在DM安装目录\bin目录下,依赖的静态库dmlogmnr_client.lib在DM安装目录\include目录下,所需的头文件logmnr_client.h也在DM安装目录\include目录下。

应用程序员在调用接口时应注意接口参数为句柄指针时,应传入正确的结构指针,否则可能造成异常。

9.2.1 接口说明

9.2.1.1 初始化环境

函数原型

dmcode_t

logmnr_client_init();

参数说明

无。

功能说明

初始化LOGMNR环境。说明:初始化互斥量等。

返回值

0:成功;

<0:错误。

9.2.1.2 创建连接

函数原型

dmcode_t
logmnr_client_create_connect( 
	schar*			ip,
	usint			  port,
	schar*			uname,
	schar*			pwd,
	void**			conn
);

功能说明

创建一个分析日志的连接。

参数说明

ip: 输入参数,服务器IP;

port: 输入参数,端口号;

uname: 输入参数,用户名;

pwd: 输入参数,登录密码;

conn: 输出参数,连接句柄。

返回值

0:成功;

<0:错误。

9.2.1.3 增加日志文件

函数原型

dmcode_t
logmnr_client_add_logfile( 
	void*		conn,
	schar* 	logfilename,
	ulint		options
);

功能说明

增加需要分析的归档日志文件。

参数说明

conn: 连接句柄;

logfilename:需要分析的归档日志文件名(绝对路径);

options: 可选配置参数包括:

1:结束当前日志挖掘 (隐式调用endLogmnr,以前添加的归档日志文件将被清除),并增加新的归档日志文件。

2:删除日志文件。

3:增加的归档日志文件名。

说明:一旦startLogmnr,addLogFile可以继续添加文件,那么新添加的文件必须比之前添加的所有文件的创建时间都要晚。

返回值

0:成功;

<0:错误。

9.2.1.4 删除日志文件

函数原型

dmcode_t
logmnr_client_remove_logfile( 
	void*		  conn,
	schar*		logfilename
);

功能说明

移除某个需要分析的归档日志文件。

参数说明

conn: 连接句柄;

logfilename:待移除的归档日志文件名(绝对路径)。

说明:只有startLogmnr之前才能进行remove操作,否则会报错返回。

返回值

0:成功

<0:错误

9.2.1.5 启动日志分析

函数原型

dmcode_t
logmnr_client_start( 
	void*		  conn,
	lint64		trxid,
	schar*		starttime,
	schar*		endtime
);

功能说明

启动当前会话的归档日志文件分析,对ADD_LOGFILE添加的归档日志文件进行日志分析。

参数说明

conn: 连接句柄。

trxid: 分析归档日志的事务id号,默认为-1,表示不区分事务号。

starttime:分析归档日志的起始时间,默认1988/1/1。

endtime: 分析归档日志的结束时间,默认2110/12/31。

返回值

0:成功;

<0:错误。

9.2.1.6 获取信息

函数原型

dmcode_t
logmnr_client_get_data(
	void*									conn,
	lint									row_num,
	logmnr_content_t***		data,
	lint*			  					real_num
);

功能说明

获取数据

参数说明

conn: 输入参数,连接句柄;

rownum: 输入参数,获取行数;

data: 输出参数,返回数据;

real_num:输出参数,实际获取行数。

返回值

获取的logmnr记录。

9.2.1.7 终止日志分析

函数原型

dmcode_t
logmnr_client_end(
	void*		conn,
	ulint		options 
);

功能说明

终止当前会话的归档日志文件分析。

参数说明

conn:连接句柄;

options:可选模式如下:

0:清除当前会话的归档日志文件分析环境,再次分析时需要重新add_logfile。

1:保留当前会话的归档日志文件分析环境,不需要重新add_logfile

返回值

0:成功;

<0:错误。

9.2.1.8 结束连接

函数原型

dmcode_t
logmnr_client_close_connect(
	void*		conn
);

参数说明

conn:连接句柄。

功能说明

关闭当前连接。说明:会清理字典缓存等。

返回值

0:成功;

<0:错误。

9.2.1.9 销毁环境

函数原型

dmcode_t

logmnr_client_deinit();

功能说明

销毁LOGMNR环境。

参数说明

无。

返回值

0:成功;

<0:错误。

9.2.1.10 设置日志分析属性

函数原型

dmcode_t
logmnr_client_set_attr( 
    void*           conn,
    ulint           attr,
    void*           val,
    ulint           val_len
);

参数说明

conn:输入参数,连接句柄;

attr:输入参数,属性名称;

val:输入参数,属性attr的值;

val_len:输入参数,属性值val的长度。

功能说明

设置日志分析属性。

有如下属性可以设置:

LOGMNR_ATTR_PARALLEL_NUM:并行线程数,有效值(2,16);

LOGMNR_ATTR_BUFFER_NUM:任务缓存节点数,有效值(8,1024);

LOGMNR_ATTR_CONTENT_NUM:结果缓存节点数,有效值(256,2048);

LOGMNR_ATTR_TRX_END:是否查找事务结束记录,默认为1,取值0或1;

LOGMNR_ATTR_TRX_WAIT_TIME:查找事务结束记录的最大等待时间,默认60s,取值范围(0,600),设置成0表示死等,只有LOGMNR_ATTR_TRX_END为1时才有效。

返回值

0:成功;

<0:错误。

9.2.1.11 获取日志分析属性

函数原型

dmcode_t
logmnr_client_get_attr( 
    void*           conn,
    ulint           attr,
    void*           buf,
	  ulint			      buf_len,
    ulint*          val_len
);

参数说明

conn:输入参数,连接句柄;

attr:输入参数,属性名称;

buf:输出参数,属性attr的值;

buf_len:输入参数,属性值缓存buf的长度;

val_len:输出参数,属性值的实际长度(<=buf_len)。

功能说明

获取日志分析属性。

有如下属性可以获取:

LOGMNR_ATTR_PARALLEL_NUM :并行线程数,有效值(2,16);

LOGMNR_ATTR_BUFFER_NUM:任务缓存节点数,有效值(8,1024);

LOGMNR_ATTR_CONTENT_NUM:结果缓存节点数,有效值(256,2048);

LOGMNR_ATTR_CHAR_CODE:本地编码(只读);

LOGMNR_ATTR_TRX_END:是否查找事务结束记录,默认为1,取值0或1;

LOGMNR_ATTR_TRX_WAIT_TIME:查找事务结束记录的最大等待时间,默认60s,取值范围(0,600),设置成0表示死等,只有LOGMNR_ATTR_TRX_END为1时才有效。

返回值

0:成功;

<0:错误。

9.2.2 编程实例

数据库安装在本机上,端口号为5236,用户名和密码均为SYSDBA。

开启两个日志相关参数:一是开启归档(设置INI参数ARCH_INI为1);二是开启在日志中记录逻辑操作的功能(设置INI参数RLOG_APPEND_LOGIC为1、2或者3)。

##include <stdio.h>
##include <stdlib.h>
##include "logmnr_client.h"

void
main(int argc, schar* argv[])
{
	lint				rt;
	void*				conn;
	logmnr_content_t**	logmnr_contents;
	lint				real_num;
	ulint				char_code;

	rt = logmnr_client_init();
	if (rt < 0)
	{
		fprintf(stderr, "logmnr_client_init error");
		exit(-1);
	}

	rt = logmnr_client_create_connect("LOCALHOST", 5236, "SYSDBA", "SYSDBA", &conn);
	if (rt < 0)
	{
		fprintf(stderr, "logmnr_client_create_connect error");
		exit(-1);
	}

	//需要添加的文件名
	rt = logmnr_client_add_logfile(conn, "d:\\dmdata\\arch\\ARCHIVE_LOCAL1_20140725091059625.log", LOGMNR_ADDFILE);
   
	if (rt < 0)
	{
		fprintf(stderr, "logmnr_client_add_logfile error");
		exit(-1);
	}

	rt = logmnr_client_set_attr(conn, LOGMNR_ATTR_PARALLEL_NUM, (void*)2, 0);
	if (rt < 0)
	{
		fprintf(stderr, "logmnr_client_set_attr error");
		exit(-1);
	}

	rt = logmnr_client_start(conn, -1, NULL, NULL);
	if (rt < 0)
	{
		fprintf(stderr, "logmnr_client_start error");
		exit(-1);
	}

	rt = logmnr_client_get_attr(conn, LOGMNR_ATTR_CHAR_CODE, &char_code, 4, 0);
	if (rt < 0)
	{
		fprintf(stderr, "logmnr_client_set_attr error");
		exit(-1);
	}

	while(1)
	{
		rt = logmnr_client_get_data(conn, 6, &logmnr_contents, &real_num);
		if (rt < 0)
		{
			fprintf(stderr, "logmnr_client_get_data error");
			exit(-1);
		}
		if (real_num == 0)
			break;
	}

	rt = logmnr_client_end(conn, 0);
	if (rt < 0)
	{
		fprintf(stderr, "logmnr_client_end error");
		exit(-1);
	}

	rt = logmnr_client_close_connect(conn);
	if (rt < 0)
	{
		fprintf(stderr, "logmnr_client_close_connect error");
		exit(-1);
	}

	rt = logmnr_client_deinit();
	if (rt < 0)
	{
		fprintf(stderr, "logmnr_client_deinit error");
		exit(-1);
	}
} 
微信扫码
分享文档
扫一扫
联系客服