Кто-нибудь получил plperl для работы с Postgres 9.1 на Windows?

Мне не удалось заставить plperl работать с Postgres 9.1 в Windows.

Та же проблема описана здесь, но пока без решения: http://postgresql.1045698.n5.nabble.com/BUG-6204-Using-plperl-functions-generate-crash-td4802111.html

REPRO

Установите Perl 5.14 32-bit для Windows отсюда: http://downloads.activestate.com/ActivePerl/releases/5.14.2.1402/ActivePerl-5.14.2.1402-MSWin32-x86-295342.msi

Добавьте Perl в системную переменную пути. Установите Postgres 9.1.2 32-bit для Windows из базы данных предприятия www.enterprisedb.com/products/pgdownload.do#windows

Теперь создайте тестовую базу данных, добавьте в нее perl и попробуйте создать функцию:

postgres=# create database plperl_test;
CREATE DATABASE
postgres=# \c plperl_test
WARNING: Console code page (437) differs from Windows code page (1252)
         8-bit characters might not work correctly. See psql reference
         page "Notes for Windows users" for details.
You are now connected to database "plperl_test" as user "postgres".
plperl_test=# create language plperl;
CREATE LANGUAGE
plperl_test=# create function perl_test() returns void as
plperl_test-# $$
plperl_test$# $$
plperl_test-# language plperl;
server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.

Обратите внимание, что это привело к завершению процесса сервера Postgres. Хлоп!

Когда я просматриваю свой файл журнала Postgres, я нахожу это...

2011-12-29 15:51:08 PST STATEMENT:  create function perl_test() returns void as
    $$
    $$
    language plperl;
2011-12-29 15:51:26 PST LOG:  server process (PID 10364) was terminated by exception 0xC0000005
2011-12-29 15:51:26 PST HINT:  See C include file "ntstatus.h" for a description of the hexadecimal value.
2011-12-29 15:51:26 PST LOG:  terminating any other active server processes
2011-12-29 15:51:26 PST WARNING:  terminating connection because of crash of another server process
2011-12-29 15:51:26 PST DETAIL:  The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
2011-12-29 15:51:26 PST HINT:  In a moment you should be able to reconnect to the database and repeat your command.
2011-12-29 15:51:26 PST LOG:  all server processes terminated; reinitializing
2011-12-29 15:51:36 PST FATAL:  pre-existing shared memory block is still in use
2011-12-29 15:51:36 PST HINT:  Check if there are any old server processes still running, and terminate them.

3 ответа

Я был удивлен, не найдя хороших ответов от Google по этому вопросу. Кажется, что Activstate работает для некоторых, но не для других. Были подозрения о конфликтах с различными версиями системных библиотек Windows, но ничего определенного. Тем не менее, я смог наконец создать plperl.dll, который работает, используя клубничный Perl.

Вот пошаговые инструкции, чтобы заставить plperl работать с клубничным perl. Хитрость заключается в том, чтобы перекомпилировать postgresql и plperl, но установить plperl поверх существующей установки postgresql.

