gpt4 book ai didi

ruby-on-rails - 从 MongoDB 1.8 升级到 2.4 时如何解决 MongoDB/PCRE “symbol lookup error”

转载 作者:太空宇宙 更新时间:2023-11-03 17:19:36 25 4
gpt4 key购买 nike

我正在我继承的服务器上做一些 Ruby 开发(又名:我最初从未设置过。)有一段时间没有维护,并注意到在 2.4 系列升级时安装的 MongoDB 版本是 1.8可用的。由于盒子运行的是使用 yum 安装 RPM 的 RedHat/CentOS 变体,因此我继续进行我通常做的升级。首先,像这样停止正在运行的 MongoDB 实例:

sudo service mongod stop

然后从仓库升级包。

sudo yum install mongodb mongodb-server libmongodb

一切顺利,包括安装的依赖项。但是当我通过这个命令重新启动 MongoDB 时:

sudo service mongod start

似乎什么也没发生。连接已死。检查 MongoDB 日志显示以下一个令人遗憾的错误行:

/usr/bin/mongod: symbol lookup error: /usr/bin/mongod: undefined symbol: _ZN7pcrecpp2RE4InitEPKcPKNS_10RE_OptionsE

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

最佳答案

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

The error was caused by libpcre changing the signature of RE::Init() to only take a std::string, rather than a char*. This is fixed if you get a newer version of libpcrecpp, which adds the old interface for backwards compat.

该答案还建议从源代码重新编译,但现在这没什么意义,因为很明显我的 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)

注意相比之下,mongod 加载 /lib64/libpcre.so.0.0.1 的实例是 100% 没有的。因此,这个问题的解决方案不是从源代码重新编译——从而解决令人头疼的非 RPM 安装——而是从存储库安装 pcre

关于ruby-on-rails - 从 MongoDB 1.8 升级到 2.4 时如何解决 MongoDB/PCRE “symbol lookup error”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27561492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com