2

これは私の最初の投稿なので、最初に必要なすべての情報を提供していない場合は申し訳ありません!

私の上司と私は、サーバーの 1 つ (Centos 6.5、Postgres 9.2.1、Perl 5.10.1) の postgres インストールに plperl をインストールしようとしてきましたが、次のような同じ問題が発生し続けています。

ERROR:  could not load library "/opt/PostgreSQL/9.2/lib/postgresql/plperl.so": 
/opt/PostgreSQL/9.2/lib/postgresql/plperl.so: undefined symbol: Perl_sv_2bool_flags

このエラーは、SQL または PgAdmin III GUI を使用して言語をインストール (言語 plperl を作成) しようとすると返されます。

この問題に関連するほとんどの投稿が示唆するように、lperl.soファイルがある/opt/PostgreSQL/9.2/lib/postgresql/ことと探していることを確認しました。すべての男性と彼の犬は、どこに配置すべきかについて異なる提案をしているので、libperl.so私は多くの異なる場所に配置しようとしました.libperl.so

実行ldd /opt/PostgreSQL/9.2/lib/postgresql/plperl.soすると、次のものが返されます。

ldd /opt/PostgreSQL/9.2/lib/postgresql/plperl.so
        linux-vdso.so.1 =>  (0x00007fff2d9b7000)
        libperl.so => /lib64/libperl.so (0x00007f8ab5c11000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f8ab59f3000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f8ab565f000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f8ab5445000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f8ab522b000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f8ab5027000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f8ab4da3000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f8ab4b6b000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007f8ab4968000)
        /lib64/ld-linux-x86-64.so.2 (0x00000034aa800000)
        libfreebl3.so => /lib64/libfreebl3.so (0x00007f8ab46f1000)

Postgres と Perl のバージョンは問題ではないと思います。Centos 6.5、Postgres 9.3、および Perl 5.10.1 を実行している別のサーバーがあり、pl/perl が完全に実行されています (修正するためにそこで何が起こっているかを調べてみました)これはうまくいきません)。

私が知る限り、Postgres は libperl.so が /lib64 にあることを期待していますが、Perl がインストールされたときに別の場所にインストールされていました。現在、libperl.so を使用するのは Postgres だけです。

残念ながら、私が入社する前に上司がすべてをセットアップし、実際に機能させる必要があると判断したばかりなので、すべてがこのサーバーにどのようにインストールされたかはわかりません。

両方のサーバーを見ても、インストールと構成に違いが見られず、一方が機能し、他方が機能しません。

私はこれでほとんど機知に富んでいます(Postgresのインストールで修正する必要がある最後の問題です)ので、提案をいただければ幸いです。

乾杯

4

1 に答える 1

0

依存関係を適切に制御するパッケージ マネージャーと共にインストールされたバイナリ パッケージを使用していますか? ライブラリを自分でコンパイルしていますか? GUI「管理」ツールを使用してバイナリパッケージを強制的にインストールするか、PostgreSQL がそれらを見つけることができる場所にファイルを配置することは可能ですが、コンパイルされていない場合、それらが適切に動作することを期待するべきではありません/合理的に類似したプラットフォームにリンクされています。

plperl.soインストールするファイルとは異なるフラグまたはオプションでコンパイルされたバージョンの Perl を使用しているようです。の出力perl -Vを見て、perl がどのようにコンパイルされたかを確認してください。スレッド オプションを一貫して使用することが重要です。

/opt/PostgreSQL/9.2/lib/postgresql/plperl.so そのシンボルの1つが未定義であることをあなたに伝えているのは何ですか。これは、コンパイル オプションが原因である可能性があります。あるいは、新しいバージョンの Perl が必要であることを意味している可能性がありますlibperl.so(5.10.1 はかなり古いものです)。PotgreSQL の最近のバージョンであり、plperl通常、perl引用したバージョンよりも新しいバージョンが必要です。

libperl.soプラットフォームと、それを使用するためにコンパイル/リンクされている他のアプリケーションの一貫した場所にインストールする必要があります。移動する必要はありません。libperl.so 実際、システムにのコピーが多数ある場合、ロード時にplperl古いバージョンが見つかる可能性があります。libperl.so

比較のために、私のシステムの 1 つで実行したコマンドの出力を次に示します。

/usr/local/lib/postgresql/plperl.so:
       libperl.so => /usr/local/lib/perl5/5.16/mach/CORE/libperl.so (0x801214000)
       libthr.so.3 => /lib/libthr.so.3 (0x80158f000)
       libc.so.7 => /lib/libc.so.7 (0x80081b000)
       libm.so.5 => /lib/libm.so.5 (0x8017b2000)
       libcrypt.so.5 => /lib/libcrypt.so.5 (0x8019d3000)
       libutil.so.9 => /lib/libutil.so.9 (0x801bf2000)

シンボルが存在します:

strings /usr/local/lib/perl5/5.16/mach/CORE/libperl.so | grep 2bool
 Perl_sv_2bool_flags
 Perl_sv_2bool

スタックのどこかに perlXS モジュールまたは.soファイルが間違った場所を指している可能性があります。おそらく、キャッシュされたライブラリを使用してシステムレベルで混乱が生じている可能性があります... ldconfigLinuxでこれを管理するために使用するツールだと思います。

于 2014-09-10T14:41:32.900 に答える