步骤一:在使用 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
步骤五:在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();
}
}
}
运行后生成的本地文件如下:
文章
阅读量
获赞