Linux 環境 libpq加載異常導致psql 連接 PostgreSQL 庫失敗失敗案例

文章目錄

  • 局點現象
  • 定位結論
  • 局點環境
  • 補充知識點如下
    • 庫文件加載順序
      • 關鍵事實:
      • 您系統中的證據:
      • 優先級對比表:
      • 解決方案強化:
      • 最終檢查:
  • 本局點解決方法

局點現象

  1. 數據庫 mdm 升級失敗
  2. 檢查日志, 發現是由于 psql 連接數據庫報錯,
psql: symbol lookup error: psql: undefined sybol : PQmblenBounded

定位結論

通常表示 psql 可執行文件所依賴的 libpq 動態庫版本與編譯時版本不一致或不兼容,即運行時找不到它需要的某個函數(PQmblenBounded)。

web 界面升級, 使用的 shell 非普通 sh xxx.sh 中的shell 環境, 加載的環境變量沒那么全, 局點環境中 psql 在運行過程中, 會加載系統自帶的庫文件緩存路徑, 局點默認的緩存為

[root@localhost ~]# ldconfig -p |grep libpq.so.5libpq.so.5 (libc6,x86-64) => /usr/local/lib/libpq.so.5libpq.so.5 (libc6,x86-64) => /usr/lib64/libpq.so.5[root@localhost ~]# nm -D /usr/local/lib/libpq.so.5 | grep PQmblenBounded
[root@localhost ~]# nm -D /usr/lib64/libpq.so.5 | grep PQmblenBounded
000000000001b010 T PQmblenBounded@@RHPG_14[root@localhost ~]# nm -D /program/lib/libpq.so.5 | grep PQmblenBounded
000000000001a8c0 T PQmblenBounded

可以看到 /usr/local/lib下 與 /usr/lib64 下的 庫文件中, 沒有 PQmblenBounded 函數, 而 我們產品的庫文件路徑/program/lib 下的 libpq.so.5中是有的

局點環境

[root@localhost lxm]# ldd /program/bin/psql |grep libpqlibpq.so.5 => /program/lib/libpq.so.5 (0x00007f9a02984000)
[root@localhost lxm]# 
[root@localhost lxm]# echo $LD_LIBRARY_PATH 
/program/lib:/usr/local/fuse/lib:/usr/lib64:/usr/local/lib:/lib:/lib64:/driverfile/lib
[root@localhost lxm]# 
[root@localhost lxm]# ldconfig -p |grep libpqlibpqwalreceiver.so (libc6,x86-64) => /usr/local/lib/libpqwalreceiver.solibpq.so.5 (libc6,x86-64) => /usr/local/lib/libpq.so.5libpq.so.5 (libc6,x86-64) => /usr/lib64/libpq.so.5
[root@localhost lxm]# 
[root@localhost lxm]# 
[root@localhost lxm]#  /program/bin/psql -U postgres -c "\c ras; " -c "select current_database()"
You are now connected to database "ras" as user "postgres".current_database 
------------------ras
(1 row)

補充知識點如下

庫文件加載順序

  1. LD_LIBRARY_PATH 指向的路徑
  2. /etc/ld.so.conf.d/xxx.conf
    按照字母排序
  3. ldconfig 緩存的標準系統路徑 /lib /lib64 /usr/lib /usr/lib64 等