Для начала вам понадобится следующее:

  1. Mingw ( http://www.mingw.org/)
  2. клубника перл. http://www.strawberryperl.org/
  3. Postgresql источники. Убедитесь, что вы получаете версию, соответствующую вашей установке.

Сайт Mingw запутанно, как ад. Нет единого пакета для загрузки. Вы должны загрузить установщик, который загружает все остальное. Вот быстрая ссылка на это.

http://sourceforge.net/projects/mingw/files/Installer/

В установщике выберите C и C++ и среду MSYS для установки. Mingw не будет загрязнять окружающую среду, поэтому установите его в любом старом месте.

Что касается Perl, я не думаю, что activestate поставляется с файлами (разделяемыми библиотеками), необходимыми для этого, и я считаю, что поддержка CPAN в клубнике является превосходной (по сравнению с частными ppm-сайтами activestate), а ход activestate - убрать старые версии позади платный доступ (и принуждение других сайтов удалять свои размещенные копии). FU ActiveState.

Postgresql 9.1 изначально был построен на Perl 5.14, поэтому лучше придерживаться этой версии.

Распакуйте и установите все это. Mingw предоставит вам оболочку (найдите ярлык в меню запуска) для компиляции. Запустите оболочку и не закрывайте ее.

для установки / удаления пакетов выполните следующее:

mingw-get install libminizip
mingw-get remove mingw-perl

вам нужно удалить perl от mingw, чтобы в процессе сборки использовался клубничный perl. Вместо этого вы можете использовать переменную path, но этот способ проще

Теперь вам нужно попасть в каталог, в который вы распаковали распакованные исходники postgresql. В оболочке mingw используйте корневой путь /c для обращения к диску C:.

Теперь просто настройте и сделайте

./configure --with-perl
make

Обратите внимание, что в postgres docs сказано использовать gmake, но на mingw это make.

Вероятно, сборка завершится неудачно при сборке самого файла plperl.dll. Это потому, что среда сборки не производит правильную команду для сборки DLL. Если вы получаете сообщение об ошибке, подобное этому:

dllwrap -o plperl.dll --dllname plperl.dll  --def libplperldll.def plperl.o SPI.o Util.o -L../../../src/port -Wl,--allow-multiple-definition  -Wl,--as-needed -LC:/strawberry/perl/lib/CORE -l -L../../../src/backend -lpostgres
c:/mingw/bin/../lib/gcc/mingw32/4.7.0/../../../../mingw32/bin/ld.exe: cannot find -l-L../../../src/backend
c:/mingw/bin/../lib/gcc/mingw32/4.7.0/../../../../mingw32/bin/ld.exe: cannot find -lpostgres

Перейдите в src/pl/plperl и выполните следующую команду:

dllwrap -o plperl.dll --dllname plperl.dll  --def libplperldll.def plperl.o SPI.o Util.o -L../../../src/port -Wl,--allow-multiple-definition  -Wl,--as-needed -L/c/strawberry/perl/lib/CORE  -L../../../src/backend -lpostgres -lperl514

(обратите внимание, что у меня есть Perl, установленный в c:\strawberry, и Mingw, установленный в c:\mingw)

На этом вы закончили. у вас есть plperl.dll в этом каталоге, который может заменить тот, который поставляется с postgresql.

Здесь говорится, что (ActiveState) Perl 5.14 требуется, чтобы заставить его работать. Я не уверен насчет бренда, так как мне пришлось использовать устаревшую версию клубничного Perl для Postgres 9.0, которая работала просто отлично. Важно использовать правильную версию Perl 5.14 для Postgres 9.1. Попробуйте использовать двоичный формат (32 или 64 бита), совпадающий с форматом вашей установки postgres.

После игры с новой установкой PostgreSQL 9.1.11 (x64) я обнаружил, что ActivePerl 5.14.1 (x64) работает. Ключ должен гарантировать, что PostgreSQL может найти необходимые Perl DLL в своей среде PATH,

Запустите Dependency Walker на plperl.dll внутри директории postgres lib. В случае PostgreSQL 9.1.11 он зависит от perl514.dll - поэтому измените вашу среду PATH, включив в нее каталог, в котором она находится (т.е. c:\perl\bin). Перепроверьте, правильно ли обнаружена DLL, перезапустив Dependency Walker, затем полностью остановите / запустите службу PostgreSQL, которую вы должны хорошо выполнить.

Если вы обнаружите, что plperl.dll зависит от другой библиотеки Perl DLL, тогда вам нужно использовать версию ActivePerl, которая соответствует (то есть perl58.dll будет соответствовать ActivePerl 5.8, perl510.dll будет соответствовать ActivePerl 5.10 - гарантируя, что двоичный формат Perl и PostgreSQL всегда совпадает (32/64bit)).

Другие вопросы по тегам