sql >> データベース >  >> RDS >> PostgreSQL

エラー:ファイル「$ libdir / plpython2」にアクセスできませんでした–エラー:ファイル「$ libdir/plpython3」にアクセスできませんでした

    PG9.3Betaで言語plpython2u/plpython3uを作成できないため、PGメーリングで説明されている上記のエラー。

    Error:
    postgres=# create language plpython3u;
    ERROR: could not access file "$libdir/plpython3": No such file or directory

    postgres=# create language plpython2u;
    ERROR: could not access file "$libdir/plpython2": No such file or directory

    上記のエラーについて調査する前に、PostgreSQLが言語plpythonの作成を許可する方法と、それらを構成する方法について、以下のPGドキュメントリンクを読みました。

    http://www.postgresql.org/docs/9.3/static/plpython-python23.html

    上記のリンクから明らかなように、plpython2uとplpython3uの両方が必要な場合は、バイナリを2回コンパイルする必要があります。 AFAIK、plpython2uのActivePython 2.7.xおよびplpython3uの3.2.xは、PG 9.2.xで問題なく構成できますが、PG9.3Beta2を試したことはありません。そこで、修復の理由と方法に関するエラーを試して分析することを検討しました。まず、ActivePython3.2でベースパスを設定してソースのインストールを開始しました。 (ActivePythonダウンロードリンクhttp://www.activestate.com/activepython/downloads)

    [root@localhost postgresql-9.3beta1]# export PATH=/opt/ActivePython-3.2/bin:$PATH
    [root@localhost postgresql-9.3beta1]# ./configure --prefix=/usr/local/pg93b --with-python

    コンパイルが失敗し、Config.logファイルに次のようなエラーが表示されました:

    make[3]: Entering directory `/usr/local/src/postgresql-9.3beta1/src/pl/plpython'
    *** Cannot build PL/Python because libpython is not a shared library.
    *** You might have to rebuild your Python installation. Refer to
    make[3]: Leaving directory `/usr/local/src/postgresql-9.3beta1/src/pl/plpython'
    を離れます

    PGのドキュメントには、上記のエラーとその発生理由に関する明確な指示があります。plpythonはほとんどのプラットフォームで共有ライブラリになりますが、一部のプラットフォームでは、コンパイラを共有ライブラリからpythonとして強制する必要があります。そのためには、変更のために/ src / pl / python / Makefileに進むか、コンパイル中に「shared_libpython=yes」と具体的に述べることができます。

    ソースコンパイルでは、「python」と「python-config」の–with-pythonを使用するときに2つのファイルを調べます。ベースパスにActivePython-3.2がありますが、それでもコンパイラはそれらを「python」と「python-conifg」で見つけることができません

    [root@localhost postgresql-9.3beta1]# which python
    /usr/local/bin/python
    [root@localhost postgresql-9.3beta1]# which python-config
    /usr/local/bin/python-config

    これは、ActivePython 3.2では、ファイル名が「python」として「python3」、「python-config」が「python3-config」になるため、コンパイラが新しいものではなく古いものを指しているためです。この時点で、 Asif Naeem (洞察に感謝します)私たちのコア開発者から。チームは、既存のActivePython-3.2ファイルをpython&python-configとしてモックするように通知しました。それは彼からのハックのようなものなので、私はそれらのファイルを次のように複製しました:

    cd /opt/ActivePython-3.2/bin
    cp python3-config python-config
    cp python3 python

    さて、これでベースパスにそれが表示されます。

    [root@localhost postgresql-9.3beta1]# export PATH=/opt/ActivePython-3.2/bin:$PATH
    [root@localhost postgresql-9.3beta1]# which python
    /opt/ActivePython-3.2/bin/python
    [root@localhost postgresql-9.3beta1]# which python-config
    /opt/ActivePython-3.2/bin/python-config

    変更後に–with-pythonを使用してPGソースを再コンパイルし、コンパイラに「shared_libpython」を使用してSHARED_LIBPYTHONを選択させました。

    ./configure --prefix=/usr/local/pg93b3 --with-python
    make shared_libpython=yes
    make shared_libpython=yes install

    これらの手順は、ActivePython-3.2ライブラリを使用してPG9.3Betaを効果的にコンパイルします。次に、言語plpython3uを作成しましょう:

    -bash-4.1$ psql -p 4444
    psql (9.3beta1)
    Type "help" for help.

    postgres=# create language plpython3u;
    The connection to the server was lost. Attempting reset: Failed.
    !>
    !>

    おっと、これは奇妙なことです。なぜ今クラッシュしたのですか。このような状況では、$ PGDATA/pg_logが問題についての洞察を得る友達です。クラッシュに関するデータベースサーバーのログ情報は次のとおりです。

    2013-07-13 22:08:37 IST-31208-postgres-postgres :LOG: statement: create language plpython3u;
    Could not find platform independent libraries
    Could not find platform dependent libraries
    Consider setting $PYTHONHOME to [:]
    Fatal Python error: Py_Initialize: Unable to get the locale encoding

    Ok。 Pythonパスを設定できませんでした。これは、データベースでpythonまたはperl言語を使用している場合に非常に重要です。
    クラスターを開始する前に、PYTHONHOME、PYTHONPATH、LD_LIBRARY_PATHを設定しました。

    export PYTHONHOME=/opt/ActivePython-3.2/
    export PYTHONPATH=/opt/ActivePython-3.2/bin:$PATH
    export LD_LIBRARY_PATH=/opt/ActivePython-3.2/lib:$LD_LIBRARY_PATH

    /usr/local/pg93b3/bin/pg_ctl -D /usr/local/pg93b3/data/ start

    -bash-4.1$ psql -p 4444
    psql (9.3beta1)

    Type "help" for help.

    postgres=# create language plpython3u;
    CREATE LANGUAGE

    いいですね…ActivePython-3.2でplpython3uを作成しました。

    同じインストールでplpython2uも必要な場合。 ActivePython-3.2の場合のように微調整するのではなく、ActivePython-2.7のコピーを用意し、それをベースパスに設定して、ソースを再コンパイルするだけです。

    export PATH=/opt/ActivePython-2.7/bin:$PATH
    ./configure --prefix=/usr/local/pg93b2 --with-python
    make shared_libpython=yes
    make shared_libpython=yes install


    export PYTHONHOME=/opt/ActivePython-2.7/
    export PYTHONPATH=/opt/ActivePython-2.7/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/pg93b2/lib
    export LD_LIBRARY_PATH=/opt/ActivePython-2.7/lib:$LD_LIBRARY_PATH

    -bash-4.1$ ./psql -p 4444
    psql (9.3beta2)
    Type "help" for help.

    postgres=#
    postgres=# create language plpython2u;
    CREATE LANGUAGE

    コメントと訂正は大歓迎です。


    1. Oracle DATE列に格納されている無効な(破損した)値を識別する方法

    2. SQLの復元中にpsql無効なコマンド\N

    3. mycliを使用して、ターミナルでMariaDB/MySQLを快適に学習してください。

    4. SQL Server:テーブルの最大行数