在 Ubuntu 18.04 集群上安装 NetSuite 64 位 ODBC 驱动程序出现错误:- 无法打开 lib '/opt/netsuite/odbcclient/lib64/ivoa27.so

问题描述 投票:0回答:2

已经围绕这个问题运行了 2-3 天,但没有成功。希望有人指导我并帮助解决这个问题。

我正在 3 节点 Ubuntu 18.04 集群环境中的 /home/admin/app/example.py 目录中运行 Python 应用程序,该环境应该通过 ODBC 连接到 NetSuite 并读取表列表。所有 3 个节点的代码和目录设置都是相同的。有一个负载均衡器将请求路由到所有这 3 个节点。

以下是如何通过 PyODBC 模块进行连接的示例:

import pyodbc
cnxn = pyodbc.connect('DSN=NetSuite;UID=user;PWD=pass'.format(dsn, uid, pwd), autocommit=True)
        cursor=cnxn.cursor()
        tables_list = []
        for row in cursor.tables():
            tables_list.append(row.table_name)
print (tables_list)

但是,在集群上运行 python 应用程序时,我总是收到错误:- Can't open lib '/opt/netsuite/odbcclient/lib64/ivoa27.so;即使驱动程序文件、其所有依赖项(通过 ldd 命令)和所有路径变量(即 $LD_LIBRARY_PATH、$ODBCINI 和 $OASDK_ODBC_HOME)存在,并且设置为在系统范围内可用(在 /etc/environment 文件下添加),如下所示所有 3 个节点:

PYTHON_APP_HOME=/home/admin/app/
LD_LIBRARY_PATH="/opt/netsuite/odbcclient/lib64"
ODBCINI="/opt/netsuite/odbcclient/odbc64.ini"
OASDK_ODBC_HOME="/opt/netsuite/odbcclient/lib64"

这是驱动程序依赖项的“ldd”命令的输出:

-rwxr-xr-x 1 root root  3277375 Jul 25 16:03 ivoa27.so

/opt/netsuite/odbcclient/lib64$ ldd /opt/netsuite/odbcclient/lib64/ivoa27.so
        linux-vdso.so.1 (0x00007fff401a2000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fee1d589000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fee1d385000)
        libicuuc.so.42 => /opt/netsuite/odbcclient/lib64/libicuuc.so.42 (0x00007fee1d12b000)
        libicudata.so.42 => /opt/netsuite/odbcclient/lib64/libicudata.so.42 (0x00007fee1c0e6000)
        libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007fee1bed8000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fee1bcb9000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fee1b930000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fee1b592000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fee1b37a000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fee1af89000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fee1db3c000)
        libaudit.so.1 => /lib/x86_64-linux-gnu/libaudit.so.1 (0x00007fee1ad60000)
        libcap-ng.so.0 => /lib/x86_64-linux-gnu/libcap-ng.so.0 (0x00007fee1ab5b000)

