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
コメントと訂正は大歓迎です。