Ubuntu22.04局域网下Python oracledb 连接远程服务器 Oracle 11g(内含docker环境下 的oracledb)

测试环境的python 连接
Windows 里ipconfig 一下查服务器的IP

我的地址是在这里,F:\app\dell\product\11.2.0\dbhome_1\NETWORK\ADMIN
默认一般是在这里,C:\oracle\product\11.2.0\dbhome_1\network\admin\listener.ora
# listener.ora Network Configuration File: F:\app\dell\product\11.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = F:\app\dell\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:F:\app\dell\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.19.130.21)(PORT = 1521))
)
)
ADR_BASE_LISTENER = F:\app\dell
添加本机局域网的ip(ADDRESS = (PROTOCOL = TCP)(HOST = 10.19.130.21)(PORT = 1521)
顺便再把默认的localhost给改称0.0.0.0,怕会绑定本机:(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)
lsnrctl start 开启服务,最好以管理员身份启动(win+r,输入cmd,然后ctrl+shift+enter启动或者找到cmd鼠标右键点击管理员身份启动)。


lsnrctl services 查询services name

对于oracle11g,因为11g版本过老,我们还需要下载一个instantclient_11_2来远程连接oracle服务器,
这样oracledb才能顺利和服务器oracle通讯。这是链接https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
,下载前要注册,不注册的话,后台找我。

下载如图所示的版本。
下载后解压到根目录 ,也可以用命令,如下:
mkdir -p /home/z/instantclient_11_2 cd /home/z/instantclient_11_2 unzip ~/Downloads/instantclient-basic-linux.x64-11.2.0.4.0.zip
instantclient_11_2 目录 里有libclntsh.so.11.1,但没有libclntsh.so 符号链接。缺少一个关键的符号链接,会导致 Python 无法找到它。
执行以下命令:
运行:
ldd /home/z/instantclient_11_2/libclntsh.so
✅ 如果输出正常(没有 not found),说明一切正常。
❌ 如果缺少依赖,请安装:
sudo apt update sudo apt install libaio1
再就是修改环境变量 ,打开~/.bashrc
nano ~/.bashrc
在文件末添加以下内容
export LD_LIBRARY_PATH=/home/z/instantclient_11_2:$LD_LIBRARY_PATH export ORACLE_HOME=/home/z/instantclient_11_2 export PATH=/home/z/instantclient_11_2:$PATH
按 Ctrl + X → Y → Enter 保存并退出,然后运行:
source ~/.bashrc
这样,以后每次打开终端,环境变量都会自动生效。
import oracledb oracledb.init_oracle_client(lib_dir="/home/z/instantclient_11_2") dsn = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.19.130.21)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl.168.100.112)))" try: with oracledb.connect(user="system", password="Liyang20030518", dsn=dsn) as connection: print("✅ Successfully connected to Oracle database!") with connection.cursor() as cursor: cursor.execute("SELECT sysdate FROM dual") result = cursor.fetchone() print("🕒 Current Database Time:", result[0]) except oracledb.DatabaseError as e: print("❌ Database Connection Failed:", e)
HOST改成oracle服务器的ip,
SERVICE_NAME改成查询到的service name
user是数据库的登录名,password是密码
接下来就是见证时刻的奇迹!
运行
python /home/z/PycharmProjects/AutoGrasp/modules/remote_link_oracle_test4.py

测试环境的docker下
之前在home下解压了instantclient_11_2,还建立了libclntsh.so的 软链接,我们省事,直接terminal cd 到 ~/下,把它复制到docker里。
ls -l ~/instantclient_11_2
看下它在不在。
在,然后把文件夹复制到docker容器里
docker cp ~/instantclient_11_2 maxkb:/opt/
如果没有权限(permission denied while trying to connect to the Docker daemon),加上sudo
sudo docker cp ~/instantclient_11_2 maxkb:/opt/
在docker 里看看在不在
docker exec -it maxkb ls -l /opt/instantclient_11_2
然后进入docker container
sudo docker exec -it maxkb bash
在docker container 里 设置好路径,并source 一下
export LD_LIBRARY_PATH=/opt/instantclient_11_2:$LD_LIBRARY_PATH echo 'export LD_LIBRARY_PATH=/opt/instantclient_11_2:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc
运行以下命令确保 /tmp 可写:
chmod 1777 /tmp
再把libaio1的包给装一下
apt-get update
apt-get install -y libaio1
还有oracledb
pip install oracledb
在/opt 下建立一个python 测试文件
nano /opt/test_oracle.py
粘贴下面的东西
import oracledb
# Initialize Oracle client inside Docker
oracledb.init_oracle_client(lib_dir="/opt/instantclient_11_2")
# Define DSN
dsn = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.19.130.21)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl.168.100.112)))"
try:
with oracledb.connect(user="system", password="Liyang20030518", dsn=dsn) as connection:
print("✅ Successfully connected to Oracle database!")
with connection.cursor() as cursor:
cursor.execute("SELECT sysdate FROM dual")
result = cursor.fetchone()
print("🕒 Current Database Time:", result[0])
except oracledb.DatabaseError as e:
print("❌ Database Connection Failed:", e)
CTRL+X 退出,Y 保存,enter 确定
接下来看下结果
python /opt/test_oracle.py
成功

生产环境的docker 下

没有外网,我们用OpenSSH 在客户端和服务器之间传输文件。
下载好windows的OpenSSH,解压复制到C:\Program Files,再把C:\Program Files\OpenSSH-Win64添加到系统环境变量
通过管理员启动PowerShell,进入到C:\Program Files\OpenSSH-Win64,执行如下命令
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
在服务中找到OpenSSH SSH Server,并选择启动类型为自动,并启动服务。
启动cmd 输入 ssh 本系统登录的用户名@127.0.0.1 ,弹出输入密码则成功。
然后我门就可以用scp传文件给目标服务器
scp -r C:\Users\你的用户名\Desktop\instantclient_11_2 root@000.000.000.000:/root/
在服务器上确认文件已传输
ls -l /root/
找到 maxkb 容器 ID
docker ps
将 instantclient_11_2 复制到 maxkb 容器
docker cp /root/instantclient_11_2 容器ID:/opt/
进入 maxkb 容器并验证
docker exec -it 容器ID bash
然后在容器内部运行:ls -l /opt/
看看有没有复制进去
由于是内网,就不能自动下载libaio1包了,我们需要手动下载复制到服务器里去。
首先检查 Docker 容器的 OS 版本
docker exec -it 容器ID cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)" NAME="Debian GNU/Linux" VERSION_ID="11" ID=debian
是 Debian version
我们上https://packages.ubuntu.com/focal/libaio1,下载 libaio1_0.3.112-3_amd64.deb。
如果我们有联网的ubuntu也可以用如下命令下载更为快捷
wget http://ftp.debian.org/debian/pool/main/liba/libaio/libaio1_0.3.112-3_amd64.deb -O ~/libaio1_0.3.112-3_amd64.deb
然后再用scp传到服务器,再在服务器里copy到docker 容器里。
在容器里安装 libaio1
dpkg -i /root/libaio1_0.3.112-3_amd64.deb
验证 libaio1 是否安装成功
ldd /opt/instantclient_11_2/sqlplus
如果 libaio.so 没有 not found,说明 libaio1 已成功安装
安装好libaio1,接着我们就可以像在测试环境里一样ln libclntsh.so 的 软链接了。
本文来自博客园,作者:z_s_s,转载请注明原文链接:https://www.cnblogs.com/zhoushusheng/p/18777368

浙公网安备 33010602011771号