使用JDBC连接带有ProxySQL中间件的mysql发生错误:Unknown system variable ‘query_cache_size’
最近在客户的服务器上部署程序的时候发现一个springboot的项目启动报错,主要的错误就是java.sql.SQLException: Unknown system variable ‘query_cache_size’。
根据官方的说法是 :
The query cache is deprecated as of MySQL 5.7.20, and is removed in MySQL 8.0. Deprecation includes query_cache_size.
意思是query cache在MySQL5.7.20就已经过时了,而在MySQL8.0之后就已经被移除了
但是我们服务器和驱动的版本均为8.0.25,尽管如此我门依然尝试使用不同的版本进行测试
在测试几个版本后并没有成功,于是我们换了一种排查思路。
我尝试在客户端直接连接使用mysql,发现控制台连接是可以正常使用的,断定问题出现在JDBC与mysql的连接上,在控制台首次连接mysql的时候发现显示了这样一条语句:Server version: 5.5.30 (ProxySQL),发现客户的DBA在mysql服务器上使用了中间件ProxySQL,且版本号与mysql的版本并不一致。在谷歌上搜索一番后看到了一个解释的比较清楚的帖子。对于这个错误的解释如下:
mysql的连接器会在连接的时候发送"SHOW VARIABLES",然后根据这个命令的结果来配置连接,
在 MysqlaSession.loadServerVariables() 类中,该方法将决定哪些变量应该被包含,哪些不应该被包含。真正导致连接失败的原因是如下的代码:
``
if (versionMeetsMinimum(8, 0, 3)) {
queryBuf.append(", @@have_query_cache AS have_query_cache");
} else {
queryBuf.append(", @@query_cache_size AS query_cache_size");
queryBuf.append(", @@query_cache_type AS query_cache_type");
}
``
可以看到,如果版本在 8.0.3以下,读取 query_cache_size 和query_cache_type。
所以我们调整ProxySQL的版本就可以解决这个问题,
ProxySQL 的好处之一是大部分重要设置都可以动态更改,在这里插入代码片包括服务器版本
执行如下的命令即可更改版本
update global_variables set variable_value="8.0.4 (ProxySQL)" where variable_name='mysql-server_version';
load mysql variables to run;save mysql variables to disk;
最后尝试启动我们的服务,并没有报错,服务成功启动
附上帖子链接:http://www.tusacentral.net/joomla/index.php/mysql-blogs/198-proxysql-server-version-impersonation.html