Percona Toolkit工具连接MySQL 8报错的解决方案
使用Percona Toolkit的工具连接MySQL 8.x数据库时,会遇到类似”failed: Plugin caching_sha2_password could not be loaded: lib64/mariadb/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory at /usr/bin/pt-show-grants line 1367“这样的错误,如下案例所示:
#pt-find --ctime +2 --engine InnoDB -u monitor --ask-pass
Enter password:
DBI connect(';;mysql_read_default_group=client','monitor',...) failed: Plugin caching_sha2_password could not be loaded: lib64/mariadb/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory at /usr/bin/pt-find line 323.
遇到这个错误是因为MySQL 8.0(8.0.4)引入了caching_sha2_password插件并将其作为默认的身份验证插件,而当前Percona Toolkit(Percona Toolkit 3.2.1是当前最新版本)的工具依赖的MySQL驱动程序尚不支持caching_sha2_password这这种身份验证,所以报这个错误。例如pt-find使用的驱动为MySQL driver for Perl (DBD::mysql)(perl-DBD-MySQL)
解决方案:
1:更改用户的密码插件为mysql_native_password
mysql> select user,host ,plugin from mysql.user where user='monitor';
+---------+-----------+-----------------------+
| user | host | plugin |
+---------+-----------+-----------------------+
| monitor | localhost | caching_sha2_password |
+---------+-----------+-----------------------+
1 row in set (0.00 sec)
mysql> alter user monitor@'localhost' identified with mysql_native_password by '************';
Query OK, 0 rows affected (0.07 sec)
这种方法就是让MySQL使用mysql_native_password插件认证密码,这些驱动自然支持这种方式连接MySQL数据库。
2:修改MySQL的全局配置
在my.cnf配置文件中设置default_authentication_plugin=mysql_native_password 后重启MySQL数据库实例。这是一种不太安全的做法,按理说只需修改Percona Toolkit的工具使用的账号即可。但是这种方法修改的是MySQL的全局配置。影响范围扩大,不推荐使用
[mysqld]
default_authentication_plugin=mysql_native_password
3:更新驱动
MySQL 8.0.4开始默认使用caching_sha2_password作为身份验证插件. caching_sha2_password和 sha256_password认证插件提供比mysql_native_password插件更安全的密码加密方式 ,并且使用caching_sha2_password的性能比sha256_password更好。如果我们修改用户的密码插件为mysql_native_password,似乎有点开倒车的感觉。其实这个问题也好解决,如果我们想用新的密码验证方式,那么我们可以安装高版本的驱动。这些驱动支持这种方式。
如下所示,当前测试环境,perl-DBD-MySQL模块依赖的类库为/usr/lib64/mysql/libmysqlclient.so.18。在CentOS/RHEL/OL 7上,默认情况下,perl-DBD-MySQL要么链接到旧版本的mariadb-libs(5.5),或链接mysql-community-libs-compat下的类库。
[root@KerryDB ~]# more /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@KerryDB ~]# ldd /usr/lib64/perl5/vendor_perl/auto/DBD/mysql/mysql.so | grep 'mysql\|maria'
libmysqlclient.so.18 => /usr/lib64/mysql/libmysqlclient.so.18 (0x00007f48b0724000)
[root@KerryDB ~]# rpm -qf /usr/lib64/mysql/libmysqlclient.so.18
mysql-community-libs-compat-8.0.18-1.el7.x86_64

