PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

FEHLER:Zugriff auf Datei „$libdir/plpython2“ nicht möglich – FEHLER:Zugriff auf Datei „$libdir/plpython3“ nicht möglich

Oben beschriebener Fehler bei PG-Mailing, da es nicht möglich ist, LANGUAGE plpython2u/plpython3u auf PG9.3Beta zu erstellen.

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

Bevor ich mich mit den oben genannten Fehlern befasse, lese ich den Link zur PG-Dokumentation darüber, wie PostgreSQL das Erstellen von Sprachplpython zulässt und wie sie konfiguriert werden sollten.

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

Aus dem obigen Link geht hervor, dass Sie die Binärdatei zweimal kompilieren müssen, wenn Sie sowohl plpython2u als auch plpython3u benötigen. AFAIK, ActivePython 2.7.x für plpython2u und 3.2.x für plpython3u können problemlos auf PG 9.2.x konfiguriert werden, aber ich habe PG 9.3Beta2 nie ausprobiert. Also überlegte ich, einen Versuch zu unternehmen und den Fehler zu analysieren, warum und wie er repariert werden könnte, und begann zunächst mit der Quellinstallation, indem ich den Basispfad mit ActivePython 3.2 festlegte. (ActivePython-Download-Link 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

Die Kompilierung ist fehlgeschlagen und es wurde ein Fehler in der Datei Config.log wie folgt angezeigt:

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'

In der PG-Dokumentation haben wir klare Anweisungen zum obigen Fehler und warum es passiert, plpython wird auf den meisten Plattformen eine gemeinsam genutzte Bibliothek sein, aber auf einigen Plattformen müssen wir den Compiler ausdrücklich als Python aus der gemeinsam genutzten Bibliothek erzwingen. Dazu können Sie entweder zu /src/pl/python/Makefile gehen, um Änderungen vorzunehmen, oder beim Kompilieren ausdrücklich „shared_libpython=yes“ angeben.

Die Quellkompilierung sucht nach zwei Dateien, wenn Sie –with-python verwenden, die „python“ &„python-config“ sind. Obwohl ich ActivePython-3.2 in meinem Basispfad habe, findet der Compiler sie immer noch nicht „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

Das liegt daran, dass in ActivePython 3.2 die Dateinamen „python“ als „python3“ und „python-config“ als „python3-config“ lauten, daher zeigte der Compiler auf den alten anstatt auf den neuen. An dieser Stelle, Asif Naeem (Vielen Dank für Ihren Einblick) von unserem Core Dev. Das Team hat mich benachrichtigt, vorhandene ActivePython-3.2-Dateien als python &python-config zu verspotten. Es ist fast wie ein Hack von ihm, also habe ich diese Dateien dupliziert als:

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

Ok, jetzt kann ich das in meinem Basispfad sehen.

[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

Ich habe den PG-Quelltext mit –with-python nach den Änderungen neu kompiliert und auch den Compiler gezwungen, SHARED_LIBPYTHON mit „shared_libpython“ auszuwählen.

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

Diese Schritte kompilieren effektiv PG9.3Beta mit ActivePython-3.2-Bibliotheken. Lassen Sie uns nun die Sprache plpython3u erstellen:

-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.
!>
!>

Hoppla, das ist seltsam, warum es jetzt abgestürzt ist. In einer solchen Situation sind $PGDATA/pg_log Ihre Freunde, um Einblick in das Problem zu erhalten. Hier sind die Protokollinformationen des Datenbankservers zum Absturz:

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

In Ordnung. Ich habe es versäumt, Python-Pfade festzulegen. Dies ist sehr wichtig, wenn Sie mit Python- oder Perl-Sprachen in Ihrer Datenbank arbeiten.
Ich habe PYTHONHOME, PYTHONPATH &LD_LIBRARY_PATH festgelegt, bevor Sie den Cluster gestartet haben.

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

Schön… Es hat plpython3u mit ActivePython-3.2 erstellt.

Wenn Sie wollen, plpython2u auch auf der gleichen Installation. Passen Sie nicht an, wie wir es für ActivePython-3.2 getan haben, sondern haben Sie einfach eine Kopie von ActivePython-2.7 und setzen Sie es in den Basispfad und kompilieren Sie die Quelle neu.

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

Kommentare und Korrekturen sind sehr willkommen.