關鍵事實:

  1. 默認標準路徑

    • 在大多數 Linux 發行版中,/etc/ld.so.conf 文件默認包含以下路徑:
      include /etc/ld.so.conf.d/*.conf
      /usr/local/lib    # 這是標準本地軟件安裝路徑
      /usr/lib
      /lib
      
    • 這意味著 /usr/local/lib 總是會被 ldconfig 掃描并加入緩存
  2. 驗證方法

    # 1. 檢查默認配置
    cat /etc/ld.so.conf# 典型輸出(RHEL/CentOS):
    include ld.so.conf.d/*.conf
    /usr/local/lib    # 明確列出的標準路徑
    /usr/lib
    /lib# 2. 查看緩存中的路徑
    ldconfig -v | grep -A1 "search dir"
    
  3. 優先級特性

    • 由于在 /etc/ld.so.conf 中直接定義(而非通過 .d 目錄)
    • 它的加載順序早于 /etc/ld.so.conf.d/ 中的配置文件
    • 因此有較高優先級

您系統中的證據:

[root@localhost ~]# ldconfig -p |grep libpqlibpq.so.5 (libc6,x86-64) => /usr/local/lib/libpq.so.5   # 來自標準路徑libpq.so.5 (libc6,x86-64) => /usr/lib64/libpq.so.5       # 來自標準路徑

優先級對比表:

路徑類型示例優先級來源典型優先級
主配置文件路徑/usr/local/lib/etc/ld.so.conf最高
.d目錄早期文件/etc/ld.so.conf.d/00-*.conf文件名排序
.d目錄后期文件/etc/ld.so.conf.d/99-*.conf文件名排序
LD_LIBRARY_PATH任何自定義路徑環境變量最高(但受限制)

解決方案強化:

# 創建超高級別配置文件(00前綴)
sudo tee /etc/ld.so.conf.d/00-pg.conf <<< "/program/lib"# 重建緩存(確保新路徑最先加載)
sudo ldconfig# 驗證緩存順序(/program/lib 應該在最前面)
ldconfig -p | grep libpq.so.5

最終檢查:

# 查看實際加載的庫
LD_DEBUG=libs psql -c "SELECT 1" 2>&1 | grep libpq.so# 預期輸出:
#   find library=libpq.so.5 [0]; searching
#     trying file=/program/lib/libpq.so.5   # 應該先嘗試這個
#     trying file=/usr/local/lib/libpq.so.5 # 后嘗試這個

? 結論
/usr/local/lib 確實是標準路徑且優先級較高,但通過創建 00-pg.conf 文件,您可以強制系統優先使用 /program/lib 中的新版庫,完美解決符號缺失問題。

本局點解決方法

echo '/program/lib'  > /etc/ld.so.conf.d/00-pg.conf && ldconfig[root@localhost ~]# cat /etc/ld.so.conf.d/00-pg.conf 
/program/lib
[root@localhost ~]# ldconfig
[root@localhost ~]# ldconfig -p |grep libpqlibpqwalreceiver.so (libc6,x86-64) => /program/lib/libpqwalreceiver.solibpqwalreceiver.so (libc6,x86-64) => /usr/local/lib/libpqwalreceiver.solibpq.so.5 (libc6,x86-64) => /program/lib/libpq.so.5libpq.so.5 (libc6,x86-64) => /usr/local/lib/libpq.so.5libpq.so.5 (libc6,x86-64) => /usr/lib64/libpq.so.5libpq.so (libc6,x86-64) => /program/lib/libpq.so
[root@localhost ~]# 
[root@localhost ~]# ldd /program/bin/psql |grep libpqlibpq.so.5 => /program/lib/libpq.so.5 (0x00007f5b60bfc000)

可以看到, 現在 /program/lib/libpq.so.5 位于最高優先級了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92006.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92006.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92006.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# XML 文件

在 C# 中處理 XML 文件是非常常見的操作&#xff0c;可以使用System.Xml命名空間中的類來實現。以下是一些常用的 XML 操作示例&#xff1a; 手冊鏈接&#xff1a; System.Xml 命名空間 XmlDocument 創建一個xml數據格式的文檔 XmlDocument xml new XmlDocument(); Xml…

LOVON——面向足式Open-Vocabulary的物體導航:LLM做任務分解、YOLO11做目標檢測,最后L2MM將指令和視覺映射為動作(且解決動態模糊)

前言 因為項目需要(比如我們在做的兩個展廳講解訂單)&#xff0c;近期我一直在研究VLN相關&#xff0c;有些工作哪怕暫時還沒開源(將來可能會開源)&#xff0c;但也依然會解讀&#xff0c;比如好處之一是構建完整的VLN知識體系&#xff0c;本文便是其中一例 我在解讀過程中&am…

【Django】-3- 處理HTTP響應

HttpResponse 家族” 的常用操作&#x1f31f;1. 設置狀態碼 &#x1f44b;狀態碼是服務器告訴客戶端 “請求處理結果” 的數字暗號&#xff08;比如 404 表示 “沒找到頁面”&#xff09;。Django 里有 3 種設置方式&#xff1a;方式 1&#xff1a;直接寫數字&#xff08;簡單…

《React Router深解:復雜路由場景下的性能優化與導航流暢性構建》

路由系統是連接用戶操作與應用功能的中樞神經,而React Router作為React生態中處理路由邏輯的核心工具,其在復雜應用中的表現直接決定著用戶體驗的優劣。當應用規模擴張至數十甚至上百個路由,嵌套層級跨越多層,導航控制中的性能問題便會逐漸凸顯——從首屏加載的延遲到路由切…

網絡與信息安全有哪些崗位:(4)應急響應工程師

想知道網絡與信息安全領域有哪些具體崗位嗎&#xff1f; 網絡與信息安全有哪些崗位&#xff1a;&#xff08;1&#xff09;網絡安全工程師-CSDN博客 網絡與信息安全有哪些崗位&#xff1a;&#xff08;2&#xff09;滲透測試工程師_網絡安全滲透工程師-CSDN博客 網絡與信息安…

Leetcode 3634. Minimum Removals to Balance Array

Leetcode 3634. Minimum Removals to Balance Array 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3634. Minimum Removals to Balance Array 1. 解題思路 這一題思路上就是一個滑動窗口的思路。 我們首先將整個數組有序排列&#xff0c;然后分別從左向右考察每一個元素作為…

C#/.NET/.NET Core優秀項目和框架2025年7月簡報

前言 每月定期推廣和分享的C#/.NET/.NET Core優秀項目和框架&#xff08;每周至少會推薦兩個優秀的項目和框架當然節假日除外&#xff09;&#xff0c;推文中有項目和框架的詳細介紹、功能特點、使用方式以及部分功能截圖等。注意&#xff1a;排名不分先后&#xff0c;都是十分…

第 10 篇:深度學習的“軍火庫”——CNN、RNN與Transformer,AI如何看懂世界?

《人工智能AI之機器學習基石》系列⑩ 專欄核心理念: 用通俗語言講清楚機器學習的核心原理,強調“洞察 + 技術理解 + 應用連接”,構建一個完整的、富有啟發性的知識體系。 引

深度學習—功能性函數代碼 common.py

函數&#xff1a;返回GPU def try_gpu(i0): #save"""如果存在&#xff0c;則返回gpu(i)&#xff0c;否則返回cpu()"""if torch.cuda.device_count() > i 1: # 如果存在第 i 個 GPUreturn torch.device(fcuda:{i}) # 返回第 i 個 GPU 設…

南太平洋金融基建革命:斐濟-巴新交易所聯盟的技術破局之路 ——從關稅動蕩到離岸紅利,跨境科技如何重塑太平洋資本生態

一、今日焦點&#xff1a;全球關稅震蕩與南太平洋的“技術聯盟”機遇 1. 特朗普關稅大限引爆亞太市場波動&#xff0c;小經濟體承壓尋路 2025年8月1日&#xff0c;特朗普正式簽署行政令&#xff0c;對多國征收10%-41%的“對等關稅”。韓國首當其沖&#xff0c;綜合指數暴跌近4%…

python爬取豆瓣電影評論通用代碼

最近在自學python爬蟲&#xff0c;今天閑來無事&#xff0c;爬了一下豆瓣數據 這個網站對于初學者來說還是很友好的注意&#xff1a;有python環境的朋友運行的時候&#xff0c;要把cookie換成自己的 通用性&#xff1a;可以自己換不同的電影id進行數據爬取 Tip&#xff1a;slee…

構建屬于自己的第一個 MCP 服務器:初學者教程

為什么需要 MCP 服務器&#xff1f; 你是否遇到過這樣的場景&#xff1a;向 AI 助手&#xff08;比如 GitHub Copilot&#xff09;詢問 “北京今天的天氣”&#xff0c;得到的回復卻是 “我無法訪問實時天氣數據”&#xff1f; 這是因為大多數 AI 模型本身 “與世隔絕”—— 它…

個人項目介紹:語音識別小助手

一、項目內容 基于STM32F103RCT6制作了一款集語音識別、按鍵控制、信息顯示、溫濕度監測等多功能于一體的智能設備&#xff0c;滿足多樣化的交互需求。 二、個人工作內容 依據項目需求&#xff0c;選定 STM32F103RCT6 單片機、SU-03T語音識別模組、AHT25 溫濕度傳感器等核心元件…

【Django】-1- 開發項目搭建

一、PDM Django 搭建項目&#x1f447;&#x1f3af; 核心目標用 PDM&#xff08;更現代的 Python 包管理工具&#xff09;&#xff0c;快速創建并管理 Django 項目&#xff08;Web 框架&#xff09;&#xff0c;讓開發流程更絲滑?&#x1f9e9; 分步拆解1. 創建項目用 PDM 初…

c++:設計模式訓練

寫一個鳥類&#xff1a;有一個多態函數&#xff1a;run 寫一個企鵝類&#xff0c;繼承自鳥類&#xff1a;重寫 run 寫一個鴕鳥類&#xff0c;繼承自鳥類&#xff0c;重寫 run 寫一個老鷹類&#xff0c;繼承自鳥類&#xff0c;重寫run 寫一個鳥籠&#xff0c;能夠存放 不同的鳥…

配置Mybatis環境

配置Mybatis環境MyBatis是什么配置Mybatis環境MyBatis是什么 MyBatis 一個支持普通 SQL 查詢、存儲過程以及高級映射的持久層框架。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作&#xff0c;使得開發者可以更專注于 SQL 本身&#xff0c;而不必花費過多…

生產環境中基于Istio的Kubernetes多集群灰度發布架構實戰經驗分享

生產環境中基于Istio的Kubernetes多集群灰度發布架構實戰經驗分享 在大規模分布式微服務架構中&#xff0c;如何在多集群環境下平滑、安全地發布新版本&#xff0c;一直是保證高可用、高可靠的關鍵需求。本文以真實生產環境案例為基礎&#xff0c;分享我們團隊基于Istio Servic…

Kubernetes(k8s)之認識Pod

01了解Pod Pod是Kubernetes創建或部署的最小/最簡單的基本單位,一個Pod代表集群上正在運行的一個進程。 一個Pod封裝一個應用容器(也可以有多個容器),存儲資源、一個獨立的網絡IP以及管理控制容器運行方式的策略選項。它可能由單個容器或多個容器共享組成的資源。 Kubern…

Nginx服務做負載均衡網關

1. 概述 內部Nginx服務器做服務網關&#xff0c;代理后端應用服務&#xff0c;卸載ssl域名證書&#xff0c;將接收的https請求&#xff0c;轉發至后端http服務。華為防火墻負責NAT&#xff0c;啟用服務器負載均衡功能&#xff0c;將公網虛擬IP端口映射到內部多臺Nginx服務器上…

十三、請求響應-請求:日期參數和JSON參數

日期參數代碼&#xff1a;日期參數 //日期時間參數RequestMapping("/dataParam")public String dataParam(DateTimeFormat(pattern "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){System.out.println(updateTime);return "OK";}結果JSON參…