2013-01-24 80 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問題的人!