最近测试odbc连接mysql数据库,结果遇到一个奇葩的错误,提示:[][unixODBC][DriverManager]Cantopenlib/soft/mysqlodbc8/lib/libmyodbc8a.so:filenotfound。下面来介绍一下排查和解决该问题的具体思路。#MySQL专栏#
已经成功安装mysqlconnector/ODBC(安装参考「MySQL专栏」MySQLConnector/ODBC下载及安装的具体方法)和unixODBC(安装参考「DM专栏」unixODBC下载及编译安装的最佳实践),在ODBC连接测试mysql数据库时报错“Cantopenlib/soft/mysqlodbc8/lib/libmyodbc8a.so:filenotfound”。但是实际核实该文件是存在的,经过不断排错,最终解决,参考方案如下。
核实该文件是否存在,权限是否正确ls-ls/soft/mysqlodbc8/lib/libmyodbc8a.so,来核验报错的文件是否存在,同时核实文件的权限及属主属组是否正确,通过archive版本安装的可能会存在这一问题。个人环境的确存在这个问题,通过chownroot:root/soft/mysqlodbc8-R和chmod/soft/mysqlodbc8-R后,结果还是报该错误,说明还有其他原因。
核实unixODBC配置文件ODBC的配置文件主要包括odbcinst.ini和odbc.ini,主要是核实驱动的路径,以及驱动引用是否正确,包括配置文件的格式,有无空格等问题,按小编前面链接文章中配置的并无问题。
核实驱动文件动态链接库既然报错提示“Cantopenlib/soft/mysqlodbc8/lib/libmyodbc8a.so:filenotfound”,索性来看看libmyodbc8a.so的驱动文件的动态链接库是否正确。我们通过ldd/soft/mysqlodbc8/lib/libmyodbc8a.so查看,果然启动有一个驱动显示notfound。
[root
localhost~]#isql-vmysqldb_mysqldb_mysql[][unixODBC][DriverManager]Cantopenlib/soft/mysqlodbc8/lib/libmyodbc8a.so:filenotfound
[ISQL]ERROR:CouldnotSQLConnect
[root
localhost~]#ldd/soft/mysqlodbc8/lib/libmyodbc8a.solinux-vdso.so.1(0xffcd)
libodbcinst.so.2=notfound
libpthread.so.0=/usr/lib64/libpthread.so.0(0xf86a1ee)
librt.so.1=/usr/lib64/librt.so.1(0xf86a1cde)
libcrypto.so.1.1=/soft/mysqlodbc8/lib/private/libcrypto.so.1.1(0xf86ac)
libssl.so.1.1=/soft/mysqlodbc8/lib/private/libssl.so.1.1(0xf86ac)
libdl.so.2=/usr/lib64/libdl.so.2(0xf86a1398)
libresolv.so.2=/usr/lib64/libresolv.so.2(0xf86a1181)
libm.so.6=/usr/lib64/libm.so.6(0xf86a0dff)
libstdc++.so.6=/usr/lib64/libstdc++.so.6(0xf86a0a6a)
libgcc_s.so.1=/usr/lib64/libgcc_s.so.1(0xf86a0852)
libc.so.6=/usr/lib64/libc.so.6(0xf86ae)
/lib64/ld-linux-x86-64.so.2(0xf86a2a9d)
查找notfound的libodbcinst.so.2驱动,find/-namelibodbcinst.so.2,的确不存在,但是libodbcinst.so的驱动是存在的,位置在odbc安装路径中。
[root
localhost~]#find/-namelibodbcinst.so.2[root
localhost~]#find/-namelibodbcinst.so/soft/dmsetup/unixODBC-2.3.0/odbcinst/.libs/libodbcinst.so
/soft/odbc/lib/libodbcinst.so
在确认/soft/odbc/lib在动态链接库的环境变量中后,我们通过ln-s命令创建一个软链接。命令为:ln-s/soft/odbc/lib/libodbcinst.so/soft/odbc/lib/libodbcinst.so.2
创建后重新ldd查看驱动,无notfound的项。
[root
localhost~]#ldd/soft/mysqlodbc8/lib/libmyodbc8a.solinux-vdso.so.1(0xfff3c5b3)
libodbcinst.so.2=/soft/odbc/lib/libodbcinst.so.2(0xfadeb)
libpthread.so.0=/usr/lib64/libpthread.so.0(0xfabcb)
librt.so.1=/usr/lib64/librt.so.1(0xfa9c2)
libcrypto.so.1.1=/soft/mysqlodbc8/lib/private/libcrypto.so.1.1(0xfa510)
libssl.so.1.1=/soft/mysqlodbc8/lib/private/libssl.so.1.1(0xfa280)
libdl.so.2=/usr/lib64/libdl.so.2(0xfa07c)
libresolv.so.2=/usr/lib64/libresolv.so.2(0xf9e65)
libm.so.6=/usr/lib64/libm.so.6(0xf9ae3)
libstdc++.so.6=/usr/lib64/libstdc++.so.6(0xf974e)
libgcc_s.so.1=/usr/lib64/libgcc_s.so.1(0xf9536)
libc.so.6=/usr/lib64/libc.so.6(0xf9172)
/lib64/ld-linux-x86-64.so.2(0xfb99a)
再次测试登录,成功。
[root
localhost~]#isql-vmysqldb_mysqldb_mysql+---------------------------------------+
Connected!
sql-statement
help[tablename]
quit
+---------------------------------------+
以上就是个人关于odbc链接mysql数据库报错“[][unixODBC][DriverManager]Cantopenlib/soft/mysqlodbc8/lib/libmyodbc8a.so:filenotfound”的解决思路和方案。