2

这是我在这里的第一篇文章,如果我没有提供第一次所需的所有信息,非常抱歉!

我的老板和我一直在尝试在我们的一台服务器(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 时,它安装在其他地方。目前 Postgres 是唯一将使用 libperl.so 的东西

不幸的是,我不知道这台服务器上的所有东西是如何安装的,因为我的老板在我加入公司之前就已经设置好了所有东西,他才刚刚决定我们实际上需要让它工作。

通过查看我们的两台服务器,我看不出安装和配置有任何差异,这会导致一台工作而另一台不工作。

我对此几乎束手无策(这是我们需要通过 Postgres 安装解决的最后一个问题),所以任何建议都将不胜感激。

干杯

4

1 回答 1

0

您是否使用安装了正确控制依赖关系的包管理器的二进制包?自己编译库吗?虽然可以强制使用 GUI“管理”工具安装二进制包,或者将文件放在 PostgreSQL 能够找到它们的位置,但如果它们没有被编译,你不应该期望它们能正常工作/在相当相似的平台上链接。

看起来您使用的 Perl 版本已使用与plperl.so您正在安装的文件不同的标志或选项进行编译。看看perl -V你的 perl 是如何编译的输出 - 一致地使用线程选项很重要。

什么/opt/PostgreSQL/9.2/lib/postgresql/plperl.so 告诉你它的符号之一是未定义的。这可能是由于编译选项或可能意味着您需要更新版本的 Perl 并且libperl.so(5.10.1 相当旧)。PotgreSQLplperl的最新版本,通常需要perl比您引用的版本更新的版本。

libperl.so应该安装在您的平台和其他已编译/链接以使用它的应用程序的一致位置 - 您不需要移动它。libperl.so 事实上,如果您的系统上有大量副本,则在加载时plperl可能会发现一个过时的版本。libperl.so

为了比较,这里是您在我的一个系统上运行的命令的输出:

/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指向错误位置的文件。也许在系统级别与缓存库存在一些混淆......我相信ldconfig你用来在 Linux 上管理它的工具。

于 2014-09-10T14:41:32.900 回答