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
Преди да направя някакво проучване за горните грешки, прочетох по-долу връзката към документацията на PG за това как PostgreSQL позволява да се създаде langage plpython и как трябва да бъдат конфигурирани.
http://www.postgresql.org/docs/9.3/static/plpython-python23.html
От горната връзка е ясно, че трябва да компилирате двоичния файл два пъти, ако имате нужда както от plpython2u, така и от plpython3u. AFAIK, ActivePython 2.7.x за plpython2u и 3.2.x за plpython3u могат да бъдат конфигурирани на PG 9.2.x без никакви затруднения, но никога не съм пробвал на PG 9.3Beta2. И така, обмислен да опитам и да анализирам грешката защо и как може да бъде поправена, първо започнах инсталацията на източника, като зададох базов път с ActivePython 3.2. (Връзка за изтегляне на 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
Компилацията не бе успешна и показа грешка във файла Config.log като:
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'
В документацията на PG имаме ясни указания относно горната грешка и защо се случва, plpython ще бъде споделена библиотека на повечето платформи, но на някои платформи трябва специално да принудим компилатора като python от споделената библиотека. За това или можете да продължите към /src/pl/python/Makefile за промени или конкретно да заявите „shared_libpython=yes“ по време на компилиране.
Компилацията на източника проверява за два файла, когато използвате –with-python, които са „python“ и „python-config“. Въпреки че имам ActivePython-3.2 в моя базов път, компилаторът все още не успява да ги намери “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
Това е така, защото в ActivePython 3.2 имената на файловете ще бъдат „python“ като „python3“ и „python-config“ като „python3-config“, следователно компилаторът насочва към стария вместо към нов. В този момент Асиф Наим (Благодаря ви за вашето прозрение) от нашето ядро Dev. Екипът ме уведоми да се подигравам на съществуващи ActivePython-3.2 файлове като python &python-config. Това е почти като хакване от него, така че дублирах тези файлове като:
cd /opt/ActivePython-3.2/bin
cp python3-config python-config
cp python3 python
Добре, сега мога да видя това в моя базов път.
[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
Прекомпилирах PG източника, използвайки –with-python след промените и също така принудих компилатора да избере SHARED_LIBPYTHON, използвайки „shared_libpython“.
./configure --prefix=/usr/local/pg93b3 --with-python
make shared_libpython=yes
make shared_libpython=yes install
Тези стъпки ефективно ще компилират PG9.3Beta с библиотеки ActivePython-3.2. Сега нека създадем език 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.
!>
!>
Ами сега, това е странно, защо се е сринал... В този вид ситуация $PGDATA/pg_log са вашите приятели, за да се запознаят с проблема. Ето регистрационната информация на сървъра на база данни за срив:
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
Добре. Пропуснах да задам пътища на python, това е много важно, когато работите с езици на python или perl във вашата база данни.
Зададох PYTHONHOME, PYTHONPATH &LD_LIBRARY_PATH преди да стартирам клъстера.
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
Хубаво... Той създаде plpython3u с ActivePython-3.2.
Ако искате plpython2u също на същата инсталация. Не настройвайте, както направихме за ActivePython-3.2, просто имайте копие на ActivePython-2.7 и го задайте в основния път и прекомпилирайте източника.
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
Коментарите и корекциите са добре дошли.