PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

ГРЕШКА:не можах да осъществи достъп до файл “$libdir/plpython2” – ГРЕШКА:не можа да получи достъп до файл “$libdir/plpython3”

По-горе е описана грешка при изпращане на PG поща, тъй като не успява да СЪЗДАВА ЕЗИК plpython2u/plpython3u на 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

Преди да направя някакво проучване за горните грешки, прочетох по-долу връзката към документацията на 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

Коментарите и корекциите са добре дошли.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Java Enums, JPA и Postgres enums - Как да ги накарам да работят заедно?

  2. Postgresql колоната не е намерена, но се показва в описанието

  3. LEAST() Функция в PostgreSQL

  4. Има ли удар в производителността при използване на десетични типове данни (MySQL / Postgres)

  5. Използване на Kubernetes за внедряване на PostgreSQL