【问题标题】:Can't open lib '/opt/netsuite/odbcclient/lib64/ivoa27.so Unable to find odbc driver (Netsuite)无法打开 lib '/opt/netsuite/odbcclient/lib64/ivoa27.so 无法找到 odbc 驱动程序 (Netsuite)
【发布时间】:2020-12-12 06:45:58
【问题描述】:

我已经在 ubuntu 20.04、nginx、gunicron 上部署了 django 项目。部分代码无法在服务器上运行,报错

   ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 
   '/opt/netsuite/odbcclient/lib64/ivoa27.so' : file not found (0) (SQLDriverConnect)")

当文件可用时:-

xxxx@XXXXXX:/opt/netsuite/odbcclient/lib64$ ls
ddtrc27.so   ivmgan27.so   ivmghu27.so  ivoa27.so      libicudata.so.42  libivoa27m.so   
libodbc.so   openssl810.so
ivldap27.so  ivmgapi27.so  ivoa27.ini   libddicu27.so  libicuuc.so.42    libodbcinst.so  
odbccurs.so

在本地服务器上运行良好。甚至在服务器终端中。但是在域 url 上启动 nginx、gunicron 服务后会出错。其他一切工作正常。 以下输出来自服务器终端

```xxxxx@xxxxcc:~$ python3
Python 3.8.5 (default, Jul 28 2020, 12:59:40) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyodbc
>>> host = 'xxxxx'
>>> uid = "xxxxx"
>>> role_id = 'xxxxx'
>>> pwd = "xxxxx"
>>> account_id = "xxxxx"
>>> pyodbc.connect('DRIVER={NetSuite};Host='+host+';Port=1708;Encrypted=1;Truststore=/opt/netsuite/odbcclient/cert/ca3.cer;SDSN=NetSuite.com;UID='+uid+';PWD='+pwd+';CustomProperties=AccountID='+account_id+';RoleID='+role_id+'')
<pyodbc.Connection object at 0x7f920414e2d0>
>>> 
```

在 django 项目中使用了相同的代码,在启动 nginx、gunicorn 服务后检查域(URL)时出错。

我尝试使用 ```odbcinst -j`` 检查可用的驱动程序,驱动程序可用。对目录和 /opt/netsuite/ 中的所有内部文件给予 +777 权限。 创建符号链接,导出到 .bash_proifile、.bash_rc、/etc/environment 的路径。我尽我所能在互联网上找到,但我仍然无法解决问题。

odbcinst -j 的输出:-

```xxxxxx@xxxxxx:~$ odbcinst -j
unixODBC 2.3.7
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /opt/netsuite/odbcclient/odbc64.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
```

我发现一些线程表明 ubuntu 20.04 已删除 /etc/securetty,这可能会导致 SSH/FTP 上的 PAM 失败。我检查过 Ubuntu 20.04 没有 /etc/securetty 文件。

这是 env 的输出:-

```SHELL=/bin/bash
PWD=XXXXXXX
LOGNAME=xxxxx
XDG_SESSION_TYPE=tty
MOTD_SHOWN=pam
HOME=/home/xxxxxx
LANG=en_US.UTF-8
OASDK_ODBC_HOME=/opt/netsuite/odbcclient/lib64
SSH_CONNECTION=XXXXXXXXXXXX
ODBCINI=/opt/netsuite/odbcclient/odbc64.ini
XDG_SESSION_CLASS=user
TERM=xterm-256color
USER=xxxxxx
SHLVL=1
XDG_SESSION_ID=7
LD_LIBRARY_PATH=/opt/netsuite/odbcclient/lib64:/opt/netsuite/odbcclient/lib64
XDG_RUNTIME_DIR=/run/user/1000
SSH_CLIENT=XXXXXXXXXXXX
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/mssql-tools/bin:/opt/netsuite/odbcclient/lib64/:/opt/mssql-tools/bin:/opt/netsuite/odbcclient/lib64/
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
SSH_TTY=/dev/pts/3
_=/usr/bin/env
```

我也有 Mysql ODBC,它工作正常。

ldd /opt/netsuite/odbcclient/lib64/ivoa27.so的输出是:-

librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fd2292cd000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fd2292c7000)
libicuuc.so.42 => /opt/netsuite/odbcclient/lib64/libicuuc.so.42 (0x00007fd22906d000)
libicudata.so.42 => /opt/netsuite/odbcclient/lib64/libicudata.so.42 (0x00007fd228028000)
libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007fd228016000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd227ff3000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fd227e10000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd227cc1000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd227ca6000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd227ab4000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd22968d000)
libaudit.so.1 => /lib/x86_64-linux-gnu/libaudit.so.1 (0x00007fd227a88000)
libcap-ng.so.0 => /lib/x86_64-linux-gnu/libcap-ng.so.0 (0x00007fd227a7e000)```

【问题讨论】:

  • 你在重启 Ubuntu 服务器后尝试过一次吗?
  • 是的。我已经重新启动了服务器,但它仍然给出了同样的错误。您想让更多文件或命令的输出看起来更清晰吗?
  • 我相信您可以使用 Ubuntu CLI $isql -v 'NetSuite' 'user' 'pass' 中的此命令通过 iSQL 实用程序进行连接,其中 NetSuite 是 DSN 名称?另外,您是否将这些 odbc*.ini 文件复制到 /etc/ 目录 (/etc$ ls -lt odbc*.ini) 下?另一个重要的考虑因素是检查和运行命令:- $source oaodbc[64].sh 或 $source oaodbc[64].csh 在脚本文件 oaodbc[64].sh/oaodbc[64].csh 上。如果尚未完成,则选择应取决于您首选的 shell(sh 或 csh)。
  • 还可以尝试通过运行以下命令将驱动程序注册到系统范围的 ODBC 驱动程序存储库中:- $odbcinst -i -d -f /opt/netsuite/odbcclient/odbcinst.ini。
  • @ultron 你找到解决方案了吗?

标签: python django odbc netsuite gunicorn


【解决方案1】:

这通常意味着共享对象的依赖加载失败。您可以使用ldd 进行测试,例如

ldd /opt/netsuite/odbcclient/lib64/ivoa27.so

这将告诉您在尝试加载共享对象文件时哪些文件无法解析。您可以通过修改 LD_LIBRARY_PATH 环境变量以包含您的网络套件共享对象的 /path/to/ 来解决此问题(我认为在您的情况下这将是 /opt/netsuite/odbcclient/lib64)。

祝你好运!

【讨论】:

  • 在运行上述命令时,所有依赖项都在加载。并且 LD_LIBRARY_PATH 环境变量已经包含 /opt/netsuite/odbcclient/lib64 ,正如您在原始问题中看到的那样。任何更多的建议将不胜感激。
  • 我没有看到 ldd 的输出,你能重新发布一下吗?
  • 我已经附加了问题,你能检查一下吗?
  • 我将 LD_LIBRARY_PATH 设置为 /opt/netsuite/odbcclient/lib64。在运行 ldd ivoa27.so 之后,对于某些共享库,我仍然“找不到”。有没有办法手动添加路径?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 2018-12-08
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
相关资源
最近更新 更多