1. 问题描述
本地windows进行达梦logminer日志分析正常,部署到线上环境通过kafka-connect进行操作后报错
java.lang.UnsatisfiedLinkError: /app/data/kafka/kafka_2.13-3.4.0/dmlib/bin/libdmlogmnr_client.so: libdmdpi.so: cannot open shared object file: No such file or directory
at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2445)
at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2501)
at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2700)
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2662)
at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:830)
at java.base/java.lang.System.loadLibrary(System.java:1873)
该问题通过网上资料查询就是动态文件未正常获取到,所以我进行了系统环境变量的配置
export LD_LIBRARY_PATH=/your_oath/dm/bin:$LD_LIBRARY_PATH
,一般来说到这里就解决问题了,但是程序运行依旧报错,我反复在排查文件读写权限以及进程运行权限、环境变量是否配置成功的情况;有以上问题大家也可以排查,但是我确定了我的文件都是开放所有用户,环境变量也配置成功了;
2. 解决方式、
通过配置环境变量、检查文件权限、检验.so文件完整性依旧没发现问题,最后在kafka-connect的bin目录下connect-distributed.sh文件中,增加配置
export LD_LIBRARY_PATH=/app/data/kafka/kafka_2.13-3.4.0/dmlib/bin:$LD_LIBRARY_PATH
运行成功;一开始其实也百度到了这个配置,但是它是这么配置的:
JAVA_TOOL_OPTIONS=-Djava.library.path=达梦bin路径
作为java运行参数去配,运行参数也确实配进去了但是并没有效果,运维大哥修改为以上后就成功了;
3. 总结
线上环境很费排查精力和时间,对自身能力还有很大考验,还得多多学习。准确定位到问题后逐个去排查,此次问题耗费三天才解决。有很多原因导致卡顿,比如上述配置第一步,在同事的电脑上直接就成功了,所以我才会一直想到底是为什么A服务器能生效B服务器不生效,反复去校验权限问题没有进展。
排查问题也要具备相关思路,报错是从下往上看,因为后者,导致的前者,比如因为此处的因为动态库文件加载出错,所以导致后面LogmnrDll的初始化报错;
附上问题部分截图,希望对大家有帮助,对了,达梦的归档日志分析,logmnr包所在的服务器,必须也是归档文件所在的服务器,否则logmnrDll.addFile()方法会报错。这个和oracle不一样。
学而不思则罔,思而不学则殆