sql >> Database >  >> RDS >> PostgreSQL

FOUT:kon het bestand "$libdir/plpython2" niet openen - FOUT:kon het bestand "$libdir/plpython3" niet openen

Bovenstaande fout beschreven op PG-mailing omdat het geen TAAL plpython2u/plpython3u CREERT op 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

Voordat ik wat onderzoek doe naar bovenstaande fouten, lees ik de onderstaande PG-documentatielink over hoe PostgreSQL het toestaat om langage plpython te maken en hoe ze moeten worden geconfigureerd.

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

Het is duidelijk uit de bovenstaande link dat je het binaire bestand twee keer moet compileren als je zowel plpython2u als plpython3u nodig hebt. AFAIK, ActivePython 2.7.x voor plpython2u en 3.2.x voor plpython3u kunnen probleemloos op PG 9.2.x worden geconfigureerd, maar ik heb PG 9.3Beta2 nooit geprobeerd. Dus, overwogen om een ​​poging te wagen en de fout te analyseren over waarom en hoe het gerepareerd zou kunnen worden, begon ik eerst met de broninstallatie door het basispad in te stellen met ActivePython 3.2. (ActivePython-downloadlink 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

Compilatie is mislukt en vertoonde een fout in het Config.log-bestand als:

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 PG-documentatie hebben we duidelijke aanwijzingen over de bovenstaande fout en waarom het gebeurt, plpython zal op de meeste platforms een gedeelde bibliotheek zijn, maar op sommige platforms moeten we de compiler specifiek als python uit de gedeelde bibliotheek forceren. Daarvoor kun je ofwel doorgaan naar /src/pl/python/Makefile voor wijzigingen of specifiek "shared_libpython=yes" aangeven tijdens het compileren.

Broncompilatie zoekt naar twee bestanden wanneer u -with-python gebruikt die "python" &"python-config" zijn. Hoewel ik ActivePython-3.2 in mijn basispad heb, kan de compiler ze nog steeds niet vinden "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

Het is omdat in ActivePython 3.2 bestandsnamen "python" als "python3" en "python-config" als "python3-config" zijn, daarom wees de compiler naar de oude in plaats van naar de nieuwe. Op dit punt, Asif Naeem (Bedankt voor uw inzicht) van onze kernontwikkelaar. Team liet me weten om bestaande ActivePython-3.2-bestanden te bespotten als python &python-config. Het lijkt bijna op een hack van hem, dus ik dupliceerde die bestanden als:

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

Ok, nu kan ik dat zien in mijn basispad.

[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

Ik heb de PG-bron opnieuw gecompileerd met -with-python na de wijzigingen en ook de compiler gedwongen om SHARED_LIBPYTHON te kiezen met behulp van "shared_libpython".

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

Met deze stappen wordt PG9.3Beta effectief gecompileerd met ActivePython-3.2-bibliotheken. Laten we nu taal plpython3u maken:

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

Oeps, dit is vreemd, waarom het nu is gecrasht.. In dit soort situaties zijn $PGDATA/pg_log je vrienden om inzicht te krijgen in het probleem. Hier is de loggegevens van de databaseserver over crash:

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. Ik heb gemist om python-paden in te stellen, dit is erg belangrijk wanneer je met python- of perl-talen in je database werkt.
Ik heb PYTHONHOME, PYTHONPATH &LD_LIBRARY_PATH ingesteld voordat ik het cluster start.

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

Leuk...Het heeft plpython3u gemaakt met ActivePython-3.2.

Als u plpython2u ook op dezelfde installatie wilt. Pas het niet aan zoals we deden voor ActivePython-3.2, neem gewoon een kopie van ActivePython-2.7 en plaats het in het basispad en compileer de broncode opnieuw.

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

Opmerkingen en correcties zijn zeer welkom.


  1. Hoe u uw MySQL-versie kunt controleren

  2. Een array invoegen in een enkele door MySQL voorbereide instructie met PHP en PDO

  3. Heb geen databasevergrendeling! op android

  4. Uw database exporteren voor overdracht