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.