我想通了。有点意外,但相当肯定这是解决方案。简短的回答?如果你得到了/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。