2021-07-29

使用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

<think>好的,我现在遇到了一个npm运行时的错误,提示“Missing script: 'dev’”。我需要解决这个问题。首先,我应该理解这个错误的原因。通常,当在package.json文件的scripts部分中没有定义对应的脚本时,运行npm run dev就会报这个错误。 首先,我需要检查项目的package.json文件是否存在,以及其中的scripts字段是否有dev这个脚本。如果用户的项目中没有正确配置dev脚本,或者package.json文件本身有错误,比如格式不正确,都可能导致这个问题。 接下来,我应该回忆常见的解决方法。根据之前看到的引用[2]中的内容,当遇到node版本或其他依赖问题时,可能需要重新安装依赖或调整package.json。但这里的问题更直接,是脚本缺失。所以可能的解决步骤包括: 1. 检查package.json中的scripts部分,确认是否有dev脚本的定义。如果没有,需要手动添加,例如:"dev": "vite"或其他适合项目的命令,如webpack serve等。 2. 如果用户的项目使用像Vue或React这样的框架,可能需要安装对应的脚手架工具,或者检查是否有配置文件缺失。例如,Vite项目通常会在scripts中定义dev命令。 3. 如果package.json存在语法错误,比如缺少逗号或引号,npm可能无法正确解析,导致脚本无法识别。此时需要修复JSON格式。 4. 有时候可能需要重新安装node_modules,因为损坏的依赖可能导致脚本无法正确加载。删除node_modules和package-lock.json后重新执行npm install可能有效。 5. 如果用户使用的是旧版npm,某些脚本的注册可能会有问题,更新npm版本也可能有帮助。 另外,可能需要考虑用户的项目类型。例如,如果用户在使用Vue CLI创建的项目,dev脚本可能被start或serve替代。或者,用户可能错误地删除了脚本配置。需要指导用户正确配置脚本。 根据引用[2]中的步骤,比如删除node_modules,重新安装依赖,可能也是相关的,尤其是当依赖安装不完整时,某些命令行工具可能没有正确安装,导致脚本执行失败。例如,如果dev脚本依赖于某个包(如vite或webpack-dev-server),而这些包未安装,那么即使脚本存在,运行也会失败。这时候需要确保相关依赖在devDependencies中正确安装。 总结可能的解决方案步骤: 1. 检查并修正package.json中的scripts部分。 2. 确保必要的开发依赖已安装。 3. 清理并重新安装依赖。 4. 检查JSON语法是否正确。 5. 更新npm版本。 需要将这些步骤以清晰的方式呈现给用户,同时指出可能的具体操作,例如如何编辑package.json,如何运行安装命令等。此外,可能需要根据用户的具体框架(如React、Vue等)给出更具体的建议,比如使用create-react-app或vue-cli-service等工具生成的默认脚本配置。</think>要解决`npm run dev`命令中出现的“Missing script: 'dev'”错误,需检查并确保`package.json`中已正确定义`dev`脚本。以下是分步解决方案: ### 1. 确认`dev`脚本是否存在于`package.json` 打开项目根目录下的`package.json`文件,检查`scripts`字段是否包含`dev`命令。 **示例正确配置**: ```json { "scripts": { "dev": "vite", // 或"webpack serve"、"react-scripts start"等 "build": "vite build" } } ``` - 若没有`dev`脚本,需手动添加。具体命令取决于项目框架(如Vite、Webpack、React等)[^1]。 --- ### 2. 安装必要的开发依赖 若`dev`脚本依赖特定工具(如`vite`或`webpack-dev-server`),需确保已安装对应包: ```bash # 以Vite为例 npm install vite --save-dev # 或Webpack npm install webpack webpack-dev-server --save-dev ``` --- ### 3. 清理并重新安装依赖 依赖损坏可能导致脚本无法识别,尝试以下步骤: ```bash rm -rf node_modules # 删除旧依赖 rm package-lock.json # 清除锁定文件(谨慎操作) npm install # 重新安装依赖 ``` --- ### 4. 检查`package.json`语法 JSON格式错误(如缺少逗号或引号)会阻止脚本解析。使用工具验证语法: ```bash npm pkg get scripts # 验证是否能正确读取scripts字段 ``` - 推荐使用[JSONLint](https://jsonlint.com/)在线校验。 --- ### 5. 更新npm版本 旧版npm可能存在兼容性问题,更新至最新版: ```bash npm install -g npm@latest ``` --- ### 6. 框架特定配置(示例) - **Vue/React项目**:若通过脚手架创建,尝试恢复默认配置: ```bash npx create-react-app my-app --template typescript # React示例 ``` - **Vite项目**:确保`vite.config.js`存在且`dev`脚本指向正确命令。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值