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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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参…