./bin/logServer: error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or dir

本文记录了解决在CentOS环境下MySQL客户端库加载失败的问题过程。通过调整环境变量LD_LIBRARY_PATH,成功解决了执行文件因找不到libmysqlclient.so.16而无法启动的问题。
部署运行你感兴趣的模型镜像

环境: ctenos

数据库: mysql 5.5

 

程序在编译成后, 运行执行文件报如下错误:

./bin/logServer: error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory

 

查看系统相应的文件夹下面都有相应的库文件, 我就纳闷了, 编译能成功, 为啥不能执行呢? 在网上搜查了一下,使用软链接后:

[root@bogon var]# ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /usr/lib/libmysqlclient.so.16

后, 仍然不能执行。

 

修改vi /etc/ld.so.conf文件下面添加如下一行代码

/usr/lib/mysql
运行ldconfig后仍然执行不了。

 

利用strace跟踪一下执行文件

[root@002_server]$
[root@002_server]$
[root@002_server]$strace -f ./bin/logServer
execve("./bin/logServer", ["./bin/logServer"], [/* 30 vars */]) = 0
brk(0)                                  = 0xbec6000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b2f13019000
uname({sys="Linux", node="002_server", ...}) = 0
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=175710, ...}) = 0
mmap(NULL, 175710, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b2f1301a000
close(3)                                = 0
open("/lib64/tls/x86_64/libmysqlclient.so.16", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib64/tls/x86_64", 0x7fffb1509ff0) = -1 ENOENT (No such file or directory)
open("/lib64/tls/libmysqlclient.so.16", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib64/tls", 0x7fffb1509ff0)      = -1 ENOENT (No such file or directory)
open("/lib64/x86_64/libmysqlclient.so.16", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib64/x86_64", 0x7fffb1509ff0)   = -1 ENOENT (No such file or directory)
open("/lib64/libmysqlclient.so.16", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib64", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0
open("/usr/lib64/tls/x86_64/libmysqlclient.so.16", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/tls/x86_64", 0x7fffb1509ff0) = -1 ENOENT (No such file or directory)
open("/usr/lib64/tls/libmysqlclient.so.16", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/tls", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/usr/lib64/x86_64/libmysqlclient.so.16", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/x86_64", 0x7fffb1509ff0) = -1 ENOENT (No such file or directory)
open("/usr/lib64/libmysqlclient.so.16", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib64", {st_mode=S_IFDIR|0755, st_size=102400, ...}) = 0
writev(2, [{"./bin/logServer", 15}, {": ", 2}, {"error while loading shared libra"..., 36}, {": ", 2}, {"libmysqlclient.so.16", 20}, {": ", 2}, {"cannot open shared object file", 30}, {": ", 2}, {"No such file or directory", 25}, {"/n", 1}], 10./bin/logServer: error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory
) = 135
exit_group(127)                         = ?

 

发现确实是libmysqlclient.so.16库文件找不到, 仔细想想, 编译能通过,为什么执行不了呢? 难道是环境变量的原因。。。

 

那就死马当作活马医吧。 执行如下命令:

[root@002_server]$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/services/mysql/lib/mysql/

 

再执行我的可执行文件:

[root@002_server]$./bin/logServer

[root@002_server]$ps -ef|grep logServer

root     25403 21884 99 20:45 pts/1    00:45:53 ./bin/logServer
501      27765 25407  0 21:31 pts/5    00:00:00 grep logServer


OK, 问题解决。

您可能感兴趣的与本文相关的镜像

Linly-Talker

Linly-Talker

AI应用

Linly-Talker是一款创新的数字人对话系统,它融合了最新的人工智能技术,包括大型语言模型(LLM)、自动语音识别(ASR)、文本到语音转换(TTS)和语音克隆技术

<think>首先,用户的问题是关于解决zabbix_server报错:"error while loading shared libraries: libmysqlclient.so.21: cannot open shared object file: No such file or directory"。用户提供了几个引用,但这些引用主要是针对libmysqlclient.so.18和libmysqlclient.so.20的,而用户的问题是关于libmysqlclient.so.21的。我需要专注于.so.21版本的问题。 关键点: - 错误信息:找不到libmysqlclient.so.21共享库文件。 - 这通常意味着系统上没有安装该库,或者库的路径不在系统的库搜索路径中。 用户提供的引用中,引用[5]提到了libmysqlclient.so.20的错误,并给出了解决办法,但版本不同。我可以基于类似的原因给出解决方案。 常见原因: 1. **库未安装**:系统上可能没有安装MySQL客户端库的兼容版本。 2. **库路径问题**:库文件可能存在,但不在系统的库搜索路径中(例如,LD_LIBRARY_PATH)。 3. **符号链接问题**:可能存在符号链接指向错误的版本或位置。 4. **版本不匹配**:zabbix_server期望的库版本与实际安装的版本不一致。 解决方案概述: - **安装缺失的库**:确保安装了正确版本的MySQL客户端库。 - **创建符号链接**:如果安装了不同版本的库,创建一个符号链接映射到期望的版本。 - **添加库路径**:更新库配置,确保路径正确。 - **检查zabbix配置**:确保zabbix_server使用了正确的库路径。 针对libmysqlclient.so.21: - 这通常是MySQL 8.0或更高版本的库。Ubuntu/Debian系统上包名可能是libmysqlclient-dev或libmysqlclient21;CentOS/RHEL上可能是mysql-community-libs。 步骤建议: 1. **确认库是否安装**:查找libmysqlclient.so.21文件。 2. **安装库**:如果没有安装,安装匹配的包。 3. **创建符号链接**:如果有类似版本,创建链接。 4. **更新库缓存**:运行ldconfig更新共享库缓存。 5. **验证修复**:重启zabbix_server。 回答结构: - 使用中文回答。 - 结构清晰:列出步骤。 - 引用相关部分:在末尾添加引用标识。 - 生成相关问题。 确保回答真实可靠: - 基于Linux系统管理知识。 - 参考用户提供的引用,但调整到.so.21版本。 生成相关问题: - 例如:如何检查共享库路径?如何安装特定版本的库?等。 完整回答: 1. 引言:解释错误原因。 2. 步骤:逐步解决方法。 3. 结尾:生成相关问题。 </think>### 解决 zabbix_server 加载共享库 libmysqlclient.so.21 失败的方法 该错误发生在 zabbix_server 启动时,系统无法找到 MySQL 客户端共享库文件 `libmysqlclient.so.21`。这通常是由于以下原因造成的:(1) MySQL 客户端库未安装;(2) 库文件路径未正确配置;(3) 版本不匹配;(4) 符号链接缺失。错误表明 Zabbix Server 依赖于 MySQL 8.0 或更高版本(因为 `libmysqlclient.so.21` 是 MySQL 8.0 的库文件)。下面是详细的解决步骤,基于 Linux 系统通用方法(以 Ubuntu/CentOS 为例)。请确保以 root 用户执行命令。 #### 步骤 1: 确认系统是否已安装 libmysqlclient.so.21 首先检查系统中是否存在该库文件: ```bash # 搜索 libmysqlclient.so.21 文件 find / -name libmysqlclient.so.21 2>/dev/null ``` - 如果输出结果如 `/usr/lib/mysql/libmysqlclient.so.21`,说明库已安装,但路径可能未配置正确(跳到步骤 3)。 - 如果无输出或提示未找到,说明库未安装(进行步骤 2)。 #### 步骤 2: 安装缺失的 MySQL 客户端库 根据您的 Linux 发行版,安装匹配的 MySQL 客户端库包: - **Ubuntu/Debian 系统**(使用 APT 包管理器): ```bash # 更新包列表 apt update # 安装 MySQL 8.0 客户端库(libmysqlclient21 对应 .so.21) apt install libmysqlclient21 ``` - **CentOS/RHEL 系统**(使用 YUM/DNF 包管理器): ```bash # 添加 MySQL 官方仓库(如果尚未添加) yum install https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm # 安装 MySQL 客户端库 yum install mysql-community-libs ``` 安装完成后,验证库文件: ```bash ls /usr/lib*/mysql/libmysqlclient.so.21 # 默认路径 ``` 如果成功,库文件应出现在类似 `/usr/lib64/mysql/libmysqlclient.so.21` 的路径中[^1]。 #### 步骤 3: 配置共享库路径 如果库已安装但 zabbix_server 仍报错,需确保路径被系统识别: 1. **添加库路径到 ldconfig**: ```bash # 创建或编辑配置文件 echo "/usr/lib/mysql" > /etc/ld.so.conf.d/mysql.conf # 路径可能为 /usr/lib64/mysql 或 /usr/local/lib # 更新共享库缓存 ldconfig ``` 2. **检查路径是否生效**: ```bash ldconfig -p | grep libmysqlclient.so.21 ``` 如果输出包含 `libmysqlclient.so.21`,则表示配置成功[^2]。 #### 步骤 4: 创建符号链接(可选) 如果您安装了不同版本的库(如 `libmysqlclient.so.20`),但 zabbix_server 需要 `.so.21`,可以创建符号链接: ```bash # 假设库文件在 /usr/lib64/mysql/libmysqlclient.so.20 ln -s /usr/lib64/mysql/libmysqlclient.so.20 /usr/lib64/mysql/libmysqlclient.so.21 # 更新缓存 ldconfig ``` 此方法仅推荐在版本兼容时使用(例如 MySQL 8.0.x 的次版本兼容),否则优先安装正确版本[^5]。 #### 步骤 5: 重启 zabbix_server 并验证 完成上述步骤后,重启服务: ```bash systemctl restart zabbix-server # 检查日志 journalctl -u zabbix-server -f | grep "error" ``` 如果无错误输出,表示问题已解决。如果仍有问题,检查 zabbix_server 配置: ```bash # 查看 zabbix_server 依赖库 ldd /usr/sbin/zabbix_server | grep mysql ``` 输出应显示 `libmysqlclient.so.21 => /路径/...`,而非 `not found`[^3][^4]。 ### 常见问题原因总结 - **库未安装**:MySQL 8.0+ 库未安装(步骤 2)。 - **路径错误**:默认安装路径不在库搜索路径中(步骤 3)。 - **版本冲突**:Zabbix 编译时指定了高版本 MySQL,但系统安装低版本(步骤 4)。 - **权限问题**:确保库文件权限为 755(如 `chmod 755 /usr/lib/mysql/libmysqlclient.so.21`)。 此方法基于 Linux 共享库管理通用原则,适用于大多数发行版。如果您的系统环境特殊(如自定义编译 MySQL),请提供更多细节以进一步诊断[^1][^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值