Ubuntu 18.04 클러스터에 NetSuite 64비트 ODBC 드라이버를 설치하면 다음 오류가 발생합니다. - lib '/opt/netsuite/odbcclient/lib64/ivoa27.so를 열 수 없습니다.

Ubuntu 18.04 클러스터에 NetSuite 64비트 ODBC 드라이버를 설치하면 다음 오류가 발생합니다. - lib '/opt/netsuite/odbcclient/lib64/ivoa27.so를 열 수 없습니다.

이 문제를 해결하기 위해 2~3일 동안 이리저리 돌아다녀도 성공하지 못했습니다. 누군가 나를 안내하고 이 문제를 해결하는 데 도움을 줄 수 있기를 바랍니다.

저는 ODBC를 통해 NetSuite에 연결하고 테이블 목록을 읽어야 하는 3노드 Ubuntu 18.04 클러스터 환경의 /home/admin/app/example.py 디렉터리에서 Python 애플리케이션을 실행하고 있습니다. 코드와 디렉터리 설정은 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 애플리케이션을 실행할 때 항상 오류가 발생합니다.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 설치 unixodbc-dev
  3. /opt/netsuite/odbcclient 디렉토리에서 Netsuite가 제공하는 스크립트/명령을 실행합니다:-$ 소스 oaodbc64.sh(bash 쉘이기 때문에). 그러면 위에 표시된 것과 동일한 변수가 설정됩니다.
  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 셸을 통해 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 파일의 소유자를 루트에서 관리자로 변경합니다.
  3. 다음 방법으로 심볼릭 링크를 만듭니다. sudo ln -s /etc/odbcinst.ini /usr/local/etc/odbcinst.ini sudo ln -s /etc/odbc.ini /usr/local/etc/odbc.ini

감사해요! !

답변1

업데이트 - 해결되었습니다!우리가 놓친 중요한 단계 중 하나는모든 노드 재시작/재부팅이 3개 변수를 /etc/environment 파일에 추가하여 시스템 전체에 적용되도록 합니다.

조사를 위해 코드에 다음과 같은 추가 콘텐츠를 인쇄하여 실제로 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

관련 정보