AWS Glue用python-oracledb连OracleDB时libnnz21.so找不到问题求助
解决AWS Glue中python-oracledb thick模式找不到libnnz21.so的思路
1. 确认环境变量的生效时机与路径准确性
- 必须在调用
init_oracle_client前完成LD_LIBRARY_PATH和ORACLE_HOME的设置,且路径要指向解压后即时客户端的完整lib目录(比如/tmp/instantclient_21_13,而非父目录)。 - 不要仅依赖
os.environ修改,补充调用os.putenv确保环境变量能被后续的C扩展模块识别:
import os import boto3 import zipfile # 下载并解压Oracle即时客户端 s3 = boto3.client('s3') s3.download_file('your-bucket-name', 'instantclient-basic-linux.x64-21.13.0.0.0.zip', '/tmp/instantclient.zip') with zipfile.ZipFile('/tmp/instantclient.zip', 'r') as zip_ref: zip_ref.extractall('/tmp') instant_client_dir = '/tmp/instantclient_21_13' # 设置环境变量 os.environ['ORACLE_HOME'] = instant_client_dir os.environ['LD_LIBRARY_PATH'] = f"{instant_client_dir}:{os.environ.get('LD_LIBRARY_PATH', '')}" os.putenv('LD_LIBRARY_PATH', os.environ['LD_LIBRARY_PATH']) # 初始化客户端 import oracledb oracledb.init_oracle_client(lib_dir=instant_client_dir)
2. 验证客户端版本与Glue架构匹配
确保下载的是64位Linux版本的Oracle即时客户端(Glue运行在64位Amazon Linux环境),可通过以下命令验证:
file /tmp/instantclient_21_13/libnnz21.so
输出需包含ELF 64-bit LSB shared object,否则说明版本不匹配。
3. 修复目录与文件权限
即使脚本检测到文件存在,Glue执行角色可能存在隐性访问限制,解压后强制修改权限:
import subprocess subprocess.run(['chmod', '-R', '755', instant_client_dir], check=True)
同时避免将客户端解压到/tmp下的多层嵌套目录,尽量使用一级目录减少路径解析问题。
4. 显式指定lib_dir参数初始化
调用init_oracle_client时直接传入lib_dir参数,绕过环境变量的自动识别逻辑:
oracledb.init_oracle_client(lib_dir='/tmp/instantclient_21_13')
5. 检查依赖库完整性
使用ldd命令检查libnnz21.so的依赖项是否缺失:
ldd /tmp/instantclient_21_13/libnnz21.so
若存在缺失的系统库,需确认Glue基础环境是否包含该库,或把对应依赖库打包到S3并一同解压到/tmp目录。
6. 切换Glue版本验证
如果使用Glue 3.0(Python 3.7),尝试切换到Glue 4.0(Python 3.9)环境,部分库兼容性问题可能在更高版本中解决。
内容的提问来源于stack exchange,提问作者powerofthunder
相关产品推荐
相关产品推荐

