2011-12-30 37 views
4

私はWindows上でPostgres 9.1で動作するようにplperlを取得できませんでした。Windows上でPostgreSQL 9.1を使用するためのplperlを入手した人はいますか?

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

REPRO

のPerl 5.14をインストールし、32ビット、ここからWindows用: http://downloads.activestate.com/ActivePerl/releases/5.14.2.1402/ActivePerl-5.14.2.1402-MSWin32-x86-295342.msi

はにPerlを追加します。システムパス変数 エンタープライズDBからWindows用Postgres 9.1.2 32ビット版をインストール www.enterprisedb.com/products/pgdownload.do#windows

は今、テストDBを作成し、それにPerlを追加し、機能を作成しよう:これはPostgresのサーバプロセスがシャットダウンさせ

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. 

注こと。 Yikes!

私は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. 

答えて

-1

それは(ActiveStateの)Perlの5.14が、それは作業を取得するために必要であること、here言います。 postgres 9.0のために従来のバージョンのstrawberry perlを使用しなければならなかったので、私はブランドについてはわかりません。うまくいきました。重要なことは、Postgres 9.1に正しいPerlバージョン5.14を使用することです。あなたのポストグルインストールの1つに一致するバイナリ形式(32ビット対64ビット)を使用してみてください。

2

私はこのことについてGoogleから良い回答がないことに驚いた。 Activstateは一部の人には動作するように見えるが、他の人には動作しないようだ。異なるバージョンのWindowsシステムライブラリとの競合については疑問がありましたが、決定的なものはありません。しかし、私は最終的には、ストロベリーperlを使用して動作するplperl.dllを構築することができました。

ここでは、ストロベリー・ペルルと一緒に作業するためのステップ・バイ・ステップの手順を示します。トリックはpostgresqlとplperlを再コンパイルすることですが、あなたの既存のpostgresql installにplperlをインストールしてください。

まず、次のものが必要になります。

  1. mingwの(http://www.mingw.org
  2. イチゴperlの。 http://www.strawberryperl.org
  3. Postgresqlソース。あなたのインストールに合ったバージョンを入手してください。

mingwサイトが地獄として混乱しています。ダウンロードする単一のパッケージはありません。他のすべてをダウンロードするインストーラをダウンロードする必要があります。ここには簡単なリンクがあります。彼らのインストーラで

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

、インストールするCおよびC++、およびMSYS環境の両方を選択します。 Mingwは環境を汚染することはありませんので、古い場所に設置してください。

私はactivestateがこれを行うために必要なファイル(共有ライブラリ)を持っているとは思わないし、ストロベリーのCPANサポートが優れている(activestateの独自のppmサイトと比較して)、activestateのdouchebag move有料版の後ろに古いバージョンを置く(そして、他のサイトに彼らのホストされたコピーを持ち去らせることを強いる)。 F.U. ActiveState。

Postgresql 9.1はもともとperl 5.14に対してビルドされていたので、おそらくそのバージョンに固執することをお勧めします。

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

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

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

ビルドプロセスではなくイチゴのPerlを使用するようにmingwののPerlを削除する必要があります。代わりにパス変数を使用することができますが、この方法は簡単です

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

は今だけ設定およびドキュメントはgmakeをを使用するように言うpostgresに

./configure --with-perl 
make 

ノートを作るが、mingwの上で、それは作ります。

実際の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 

は(私はCでperlのインストールされていることに注意してください:\イチゴとmingwのがインストールin c:\ mingw)

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

0

PostgreSQL 9.1.11(x64)を新しくインストールして遊んだあと、ActivePerl 5.14.1 (x64)が見つかりました。重要な点は、PostgreSQLが環境内で必要なperl DLLを見つけることができるようにすることです。PATH

Dependency Walkerplperl.dllのpostgresのlibディレクトリに入れてください。 PostgreSQL 9.1.11の場合はperl514.dllに依存していますので、環境変数PATHに、このディレクトリがあるディレクトリ(例:c:\ perl \ bin)を含めてください。 Dependency Walkerを再実行してDLLが正しく検出されたことを再確認して、うまくいくはずのPostgreSQLサービスを完全に停止/開始してください。

plperl.dllが異なるperl DLLに依存していることが分かったら、一致するActivePerlのバージョンを使用する必要があります(perl58.dllはActivePerl 5.8と一致します)。perl510.dllはActivePerl 5.10と一致します。 PerlとPostgreSQLのバイナリ形式は常に一致します(32/64bit))。

関連する問題