1

我有一个连接到 Oracle 数据库的 Django 程序。在我的settings.py文件中,我有这个配置:

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.oracle',
    'NAME': 'xe',
    'USER': 'MY_USER_NAME',
    'PASSWORD': 'abcdefghijklmnopqrstuvwxyz',
    'HOST': 'db_server.example.com',
    'PORT': '1234',
  }
}

尝试加载网站时收到一个奇怪的错误:

ORA-28547: connection to server failed, probable Oracle Net admin error

经过进一步调查,我嗅探了网络服务器和数据库服务器之间的 TCP 流量。我在网络通讯中发现了这段文字,我为这篇文章重新格式化了:

(DESCRIPTION=
    (ADDRESS=
        (PROTOCOL=TCP)
        (HOST=1.2.3.4)
        (PORT=1234)
    )
    (CONNECT_DATA=
        (SID=xe)
        (CID=
            (PROGRAM=httpd@webserver_hostname)
            (HOST=webserver_hostname)
            (USER=apache)
        )
    )
)

所以我的问题是:为什么 Django 尝试使用与我指定的凭据不同的凭据连接到 Oracle 数据库?值得注意的是,它试图使用用户“apache”而不是“MY_USER_NAME”。数据库主机 IP、端口和 SID 都是正确的,并且是我指定的。它似乎只是用户名不同。

(作为旁注,我想密码是在登录过程的后期单独传输的?)

4

1 回答 1

1

安装完整的 Oracle 客户端(使用管理员工具)似乎已经解决了这个问题。不过,有一些细微差别需要注意:

wsgi.py 需要 ORACLE_HOME 的位置,因为它不是从 shell 传入的。就我而言,这wsgi.py看起来像:

import os, sys
sys.path.append('/var/www/')
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
os.environ['ORACLE_HOME'] = '/client/oracle/product/11.2.0/db'
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

在 Oracle 11.2.0 客户端中,库链接存在错误。要修复 Oracle 库链接:

  1. 导航到 $ORACLE_HOME/lib(在我的例子中是 /client/oracle/product/11.2.0/db/lib/)
  2. 删除文件 libexpat.so.1
  3. 作为用户 oracle:创建符号链接:libexpat.so.1 --> libexpat.so.1.5.2

此外,正确设置 Linux 加载程序也很重要。(注意:这相当于设置 LD_LIBRARY_PATH,但我认为以下是更清洁的解决方案)。创建一个包含Oracle Home路径/etc/ld.so.conf.d/oracle.conf的单行条目的文件。在我的情况下,它是. 然后运行。要验证加载程序是否正确配置,您可以检查 cx_Oracle 的共享对象路径:/client/oracle/product/11.2.0/db/libldconfig

查找文件:作为超级用户,执行updatedb,然后locate cx_Oracle.so | grep cx_Oracle\.so$

要测试文件:ldd <path>

输出应与此类似(如下)。如果您看到短语“未找到”,则说明加载程序路径有问题。

# ldd /usr/lib/python2.7/site-packages/cx_Oracle.so
    linux-gate.so.1 =>  (0xb775c000)
    libclntsh.so.11.1 => /client/oracle/product/11.2.0/db/lib/libclntsh.so.11.1 (0xb5a25000)
    libpython2.7.so.1.0 => /usr/lib/libpython2.7.so.1.0 (0xb588e000)
    libpthread.so.0 => /lib/libpthread.so.0 (0xb5873000)
    libc.so.6 => /lib/libc.so.6 (0xb56c2000)
    libnnz11.so => /client/oracle/product/11.2.0/db/lib/libnnz11.so (0xb5474000)
    libdl.so.2 => /lib/libdl.so.2 (0xb546f000)
    libm.so.6 => /lib/libm.so.6 (0xb5444000)
    libnsl.so.1 => /lib/libnsl.so.1 (0xb5429000)
    libaio.so.1 => /lib/libaio.so.1 (0xb5427000)
    libutil.so.1 => /lib/libutil.so.1 (0xb5422000)
    /lib/ld-linux.so.2 (0x487b9000)

为方便起见,您可能还希望/etc/profile.d/oracle.sh使用这些内容创建文件(注意,将 ORACLE_HOME 更改为您的特定安装路径):

export ORACLE_HOME=/client/oracle/product/11.2.0/db
export PATH=$PATH:$ORACLE_HOME/bin

重启使这些全局环境变量生效。

之后,Oracle 连接应该可以在任何情况下工作。我希望这些信息可以帮助其他在 Oracle 方面遇到问题的人!

于 2013-01-29T17:51:38.900 回答