以下是如何按照 Netsuite 驱动程序 README.txt 说明执行这些步骤,并且在 Ubuntu 18.04 操作系统上的所有 3 个节点上以类似方式设置 ODBC 驱动程序。

  1. Netsuite 64 位 Linux 驱动程序文件/文件夹解压并复制到以下位置: $cd /opt/netsuite/odbcclient/*。整个目录、子目录和其中的文件都具有 r+x 权限。
  2. 已安装的库$sudo apt install unixodbc && apt-get install unixodbc-dev
  3. 从 dir /opt/netsuite/odbcclient:- $source oaodbc64.sh 执行 Netsuite 提供的脚本/命令(因为它是 bash shell)。这设置了与上面所示相同的变量。
  4. 从同一目录/文件夹运行以下命令将其注册为系统范围的驱动程序:

$sudo odbcinst -i -d -f /opt/netsuite/odbcclient/odbcinst.ini

返回的消息为:

odbcinst:已安装驱动程序。使用次数增加至 1。 目标目录是/etc
odbcinst:驱动程序已安装。使用次数增加至 1。 目标目录是/etc

  1. 然后运行以下命令也将其安装为系统 DSN:-

$sudo odbcinst -i -s -l -f /opt/netsuite/odbcclient/odbc64.ini

此后,检查创建/注册 odbc.ini 和 odbcinst.ini 文件的 /etc 目录。两个 *.ini 文件也都被授予执行权限。

-rwxr-xr-x 1 root root 500 Jul 24 10:31 odbc.ini
-rwxr-xr-x 1 root root 199 Jul 24 10:31 odbcinst.ini

$odbcinst -j
unixODBC 2.3.4
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

$odbcinst -q -d
[ODBC Drivers]
[NetSuite ODBC Drivers 8.1]

$odbcinst -q -s
[NetSuite]
[ODBC]

我还可以通过 isql 从每个单独的节点进行连接,也可以通过本地 python shell 运行 example.py。

$isql -v 'NetSuite' '用户' '通行证'

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

但是当在集群上运行相同的内容时,它总是给出相同的错误。请帮忙。我肯定错过了一些东西。

这是 /etc 目录中 odbc.ini 和 odbcinst.ini 文件的输出:

/etc$ more odbcinst.ini
[ODBC Drivers]
NetSuite ODBC Drivers 8.1=Installed
UsageCount=1

[NetSuite ODBC Drivers 8.1]
APILevel=1
ConnectFunctions=YYN
Driver=ivoa27.so
DriverODBCVer=03.52
FileUsage=0
SQLLevel=1
UsageCount=1

/etc$ more odbc.ini
[ODBC Data Sources]
NetSuite=NetSuite ODBC Drivers 8.1

[NetSuite]
Driver=/opt/netsuite/odbcclient/lib64/ivoa27.so
Description=Connect to your NetSuite account
Host=XXXXX.connect.api.netsuite.com
Port=1708
ServerDataSource=NetSuite.com
Encrypted=1
Truststore=/opt/netsuite/odbcclient/cert/ca3.cer
CustomProperties=AccountID=XXXXX;RoleID=XXXX

[ODBC]
Trace=0
IANAAppCodePage=4
TraceFile=odbctrace.out
TraceDll=/opt/netsuite/odbcclient/lib64/ddtrc27.so
InstallDir=/opt/netsuite/odbcclient

尝试了以下其他不起作用的方法:

  1. 在 .profile、.bashrc 、/etc/profile、/etc/bash.bashrc 中添加了除 /etc/environment 之外的 ODBC 变量路径。
  2. 将 /lib64/ 文件夹及其中的所有文件和 /etc 下的 *.ini 文件的所有者从 root 更改为 admin。
  3. 通过创建符号链接: sudo ln -s /etc/odbcinst.ini /usr/local/etc/odbcinst.ini sudo ln -s /etc/odbc.ini /usr/local/etc/odbc.ini

谢谢!!

driver netsuite ubuntu-18.04 pyodbc unixodbc
2个回答
2
投票

更新 - 已解决!!我们最后遗漏的一个重要步骤是重新启动/重新启动所有节点,以便这 3 个变量在添加到 /etc/environment 文件后在系统范围内生效(s).

为了进行调查,我们在代码中打印了以下附加内容,以确保它确实是 64 位平台/架构、驱动程序和数据源已注册并列出。然而,变量仍然显示空白/无。这验证了虽然变量路径是在从各个节点运行时在本地设置/有效的。但是,当从外部/通过远程会话运行时,变量值没有应用。

import os
import pyodbc
import platform

print(platform.architecture())
print (pyodbc.drivers())
print(pyodbc.dataSources())
print(os.environ["LD_LIBRARY_PATH"])
print(os.environ["ODBCINI"])
print(os.environ["OASDK_ODBC_HOME"])

重启前:

[2020-07-27 18:46:51,948] {logging_mixin.py:112} INFO - ('64bit', 'ELF')
[2020-07-27 18:46:51,949] {logging_mixin.py:112} INFO - ['ODBC Drivers', 'NetSuite ODBC Drivers 8.1']
[2020-07-27 18:46:51,950] {logging_mixin.py:112} INFO - {'NetSuite': '/opt/netsuite/odbcclient/lib64/ivoa27.so', 'ODBC': ''}
[2020-07-27 18:46:51,950] {logging_mixin.py:112} INFO - Error: 'LD_LIBRARY_PATH'

重启后:

[2020-07-28 06:11:59,961] {logging_mixin.py:112} INFO - ('64bit', 'ELF')
[2020-07-28 06:11:59,963] {logging_mixin.py:112} INFO - ['ODBC Drivers', 'NetSuite ODBC Drivers 8.1']
[2020-07-28 06:11:59,965] {logging_mixin.py:112} INFO - {'NetSuite': '/opt/netsuite/odbcclient/lib64/ivoa27.so', 'ODBC': ''}
[2020-07-28 06:11:59,965] {logging_mixin.py:112} INFO - /opt/netsuite/odbcclient/lib64
[2020-07-28 06:11:59,965] {logging_mixin.py:112} INFO - /opt/netsuite/odbcclient/odbc64.ini
[2020-07-28 06:11:59,965] {logging_mixin.py:112} INFO - /opt/netsuite/odbcclient/lib64

0
投票

使用:sudo restart或重新启动系统

© www.soinside.com 2019 - 2024. All rights reserved.