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',
  }
}

Web サイトを読み込もうとすると、奇妙なエラーが発生しました。

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=
            (PROGRAM=httpd@webserver_hostname)
            (HOST=webserver_hostname)
            (USER=apache)
        )
    )
)

私の質問は、なぜ Django が指定した資格情報とは異なる資格情報で Oracle データベースに接続しようとしているのかということです。特に、「MY_USER_NAME」の代わりにユーザー「apache」を使用しようとしています。データベース ホストの IP、ポート、および SID は正しく、指定したものです。ユーザー名が違うだけのようです。

(ちなみに、パスワードはログインプロセスの後半で個別に送信されると思いますか?)

4

1 に答える 1

1

(管理者ツールを使用して)完全なOracleクライアントをインストールすると、問題が解決したようです。ただし、注意が必要なニュアンスがいくつかあります。

wsgi.py シェルから渡されないため、ORACLE_HOMEの場所が必要です。私の場合、これは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を設定するのと同じですが、以下の方がよりクリーンな解決策だと思います)。OracleHomeライブラリパス/etc/ld.so.conf.d/oracle.confへの1行のエントリでファイルを作成します。私の場合、それはです。次に、を実行します。ローダーが正しく構成されていることを確認するには、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 に答える