【问题标题】:How to get past MongoDB/PCRE “symbol lookup error” when upgrading from MongoDB 1.8 to 2.4从 MongoDB 1.8 升级到 2.4 时如何克服 MongoDB/PCRE “符号查找错误”
【发布时间】:2015-02-18 02:53:37
【问题描述】:

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

sudo service mongod stop

然后从 repo 升级包。

sudo yum install mongodb mongodb-server libmongodb

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

sudo service mongod start

似乎什么也没发生。连接已死。检查 MongoDB 日志显示以下一条可悲的错误行:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-01-13
      • 2018-06-27
      • 1970-01-01
      • 2023-03-29
      • 2020-06-16
      • 2020-11-05
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      相关资源
      最近更新 更多