微信做代理的网站,西宁网站建设维护,国际网站平台,池州网站优化公司推荐学习周一福利到#xff01;献上“独家全新”MySQL进阶套餐#xff0c;简直就是血赚 全网独家的“MySQL高级知识”集合#xff0c;骨灰级收藏#xff0c;手慢则无 1. 踩坑经历一个很平常的下午#xff0c;大家都在埋头认真写bug呢#xff0c;突然企业微信群里炸锅了献上“独家全新”MySQL进阶套餐简直就是血赚 全网独家的“MySQL高级知识”集合骨灰级收藏手慢则无 1. 踩坑经历一个很平常的下午大家都在埋头认真写bug呢突然企业微信群里炸锅了好多应用都出现大量的Error日志而且都报同一个错误就是下面这个Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #4 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘online_saas.t.receive_amount’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_group_by从异常信息可以看出报错的原因是因为Sql语句SELECT后面的列包含了group by后面没有的列并且没有使用聚合函数。因为近几天一直未发布所以就问运维是不是改了MySql服务器的配置打开了sql_mode里的only_full_group_by导致原本执行正常的Sql通不过检查而执行失败。最后运维说有台MySql服务器之前曾用Sql语句临时关闭过 only_full_group_by 而刚刚因为负载过高自动重启了导致sql_mode又使用了原有的默认值而MySql 5.7以后sql_mode默认是开启only_full_group_by的导致了该错误。最后运维修改了这台MySql服务器的my.cnf文件将sql_mode里的only_full_group_by关闭了重启了MySql服务器和报错的应用事情得以最终解决。为啥要重启应用呢是因为运维修改配置后各个应用还是报错所以重启了各个报错的应用。2. 原因分析假设你安装的是MySql 5.7以后的版本比如5.7.21默认情况下sql_mode里的only_full_group_by是被打开的这个打开后对Sql的语法检查就会很严格就比如上面报错的Sql语句就是因为使用GROUP BY不规范造成的。正常情况下我们使用GROUP BY语句都是下面这样的SELECT语句后的列要么是GROUP BY语句后面出现的列要么是使用了聚合函数。但如果有些地方写的不规范就会报错比如下面这样因为age列既没有出现在GROUP BY语句后也没有使用聚合函数。但如果我们将sql_mode里的only_full_group_by关闭上面报错的语句就不报错了SET GLOBAL.sql_mode STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION;注意事项如果仍然报错请打开新会话执行查询语句。还要值得注意的是上面关闭only_full_group_by的方式是临时的如果重启了MySql服务器only_full_group_by又被打开了如下所示这也是为什么MySql服务器自动重启后我们的应用开始报错的原因因为运维之前确实改过但是是临时改的重启后又被覆盖了。3. 推荐解决方案如果没有历史技术债这个开关打开也挺好的可以让大家按规范写Sql如果不规范就能及时发现。但如果有历史技术债就需要关闭only_full_group_by了而且要永久性的关闭避免MySql服务器重启后配置又被覆盖的情况。可以通过在/etc/my.cnf文件添加以下内容来永久关闭only_full_group_bysql_mode STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION修改完毕后记得重启MySql。如果重启后也不会生效检查下sql_mode的位置是不是不对(放在最后是不会生效的)作者申城异乡人原文链接https://blog.csdn.net/zwwhnly/article/details/109022654