此版本(libmysqlclient.so.18)不支持新的身份验证插件。至少需要有libmysqlclient.so.21或libmariadb.so.3 或以上版本的类库才支持caching_sha2_password认证方式。 所以,我可以下载博客Perl & MySQL 8.0中的perl-DBD-MySQL-4.044-1.el7_.x86_64.zip 或perl-DBD-MySQL-4.050-1.el7.x86_64.rpm组件。
https://lefred.be/wp-content/uploads/2019/06/perl-DBD-MySQL-4.044-1.el7_.x86_64.zip
https://lefred.be/wp-content/uploads/2020/08/perl-DBD-MySQL-4.050-1.el7.x86_64.rpm
具体安装过程如下, 安装完成后,Percona Tookkit就能正常连接MySQL 8了
[root@KerryDB tmp]# rpm -ivh perl-DBD-MySQL-4.044-1.el7.x86_64.rpm #此处报冲突,因为 perl-DBD-MySQL-4.023-6.el7.x86_64与perl-DBD-MySQL-4.044-1.el7.x86_64.rpm冲突了。
Preparing... ################################# [100%]
file /usr/lib64/perl5/vendor_perl/Bundle/DBD/mysql.pm from install of perl-DBD-MySQL-4.044-1.el7.x86_64 conflicts with file from package perl-DBD-MySQL-4.023-6.el7.x86_64
file /usr/lib64/perl5/vendor_perl/DBD/mysql.pm from install of perl-DBD-MySQL-4.044-1.el7.x86_64 conflicts with file from package perl-DBD-MySQL-4.023-6.el7.x86_64
file /usr/lib64/perl5/vendor_perl/DBD/mysql/GetInfo.pm from install of perl-DBD-MySQL-4.044-1.el7.x86_64 conflicts with file from package perl-DBD-MySQL-4.023-6.el7.x86_64
file /usr/lib64/perl5/vendor_perl/DBD/mysql/INSTALL.pod from install of perl-DBD-MySQL-4.044-1.el7.x86_64 conflicts with file from package perl-DBD-MySQL-4.023-6.el7.x86_64
file /usr/lib64/perl5/vendor_perl/auto/DBD/mysql/mysql.so from install of perl-DBD-MySQL-4.044-1.el7.x86_64 conflicts with file from package perl-DBD-MySQL-4.023-6.el7.x86_64
file /usr/share/man/man3/Bundle::DBD::mysql.3pm.gz from install of perl-DBD-MySQL-4.044-1.el7.x86_64 conflicts with file from package perl-DBD-MySQL-4.023-6.el7.x86_64
file /usr/share/man/man3/DBD::mysql.3pm.gz from install of perl-DBD-MySQL-4.044-1.el7.x86_64 conflicts with file from package perl-DBD-MySQL-4.023-6.el7.x86_64
file /usr/share/man/man3/DBD::mysql::INSTALL.3pm.gz from install of perl-DBD-MySQL-4.044-1.el7.x86_64 conflicts with file from package perl-DBD-MySQL-4.023-6.el7.x86_64
[root@KerryDB tmp]# rpm -Uvh perl-DBD-MySQL-4.044-1.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:perl-DBD-MySQL-4.044-1.el7 ################################# [ 50%]
Cleaning up / removing...
2:perl-DBD-MySQL-4.023-6.el7 ################################# [100%]
[root@KerryDB tmp]#

当然,我们也可以下载源码安装,下载地址如下,但是最好使用cpan安装(cpan -f DBD::mysql),如果手工安装的话,各种依赖项缺少,会让你抓狂! 下面是我的一个源码安装的折腾过程。
https://cpan.metacpan.org/authors/id/D/DV/DVEEDEN/
从如下链接下载了DBD-mysql-4.050.tar.gz
https://cpan.metacpan.org/authors/id/D/DV/DVEEDEN/DBD-mysql-4.050.tar.gz
# tar -xzvf DBD-mysql-4.050.tar.gz
# cd DBD-mysql-4.050
# perl Makefile.PL
Can't locate Devel/CheckLib.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at Makefile.PL line 12.
BEGIN failed--compilation aborted at Makefile.PL line 12.
如上所示,遇到这个错误,是因为没有安装perl-Devel-CheckLib包,缺少相关依赖组件。在安装包的文件META.json中,你就可以看到安装这个需要安装哪些组件。如下截图所示:

