从MongoDB 1.8升级到2.4时,如何通过MongoDB / PCRE“符号查找错误”

时间:2014-12-19 07:28:07

标签: ruby-on-rails ruby mongodb centos redhat

我正在我继承的服务器上进行一些Ruby开发(也就是说:我从未设置过。)一段时间没有维护,并注意到2.4系列升级时安装的MongoDB版本为1.8可用。由于该框运行的是使用yum来安装RPM的RedHat / CentOS变体,因此我继续执行通常要升级的操作。首先,停止正在运行的MongoDB实例:

sudo service mongod stop

然后从repo升级包。

sudo yum install mongodb mongodb-server libmongodb

一切顺利,包括正在安装的依赖项。但是当我去重启MongoDB bia这个命令时:

sudo service mongod start

似乎没有发生任何事情。连接已经死了。检查MongoDB日志显示以下一条可疑错误行:

  

/ usr / bin / mongod:符号查找错误:/ usr / bin / mongod:未定义符号:_ZN7pcrecpp2RE4InitEPKcPKNS_10RE_OptionsE

到底是什么意思?我看到this question and answer thread建议从RPM源代码重建以及其他在线帖子建议相同的变体:下载源代码以直接从MongoDB站点重新编译或下载RPM。但所有这些解决方案似乎都应该是一个简单的软件包安装程序更新?可能会发生什么?

1 个答案:

答案 0 :(得分:2)

我明白了。有点意外,但相当肯定这是解决方案。简短的回答?如果你得到/usr/bin/mongod: symbol lookup error: /usr/bin/mongod: undefined symbol: _ZN7pcrecpp2RE4InitEPKcPKNS_10RE_OptionsE,那么你应该从存储库安装pcrepcre-devel,如下所示:

sudo yum install pcre pcre-devel

我基本上是如何发现这一点的细节,我正在辞职重新编译from scratch as outlined in this answer。除非有充分的理由,否则这是我不想做的事情。但正如回答者所说,在重新编译之前,应该安装以下编译器项和相关库:

sudo yum install rpm-build redhat-rpm-config gcc gcc-c++ make yum install openssl-devel snappy-devel v8-devel boost-devel python-devel python-nose scons pcre-devel readline-devel libpcap-devel gperftools-devel

好的,所以我这样做是为了重建源代码奠定基础。但是在安装中也注意到pcre正在安装,因为它显然已经丢失并且需要依赖pcre-devel;这是关键。当我准备重新编译时,我决定再次尝试启动mongod

sudo service mongod start

并检查。瞧,MongoDB安装再次运行!但为什么? This answer here持有线索:

  

错误是由libpcre更改签名引起的   RE::Init()只能std::string,而不是char*。这个   如果您获得libpcrecpp的更新版本,则会修复此问题   用于向后兼容的旧界面。

该答案还建议从源代码重新编译,但现在这没什么意义,因为很明显我的MongoDB安装已经启动并再次运行。所以我在开发框上运行了lsof并看到了:

sudo lsof | grep pcre
    nginx       892   deploy  mem       REG              253,2              97140006 (deleted)/lib64/libpcre.so.0.0.1 (stat: No such file or directory)
    nginx       893   deploy  mem       REG              253,2              97140006 (deleted)/lib64/libpcre.so.0.0.1 (stat: No such file or directory)
    nginx      1369     root  mem       REG              253,2              97140006 (deleted)/lib64/libpcre.so.0.0.1 (stat: No such file or directory)
    mongod    26841  mongodb  mem       REG              253,2               1052673 /usr/lib64/libpcrecpp.so.0.0.0 (path dev=0,53)
    mongod    26841  mongodb  mem       REG              253,2              97126735 /lib64/libpcre.so.0.0.1 (path dev=0,53)
    grep      28590   deploy  mem       REG              253,2              97126735 /lib64/libpcre.so.0.0.1 (path dev=0,53)

注意mongod用户如何加载/lib64/libpcre.so.0.0.1。那一定是它,对吗?

我通过跳转到这个设置的伙伴/双胞胎生产盒来确认这一点 - 我还没有升级MongoDB - 并运行相同的lsof命令,结果就是这样:

sudo lsof | grep pcre
    nginx       922          root  mem       REG              253,2              81795343 (deleted)/lib64/libpcre.so.0.0.1 (stat: No such file or directory)
    nginx       923        deploy  mem       REG              253,2              81795343 (deleted)/lib64/libpcre.so.0.0.1 (stat: No such file or directory)
    nginx       924        deploy  mem       REG              253,2              81795343 (deleted)/lib64/libpcre.so.0.0.1 (stat: No such file or directory)
    grep       8067        deploy  mem       REG              253,2              81791051 /lib64/libpcre.so.0.0.1 (path dev=0,61)

请注意,相比之下,100%没有mongod加载/lib64/libpcre.so.0.0.1的实例。所以这个问题的解决方案不是从源代码重新编译 - 因此处理无RPM安装的麻烦 - 而只是从存储库安装pcre