2013-01-24 50 views
1

我有一个连接到Oracle数据库的Django程序。在我settings.py文件我有这样的配置:Django和错误的Oracle连接凭据

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

经过进一步调查,我闻了闻Web服务器之间的TCP流量数据库服务器。我发现这段文字在网络通信,这是我重新格式化为这个职位:

(DESCRIPTION= 
    (ADDRESS= 
     (PROTOCOL=TCP) 
     (HOST=1.2.3.4) 
     (PORT=1234) 
    ) 
    (CONNECT_DATA= 
     (SID=xe) 
     (CID= 
      ([email protected]_hostname) 
      (HOST=webserver_hostname) 
      (USER=apache) 
     ) 
    ) 
) 

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

(作为一个方面说明,我想密码在日志的过程以后的部分分开传输?)

+0

这并没有(尽管'USER'选择不好)意味着应用程序试图以数据库用户'apache'登录。如果问题是一个不正确的用户名被传入,你会得到一个非常不同的错误。您是否试图连接到本地计算机上的Oracle XE数据库?或者在远程机器上?你可以在Django应用程序运行的同一台机器上使用SQL * Plus进行连接吗? –

+0

@JustinCave,我从Web服务器连接到远程机器。我在Web服务器上安装了SQL Developer,并能够成功连接到数据库。 –

+0

您确定您指定的主机和端口与您在SQL Developer中指定的连接相同吗?特别是,该端口几乎总是1521.您是否知道在这种情况下,Django是使用瘦JDBC驱动程序进行连接还是使用Oracle客户端库?我对文档的读(似乎很快)似乎暗示它正在使用Oracle客户端而不是瘦JDBC驱动程序。您可以使用SQL * Plus连接到远程数据库吗? –

回答

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,但我认为以下是更清晰的解决方案)。创建一个文件/etc/ld.so.conf.d/oracle.conf,其中包含一个到Oracle主页路径的单个行条目。在我的情况下,它是/client/oracle/product/11.2.0/db/lib。然后运行ldconfig。要验证是否正确配置加载器可以检查共享对象路径为cx_Oracle:

要查找的文件:超级用户身份,执行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问题的人!