sql >> Databasteknik >  >> RDS >> PostgreSQL

FEL:kunde inte komma åt filen "$libdir/plpython2" - FEL:kunde inte komma åt filen "$libdir/plpython3"

Ovanstående fel beskrivs på PG-utskick eftersom det inte lyckas SKAPA SPRÅK plpython2u/plpython3u på 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

Innan jag studerade ovanstående fel läste jag nedan PG-dokumentationslänk om hur PostgreSQL tillåter att skapa språk-plpython och hur de ska konfigureras.

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

Det är tydligt från länken ovan att du måste kompilera binären två gånger om du behöver både plpython2u och plpython3u. AFAIK, ActivePython 2.7.x för plpython2u och 3.2.x för plpython3u kan konfigureras på PG 9.2.x utan några svårigheter, men jag har aldrig provat PG 9.3Beta2. Så, övervägde att ge ett försök och analysera felet om varför och hur det kunde repareras, började jag först källinstallationen genom att ställa in bassökvägen med ActivePython 3.2. (Hämtningslänk för 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

Kompileringen misslyckades och visade fel i filen Config.log som:

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'

I PG-dokumentationen har vi tydliga instruktioner om ovanstående fel och varför det händer, plpython kommer att vara ett delat bibliotek på de flesta plattformarna, men på vissa plattformar måste vi specifikt tvinga kompilatorn som python från delat bibliotek. För det kan du antingen fortsätta till /src/pl/python/Makefile för ändringar eller specifikt ange "shared_libpython=yes" under kompileringen.

Källkompilering undersöker efter två filer när du använder -with-python som är "python" och "python-config". Även om jag har ActivePython-3.2 i min bassökväg, kan kompilatorn fortfarande inte hitta dem "python" och "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

Det beror på att filnamnen i ActivePython 3.2 kommer att vara "python" som "python3" och "python-config" som "python3-config", därför pekade kompilatorn på den gamla istället för den nya. Vid det här laget, Asif Naeem (Tack för din insikt) från vår kärnutvecklare. Team meddelade mig att håna befintliga ActivePython-3.2-filer som python &python-config. Det är nästan som ett hack från honom, så jag duplicerade dessa filer som:

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

Ok, nu kan jag se det i min grundväg.

[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

Jag kompilerade om PG-källa med –with-python efter ändringarna och tvingade även kompilatorn att välja SHARED_LIBPYTHON med “shared_libpython”.

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

Dessa steg kommer effektivt att kompilera PG9.3Beta med ActivePython-3.2-bibliotek. Låt oss nu skapa språk 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.
!>
!>

Oj, det här är konstigt, varför det har kraschat nu.. I denna typ av situation är $PGDATA/pg_log dina vänner för att få insikt om problemet. Här är databasserverns logginformation om krasch:

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. Jag missade att ställa in python-sökvägar, detta är mycket viktigt när du arbetar med python- eller perl-språk i din databas.
Jag har ställt in PYTHONHOME, PYTHONPATH &LD_LIBRARY_PATH innan du startar klustret.

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

Trevligt ... Det har skapat plpython3u med ActivePython-3.2.

Om du vill ha plpython2u också på samma installation. Justera inte som vi gjorde för ActivePython-3.2, bara ha en kopia av ActivePython-2.7 och ställ in den i bassökvägen och kompilera om källan.

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

Kommentarer och korrigeringar är välkomna.


  1. Hur får man senast infognings-id i Oracle med MyBatis?

  2. Kompilera PL/Proxy med PostgresPlus Advance Server 9.1

  3. Dubbel kolon (::) notation i SQL

  4. SQL-fel ORA-01722:ogiltigt nummer