官方ARM64版Instant Client仅支持19c及以后版本,须从https://download.oracle.com/otn_software/linux/instantclient/instantclient-basic-linux-arm64.zip下载,搭配sqlplus、sdk包使用;解压后保持原目录名,通过LD_LIBRARY_PATH精确指向含aarch64架构libclntsh.so的完整路径,避免DPI-1047等加载错误。
直接下载官方ARM64版Instant Client压缩包
arm架构(aarch64)的linux系统不能用x86_64或i386的oracle客户端,必须用oracle官方发布的instantclient-basic-linux-arm64.zip等对应包。官网明确只提供19c及以后版本的arm64支持,11g/12c/18c等旧版无arm二进制。
正确做法是访问:https://download.oracle.com/otn_software/linux/instantclient/instantclient-basic-linux-arm64.zip(注意不是通用x86页面);若需sqlplus或SDK,同步下载instantclient-sqlplus-linux-arm64.zip和instantclient-sdk-linux.arm64-*.zip。
常见错误:误用instantclient-basic-linux.x64-*.zip——解压后执行file instantclient_*/libclntsh.so.*会显示“ELF 64-bit LSB pie executable, x86-64”,直接导致ImportError: libclntsh.so.xx: cannot open shared object file。
解压后必须保留instantclient_*目录名,不能重命名
很多教程说要把instantclient_19_22改成client64或cilent,这是x86历史遗留的误导。ARM版Instant Client不依赖固定目录名,cx_Oracle或oracledb通过LD_LIBRARY_PATH定位so文件,而非硬编码路径。
所以解压后保持原目录结构即可,例如:
unzip instantclient-basic-linux-arm64.zip ls -d instantclient_*
若手动重命名(如mv instantclient_19_22 oracle_client),又没同步更新LD_LIBRARY_PATH,就会触发cx_Oracle.DatabaseError: DPI-1047错误(“Cannot locate a 64-bit Oracle Client library”)。
LD_LIBRARY_PATH必须包含完整路径,且优先级高于/etc/ld.so.conf.d/
ARM环境里,ldconfig默认不扫描/usr/lib/oracle这类非标准路径,靠/etc/ld.so.conf.d/oracle.conf加路径往往无效。最可靠方式是显式设置LD_LIBRARY_PATH:
- 确认解压路径,比如
/opt/oracle/instantclient_19_22 - 在
~/.bashrc末尾添加:export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_22:$LD_LIBRARY_PATH - 执行
source ~/.bashrc,再验证:echo $LD_LIBRARY_PATH应包含该路径 - 关键检查:
ls /opt/oracle/instantclient_19_22/libclntsh.so.*必须存在,且file输出含“aarch64”
漏掉$LD_LIBRARY_PATH拼接、或路径末尾多加斜杠(如/opt/oracle/instantclient_19_22/),都可能导致库加载失败。
Python连接前务必验证libclntsh.so可被动态链接器识别
设置完环境变量后,别急着跑Python代码。先用系统命令确认链接器能“看见”它:
ldd $(python3 -c "import cx_Oracle; print(cx_Oracle.__file__)") | grep clntsh —— 应输出类似libclntsh.so.19.1 => /opt/oracle/instantclient_19_22/libclntsh.so.19.1 (0x...)
如果显示not found,说明LD_LIBRARY_PATH未生效,或Python进程启动时该变量未继承(比如用systemd服务、IDE内置终端、或sudo执行时丢失环境)。此时应改用env LD_LIBRARY_PATH=... python3 your_script.py临时验证。
另外,cx_Oracle要求Oracle客户端主版本号 ≥ 数据库版本号。连Oracle 11g R2,必须用19c客户端(19 ≥ 11),但不能用21c或23c(部分旧数据库不兼容新客户端协议)——这点在ARM上尤其容易忽略,因为只有19c+有ARM二进制。











