4

plperlをWindows上のPostgres9.1で動作させることができませんでした。

同じ問題がここで説明されていますが、これまでのところ解決策はありません:http: //postgresql.1045698.n5.nabble.com/BUG-6204-Using-plperl-functions-generate-crash-td4802111.html

REPRO

ここからWindows用のPerl5.1432ビットをインストールします:http: //downloads.activestate.com/ActivePerl/releases/5.14.2.1402/ActivePerl-5.14.2.1402-MSWin32-x86-295342.msi

システムパス変数にPerlを追加します。EnterpriseDBからWindows用のPostgres9.1.232ビットをインストールしますwww.enterprisedb.com/products/pgdownload.do#windows

次に、テストDBを作成し、それに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.
4

3 に答える 3

2

これについて Google から適切な回答が得られなかったことに驚きました。Activstate は機能するものと機能しないものがあるようです。さまざまなバージョンの Windows システム ライブラリと競合する疑いがありましたが、決定的なものはありませんでした。しかし、最終的には動作する plperl.dll をストロベリー perl を使用して構築することができました。

ここでは、plperl をストロベリー perl で動作させるための段階的な手順を示します。秘訣は、postgresql と plperl を再コンパイルすることですが、既存の postgresql インストールの上に plperl をインストールします。

まず、次のものが必要です。

  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 にはこれを行うために必要なファイル (共有ライブラリ) が付属しているとは思いません。また、(activestate の独自の ppm サイトと比較して) ストロベリーの CPAN サポートが優れており、古いバージョンを置き去りにするという activestate の douchebag の動きを発見しました。ペイウォール (そして、他のサイトにホストされたコピーを強制的に削除させます)。FU アクティブステート。

Postgresql 9.1 はもともと perl 5.14 に対してビルドされたので、おそらくそのバージョンを使い続けるのが最善です。

そのすべてのものを開梱してインストールします。Mingw は、コンパイルするためのシェル (スタートアップ メニューでショートカットを探します) を提供します。シェルを起動し、閉じないでください。

以下を実行して、パッケージをインストール/削除します。

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

ビルドプロセスが代わりにストロベリー perl を使用するように、mingw の perl を削除する必要があります。代わりにパス変数をいじることもできますが、この方法の方が簡単です

ここで、postgresql ソースを解凍したディレクトリに移動する必要があります。mingw シェルでは、ルート パス /c を使用して C: ドライブを参照します。

あとは設定して作るだけ

./configure --with-perl
make

postgres のドキュメントでは 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

cd で 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 にインストールしたことに注意してください)

この時点で、完了です。そのディレクトリには、postgresql に付属するものを置き換えることができる plperl.dll があります。

于 2012-08-10T07:38:48.330 に答える
0

ここには、(ActiveState) Perl 5.14が動作するために必要であると書かれています。postgres 9.0 には、従来のバージョンのストロベリー perl を使用する必要があったため、ブランドについてはわかりませんが、問題なく動作しました。重要なことは、Postgres 9.1 に正しい Perl バージョン 5.14 を使用することです。postgres インストールの 1 つに一致するバイナリ形式 (32 対 64 ビット) を使用してみてください。

于 2012-03-15T09:30:27.167 に答える