我正在我继承的服务器上进行一些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。但所有这些解决方案似乎都应该是一个简单的软件包安装程序更新?可能会发生什么?
答案 0 :(得分:2)
我明白了。有点意外,但相当肯定这是解决方案。简短的回答?如果你得到/usr/bin/mongod: symbol lookup error: /usr/bin/mongod: undefined symbol: _ZN7pcrecpp2RE4InitEPKcPKNS_10RE_OptionsE
,那么你应该从存储库安装pcre
和pcre-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
。