2014-12-19 23 views
1

我正在做一些Ruby開發的服務器,我繼承了(又名:我從來沒有設置過。在一段時間內保持不變,並注意到2.4系列升級可用時安裝的MongoDB版本爲1.8。由於該機箱正在運行使用yum來安裝RPM的RedHat/CentOS變體,因此我繼續進行升級工作。首先,停止正在運行的MongoDB實例:如何通過從MongoDB 1.8升級到2.4時通過MongoDB/PCRE「符號查找錯誤」

sudo service mongod stop 

然後從repo升級包。

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。但所有這些解決方案似乎激進的應該是一個簡單的包安裝程序更新?會發生什麼?

回答

2

我想通了。有些意外,但相當肯定這是解決方案。簡短的答案?如果您收到/usr/bin/mongod: symbol lookup error: /usr/bin/mongod: undefined symbol: _ZN7pcrecpp2RE4InitEPKcPKNS_10RE_OptionsE那麼你應該從這樣的倉庫安裝pcrepcre-devel:我如何發現這一點基本上,我要辭職自己重新編譯from scratch as outlined in this answer

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安裝再次運行!但爲什麼? 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) 

注意如何相比之下,有100%沒有mongod loading /lib64/libpcre.so.0.0.1的實例。所以這個問題的解決方案不是從源代碼重新編譯,因此處理無RPM安裝的麻煩,而只是從存儲庫安裝pcre