PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

ERREUR :impossible d'accéder au fichier "$libdir/plpython2" - ERREUR :impossible d'accéder au fichier "$libdir/plpython3"

Erreur ci-dessus décrite sur l'envoi de PG car elle échoue à CREATE LANGUAGE plpython2u/plpython3u sur PG9.3Beta.

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

Avant de faire une étude sur les erreurs ci-dessus, j'ai lu ci-dessous le lien de documentation PG sur la façon dont PostgreSQL permet de créer le langage plpython et comment ils doivent être configurés.

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

Il est clair d'après le lien ci-dessus que vous devez compiler le binaire deux fois si vous avez besoin à la fois de plpython2u et de plpython3u. AFAIK, ActivePython 2.7.x pour plpython2u et 3.2.x pour plpython3u peuvent être configurés sur PG 9.2.x sans aucune difficulté, mais je n'ai jamais essayé sur PG 9.3Beta2. Donc, considéré pour essayer et analyser l'erreur sur pourquoi et comment elle pourrait être réparée, j'ai d'abord commencé l'installation de la source en définissant le chemin de base avec ActivePython 3.2. (Lien de téléchargement 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

La compilation a échoué et a affiché une erreur dans le fichier Config.log sous la forme :

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'

Dans la documentation PG, nous avons des instructions claires sur l'erreur ci-dessus et pourquoi cela se produit, plpython sera une bibliothèque partagée sur la plupart des plates-formes, mais sur certaines plates-formes, nous devons forcer spécifiquement le compilateur en tant que python à partir de la bibliothèque partagée. Pour cela, vous pouvez procéder à /src/pl/python/Makefile pour les modifications ou indiquer spécifiquement "shared_libpython=yes" lors de la compilation.

La compilation des sources examine deux fichiers lorsque vous utilisez –with-python qui sont « python » et « python-config ». Bien que j'aie ActivePython-3.2 dans mon chemin de base, le compilateur ne parvient toujours pas à les trouver "python" et "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

C'est parce que, dans ActivePython 3.2, les noms de fichiers seront "python" en tant que "python3" et "python-config" en tant que "python3-config". Le compilateur pointe donc vers l'ancien au lieu du nouveau. À ce stade, Asif Naeem (Merci pour votre perspicacité) de notre noyau Dev. L'équipe m'a notifié de simuler les fichiers ActivePython-3.2 existants en tant que python &python-config. C'est presque comme un hack de sa part, alors j'ai dupliqué ces fichiers comme suit :

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

Ok, maintenant je peux voir cela dans mon chemin de base.

[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

J'ai recompilé la source PG en utilisant -with-python après les modifications et en forçant également le compilateur à choisir SHARED_LIBPYTHON en utilisant "shared_libpython".

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

Ces étapes compileront efficacement PG9.3Beta avec les bibliothèques ActivePython-3.2. Créons maintenant le langage 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.
!>
!>

Oups, c'est étrange, pourquoi il s'est écrasé maintenant. Dans ce genre de situation, $PGDATA/pg_log sont vos amis pour avoir un aperçu du problème. Voici les informations du journal du serveur de base de données sur le plantage :

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

D'accord. J'ai oublié de définir les chemins python, c'est très important lorsque vous travaillez avec des langages python ou perl sur votre base de données.
J'ai défini PYTHONHOME, PYTHONPATH &LD_LIBRARY_PATH avant de démarrer le cluster.

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

Nice…Il a créé plpython3u avec ActivePython-3.2.

Si vous voulez également plpython2u sur la même installation. Ne modifiez pas comme nous l'avons fait pour ActivePython-3.2, ayez simplement une copie d'ActivePython-2.7 et placez-la dans le chemin de base et recompilez la source.

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

Les commentaires et les corrections sont les bienvenus.