先说一个我前阵子帮同事排障的真实经历:一个老项目跑了两年,突然要对接新环境,数据库换成了MySQL 8.0.33,服务一启动就报错,日志里全是Communications link failure和Public Key Retrieval is not allowed。我第一反应是防火墙、连接串写错这些常规问题,结果查了一圈,最后定位到原因是项目里引的驱动还是mysql-connector-java-5.1.47。MySQL 8.0的JDBC驱动Jar包,不是简简单单“换一个版本号”就完事,它牵扯到驱动坐标改名、认证插件变化、JDK版本要求、连接参数重置等一系列改动。这个坑我在实际项目里见过太多次,值得专门写一篇完整梳理一下。
这篇文章主要解决的问题是:MySQL 8.0的JDBC驱动Jar包到底该怎么选、怎么下、怎么在工程里正确引入和配置,以及真实环境里常见的报错怎么排查。适合正在从MySQL 5.7迁移到8.0的Java项目维护者,也适合新项目选型时想搞清楚驱动细节的后端开发。我会把驱动获取、版本对应关系、连接URL参数、批量操作性能优化这些点都串起来讲,全是实际能落地的内容。
1. 为什么MySQL 8.0必须换驱动:认证插件和连接协议的变化
MySQL 8.0一出来,其实很多团队第一反应是“数据库版本升级,JDBC驱动跟着升一下就行了”。但实际升级过程中,真正让人抓狂的往往不是SQL兼容性,而是驱动和8.0服务端之间的握手细节。如果不把这里面的变化搞明白,就算你下载了最新的驱动Jar包,也可能被各种历史遗留配置坑得怀疑人生。
1.1 8.0默认的caching_sha2_password,老驱动直接歇菜
MySQL 8.0最大的一个变化,是把默认的认证插件从mysql_native_password换成了caching_sha2_password。这个改动本身是为了安全性,因为mysql_native_password的SHA1算法已经有些年头了,在暴力破解面前不够看。但对老驱动来说,这就非常不友好了。
像5.1.x版本的驱动,安全连接下根本不认识caching_sha2_password这个插件。即使你强行把连接串指向8.0数据库,服务端也会在认证阶段返回一个驱动无法处理的插件类型,客户端直接报Unable to load authentication plugin 'caching_sha2_password'。这个报错非常有辨识度,社区里搜一下一大堆。解决办法有两个方向:
- 升级驱动到8.0.x版本,让驱动原生支持新认证插件。
- 在MySQL服务端把该用户的认证插件改回
mysql_native_password。比如执行ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'password';。
第二种做法只是权宜之计,新项目完全没必要为了迁就老驱动去削足适履地降级服务端安全策略。我建议直接换驱动。
这里有一个细节需要特别提醒:即使驱动升级到了8.0.x,如果连接串里没有显式开启allowPublicKeyRetrieval=true,并且服务端用的还是caching_sha2_password,那么客户端可能会报Public Key Retrieval is not allowed。这个参数的作用是允许客户端在安全连接尚未建立时,主动向服务端请求RSA公钥,用来加密密码传输。在很多工具里默认是关闭的,所以需要手动打开。这个我后面讲连接URL配置的时候还会细说。
1.2 驱动版本和数据库版本的对应关系,别再用5.1.x扛8.0
很多人会有一个朴素的想法:JDBC驱动和MySQL服务端版本尽量一致。这句话对MySQL来说基本靠谱,但也不能无脑照搬。
MySQL官方对Connector/J的版本策略是“低版本驱动可以连高版本数据库,但很多新特性用不了;高版本驱动通常也可以连低版本数据库,但同样会有兼容性边界”。实际项目中,最安全的组合是:数据库大版本是8.0,驱动就用8.0.x;数据库是5.7,驱动可以用5.1.x,也可以用8.0.x。但如果数据库是5.6或更老的版本,8.0驱动默认可能连接不上,因为老数据库不支持8.0驱动默认启用的一些协议特性,需要额外加参数。
我个人的经验是下面这个对照表,基本覆盖了大多数项目的情况:
| 数据库版本 | 推荐驱动版本 | 备注 |
|---|---|---|
| MySQL 5.6 | 5.1.49或8.0.x(需调参) | 8.0驱动连5.6需要关闭部分默认会话特性 |
| MySQL 5.7 | 5.1.49或8.0.x | 5.1.49是5.1系列最后的版本 |
| MySQL 8.0 | 8.0.x | 强烈建议,8.0.33之后版本维护活跃 |
| MariaDB 10.x | MariaDB Connector/J | 不要用MySQL驱动连MariaDB,会有意想不到的兼容性问题 |
注意5.1.x驱动系列的最后一个版本是5.1.49,后面官方没有继续维护5.1系列。如果你还在用5.1.47或更早的版本,又不想大动项目,至少升到5.1.49。但长期来看,只要数据库是8.0,还是尽早切到8.0.x驱动省心。
1.3 从mysql-connector-java到mysql-connector-j,官方做了一次改名
这是很多人容易忽略的地方。MySQL官方从Connector/J 8.0.31版本开始,把Maven坐标从mysql:mysql-connector-java改成了com.mysql:mysql-connector-j。注意看,groupId从mysql变成了com.mysql,artifactId从mysql-connector-java变成了mysql-connector-j。
这意味着,如果你在项目里看到mysql-connector-java不生效,去Maven仓库搜最新版本,会发现这个坐标的版本号停在了8.0.33?不,其实mysql-connector-java这个坐标的最后一个版本是8.0.33,而mysql-connector-j从
