Mysql客户端连接是报错:1045-Access denied for user

一、问题描述

某次一线登录Mysql报错:1045-Access denied for user;后来查看发现本地mysql登录也异常,报错:error while loading shared libraries:libncurses .so .5:canot open shared object file:No such file or directory;

在这里插入图片描述
在这里插入图片描述
相关资源Linux指定动态库搜索路径Understanding Shared Libraries in Linux

二、处理

1)日志很明显,就是找不到共享库文件了,那mysql或Linux应用加载库文件的优先级是怎样的呢?

在linux中,要想明确不同程序/文件/动态库之间的依赖关系,可通过一些命令工具验证:

在这里插入图片描述
在这里插入图片描述
常用:strace, ldd,libtree,readelf,objdump;其中:

  • strace 的用法:strace -fyyo test.txt -s 256 bin/xxx #记录bin/xxx程序运行时的状态,将进程信息记录到test.txt文件中
  • ldd用法:ldd 执行程序xxx #将可执行程序xxx所依赖的so库列出来,包括so库所在路径,但不会列出so库与so库之间的依赖关系
  • libtreee的用法:libtree 执行程序xxx #列出来可执行程序xxx所需要的so库,同时也可以列出不同so库之间的依赖关系。以及so库的来源
  • readelf的用法:readelf -d xxx #该工具也可以查看xxx所需的so库,同时查看rpath,但未显示so库的路径
  • objdump的用法: objdump -p xxx #列出xxx所直接依赖的so库,但是没有列出so库背后所依赖的动态库,即仅静态的从程序看依赖项

动态库的依赖顺序基本如下:
在这里插入图片描述
其中,rpath(RunPath)中如果指定使用$ORIGIN,就能在包含应用程序的目录的lib下查找,否则查OS的;RPATH是编译时设置在可执行文件中的路径,它指定了程序运行时应该搜索库文件的位置。如果可执行文件包含RPATH,那么链接器会首先按照RPATH指定的路径来搜索所需的库;可以通过readelf -d | grep rpath,来查看so库是否指定了rpath。

环境变量LD_PRELOAD 指定的库文件会在其他库文件之前被加载,这意味着它们会优先于其他库文件被调用。这可以用来覆盖系统默认的库文件,或者在程序运行时临时加载额外的库文件。

环境变量LD_LIBRARY_PATH,用户可以在运行时设置以添加额外的库搜索路径。它的优先级低于RPATH,但高于系统的配置文件和默认路径, 这个只临时有效,一般只针对当前终端或者进程有效;比如:export LD_PRELOAD=/path/to/your/libexample.so.1export LD_LIBRARY_PATH=/path/to/library/directory:$LD_LIBRARY_PATH

配置文件/etc/ld.so.conf(ld.conf):它是系统的库配置文件,包含了系统级别的库搜索路径链接器会读取这个文件,并按照其中列出的路径来搜索库。

缓存文件/etc/ld.so.cache:这个文件是/etc/ld.so.conf和所有.conf文件的缓存,由ldconfig命令生成。链接器会首先检查这个缓存文件,以快速找到库文件。这个文件的优先级实际上与/etc/ld.so.conf相同,但是因为它是一个缓存,所以可以加快库的搜索速度。

如果以上路径都没有找到所需的库,链接器会回退到一些默认的系统路径,如/lib、/lib64/usr/lib、/usr/lib64/等,外部应用优先默认/usr/lib或者/usr/lib64,这些路径是硬编码在链接器中的。

综上: LD_PRELOAD > RPATH (一般没有指定,或默认指定/usr/lib64) > LD_LIBRARY_PATH > /etc/ld.so.conf 文件和 /etc/ld.so.conf.d 目录中指定的库文件 > /lib 和 /usr/lib 目录中的库文件,且对于大部分非系统内置应用来说,前4个基本不涉及,64位的应用直接会在/lib64和/usr/lib64下查找so文件,且部分系统/lib64目录就是/usr/lib64的链接目录,即64位应用找/usr/lib64,否则找/usr/lib。

2)本案中,指向为mysql所依赖的libncurses.so版本问题,默认依赖的版本是libncurses.so.5,但是系统上libncurses.so的版本不是5导致的。可以在/usr/lib64文件夹下查找当前系统的libncurses.so版本,现场为ibncurses.so.6.3和libtinfo.so.6.3

处理:综上,我们秩序做上述两个so文件的软连接到/lib64/或/usr/lib64下即可。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ximenjianxue/article/details/141637232