Traceback (most recent call last):
File "/usr/bin/yum", line 61, in <module>
from dnf.cli import main
File "/usr/lib/python3.9/site-packages/dnf/__init__.py", line 30, in <module>
import dnf.base
File "/usr/lib/python3.9/site-packages/dnf/base.py", line 29, in <module>
import libdnf.transaction
File "/usr/lib64/python3.9/site-packages/libdnf/__init__.py", line 8, in <module>
from . import error
File "/usr/lib64/python3.9/site-packages/libdnf/error.py", line 13, in <module>
from . import _error
ImportError: /opt/openGauss/install/om/script/gspylib/clib/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by /usr/lib64/libdnf.so.2)
报错原因分析
yum/dnf 执行时优先加载了 openGauss 自带的
核心冲突:
libstdc++.so.6,这个库版本过低,缺少 GLIBCXX_3.4.26 符号,系统自带的高版本标准库被覆盖,导致 dnf 初始化失败。
LD_LIBRARY_PATH 环境变量里包含 /opt/openGauss/install/om/script/gspylib/clib/,优先加载了数据库自带旧 C++ 标准库。方案 1:临时修复(立刻能用 yum,临时生效)
1. 清空冲突的 LD_LIBRARY_PATH,临时执行 yum
bash
运行
LD_LIBRARY_PATH="" yum list
这条命令会临时屏蔽 openGauss 的库路径,yum/dnf 正常调用系统自带
libstdc++.so.6。2. 验证系统库是否支持 GLIBCXX_3.4.26
bash
运行
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
正常系统库会输出包含
GLIBCXX_3.4.26,证明系统库没问题,只是被 opengauss 的库覆盖。方案 2:永久修复(推荐,根治问题)
步骤 1:定位环境变量配置文件
opengauss 安装时会在
查看哪些文件配置了该路径:
/etc/profile、~/.bashrc、/opt/openGauss/.../env 写入 LD_LIBRARY_PATH。
bash
运行
grep -r "/opt/openGauss/install/om/script/gspylib/clib" /etc/profile ~/.bashrc /etc/profile.d/
步骤 2:修改环境变量,把系统库放前面,或仅数据库用户生效
两种修改思路二选一:
方式 A:全局配置调整(所有用户)
找到类似这行:
bash
运行
export LD_LIBRARY_PATH=/opt/openGauss/install/om/script/gspylib/clib:$LD_LIBRARY_PATH
改成系统库优先:
bash
运行
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/openGauss/install/om/script/gspylib/clib
把 opengauss 路径放到末尾,系统原生库优先加载。
方式 B:仅 opengauss 数据库用户加载(更干净)
不要在
/etc/profile 全局配置,只在 omm 用户的 .bashrc 里配置,root/yum 不受影响。步骤 3:重载环境变量
bash
运行
source /etc/profile
# 或退出重新登录服务器
步骤 4:验证 yum 恢复正常
bash
运行
yum clean all
yum makecache
方案 3:如果不能改环境变量(生产数据库不能动配置)
执行 yum 时封装别名,永久屏蔽冲突库:
bash
运行
echo "alias yum='LD_LIBRARY_PATH=\"\" yum'" >> /etc/bashrc
source /etc/bashrc
之后直接敲
yum 就会自动清空 LD_LIBRARY_PATH,不会报错。补充说明
- 不要替换系统
/usr/lib64/libstdc++.so.6,容易系统崩溃; - openGauss 旧版自带的 libstdc++ 版本偏低,只给数据库进程用即可,不能全局前置;
- 若切换到 omm 用户执行 gs_om、gsctl 等数据库命令,环境变量保持原样不影响数据库运行。