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

我正在我inheritance的服务器上进行一些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

那是什么意思? 我看到了这个问题并回答了建议从RPM源代码重建的线程以及其他在线post,建议使用相同的变体:下载源代码以直接从MongoDB站点重新编译或下载RPM。 但所有这些解决方案似乎都应该是一个简单的软件包安装程序更新? 可能会发生什么?

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

 sudo yum install pcre pcre-devel 

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

 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安装再次运行! 但为什么? 这里的答案有线索:

该错误是由libpcreRE::Init()的签名更改为仅采用std::string而不是char* 。 如果您获得更新版本的libpcrecpp ,则会修复此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