Fork me on GitHub

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 无法找到它。

执行以下命令:

 
cd /home/z/instantclient_11_2
ln -s libclntsh.so.11.1 libclntsh.so

这会创建 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 + XYEnter 保存并退出,然后运行:

 

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 的 软链接了。  





posted @ 2025-03-17 18:27  z_s_s  阅读(308)  评论(0)    收藏  举报