[root@KerryDB DBD-mysql-4.050]# yum list | grep "perl-Devel-CheckLib"
perl-Devel-CheckLib.noarch 0.99-2.el7 base
[root@KerryDB DBD-mysql-4.050]# yum list installed | grep "perl-Devel-CheckLib"
[root@KerryDB DBD-mysql-4.050]# yum install perl-Devel-CheckLib
接下来又遇到了“Can't exec "mysql_config": No such file or directory at Makefile.PL line 89”这个错误
[root@KerryDB DBD-mysql-4.050]# perl Makefile.PL
Can't exec "mysql_config": No such file or directory at Makefile.PL line 89.
Cannot find the file 'mysql_config'! Your execution PATH doesn't seem
not contain the path to mysql_config. Resorting to guessed values!
PLEASE NOTE:
For 'make test' to run properly, you must ensure that the
database user 'root' can connect to your MySQL server
and has the proper privileges that these tests require such
as 'drop table', 'create table', 'drop procedure', 'create procedure'
as well as others.
mysql> grant all privileges on test.* to 'root'@'localhost' identified by 's3kr1t';
You can also optionally set the user to run 'make test' with:
perl Makefile.PL --testuser=username
Can't exec "mysql_config": No such file or directory at Makefile.PL line 603.
Can't find mysql_config. Use --mysql_config option to specify where mysql_config is located
Failed to determine directory of mysql.h. Use
perl Makefile.PL --cflags=-I<dir>
to set this directory. For details see DBD::mysql::INSTALL,
section "C Compiler flags" or type
perl Makefile.PL --help
[root@KerryDB mysql]# which mysql_config
/usr/bin/which: no mysql_config in (/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
[root@KerryDB DBD-mysql-4.050]# locate mysql_config
/usr/bin/mysql_config_editor
/usr/share/man/man1/mysql_config_editor.1.gz
查一下相关资料,解决这个问题要么安装libmysqlclient-dev,要么在系统中查找mysql_config文件,在源码安装过程中加上参数选项(如下所示),具体情况根据你的环境而定,有可能你在源码安装过程还会遇到比我更多的错误。
# perl Makefile.PL --mysql_config=/usr/bin/mysql_config_editor
#make
#make test
#make install
更多安装相关资料,可以参考文档https://metacpan.org/pod/DBD::mysql::INSTALL。
参考资料:
https://lefred.be/content/perl-mysql-8-0/
https://www.percona.com/doc/percona-monitoring-and-management/2.x/manage/conf-mysql-ps8.html
Percona Toolkit工具连接MySQL 8报错的解决方案的更多相关文章
- 连接mysql数据库报错java.sql.SQLException: The server time zone value '�й���ʱ��' is unrecognized...解决方法
今天连接mysql数据库报错如下: java.sql.SQLException: The server time zone value '�й���ʱ��' is unrecognized or r ...
- 关于springboot 连接mysql 数据库报错问题
springboot连接MySQL运行报错: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more ...
- idea启动服务连接mysql后 Navicat连接mysql就报错2013-Lost connection toMySQL server at
我是使用navicat的windows端 连接centos下mysql服务器 第一次常规连接mysql正常,idea启动服务连接mysql后 Navicat连接mysql就报错2013-Lost co ...
- 解决Navicat连接MySQL总是报错1251的方法
今天下了个 MySQL8.0,发现Navicat连接不上,总是报错1251: 原因是MySQL8.0版本的加密方式和MySQL5.0的不一样,连接会报错. 试了很多种方法,终于找到一种可以实现的: 更 ...
- JDBC driver连接MySQL运行报错The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than
出错原因: 因为安装mysql的时候时区设置的不正确. mysql默认的是美国的时区,而我们中国大陆要比他们迟8小时,采用GMT+8:00格式. 也就是说是数据库和系统时区差异所造成的. 验证:运行c ...
- [大数据技术]Kettle初次连接MySQL数据库 报错问题 错误连接数据库 Error occured while trying to connect to the database Exception while loading class org.gjt.mm.mysql.Driver
报错内容如下: 错误连接数据库 [foodmartconn] : org.pentaho.di.core.exception.KettleDatabaseException: Error occure ...
- 连接mysql客户端报错: java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'
报这个错可能是因为用了低版本的的客户端.驱动连接高版本的mysql服务器. 解决方式有三种:升级客户端版本.修改服务端认证方式和适应服务端认证方式. 我是通过升级客户端版本解决,参考一下链接: Upg ...
- Node.js连接MySQL数据库报错
解决Node.js第一次连接MySQL数据库时出现[SELECT ERROR] - ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authen ...
- jmeter连接mysql数据库报错Cannot create PoolableConnectionFactory (Could not create connection to database server.)
今天在学习jmeter的jdbc取样器,发现在配置完JDBC Connection Configuration和JDBC Request后,点击运行.在查看结果树中显示响应数据: Cannot cre ...
随机推荐
- 搜索引擎学习(二)Lucene创建索引
PS:需要用到的jar包: 代码实现 1.工程结构 2.设置工程依赖的jar包 3.代码实现 /** * Lucene入门 * 创建索引 */ public class CreateIndex { / ...
- NodeJS沙箱逃逸&&vm
NodeJS沙箱逃逸 关于nodejs的沙箱 使用场景 在线代码编辑器 第三方js代码 jsonp,like百度搜索框 https://www.baidu.com/s?wd=nodejs&mi ...
- pormise和async
pormise 1.异步问题 假设现在我刚认识你,需要和你说话,但是我普通话不够标准,需要间隔一秒钟才能说一句话,以此让你可以慢慢思考.这样的话我们就需要用到定时器. 最沙雕的代码如下: setTim ...
- pytest封神之路第六步 断言技巧
pytest的断言把Python语言简洁的优点发挥的淋漓尽致,因为它用的就是Python的标准断言assert. assert基础 assert用法 assert_stmt ::= "ass ...
- Python-判断变量类型和继承链-type isinstance
在很多情况下,需要对类型进程动态判断,因为不同的数据类型不能互相做运算并且各自拥有不同的运算逻辑,所有需要判断对象的类型,常用的是type和isinstance,type更过用于获取对象是什么类型构建 ...
- 剑指offer-链表&数组
1.圆圈中最后剩下的数 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈. ...
- 实验 3:Mininet 实验——测量路径的损耗率
一.实验目的 在实验 2 的基础上进一步熟悉 Mininet 自定义拓扑脚本,以及与损耗率相关的设定;初步了解 Mininet 安装时自带的 POX 控制器脚本编写,测试路径损耗率. 二.实验任务 h ...
- 034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述
034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述 本文知识点:Java中的流程控制相关概念的认识 三大流程控制语句结构的简介 顺序 ...
- shell-添加条件测试的多种方法语法介绍与简单实战
1. 条件测试 1) 测试语句 1) 条件测试语法 在bash的各种流程控制结构中通常要进行各种测试,然后根据测试结果执行不同的操作,有时也会通过与if等条件语句相结合,使我们可以方便的完成判断. ...
- C# 中 System.Index 结构体和 Hat 运算符(^)的全新用法
翻译自 John Demetriou 2019年2月17日 的文章 <C# 8 – Introducing Index Struct And A Brand New Usage For The ...