美文网首页
sql模式导致SQL生产环境执行失败

sql模式导致SQL生产环境执行失败

作者: 牛红磊 | 来源:发表于2017-10-27 17:05 被阅读0次

一.问题背景

测试环境测试SQL没有问题,但是上生产环境之后,sql执行报错

二.现象

生产环境:点击‘一键还款确认’按钮,显示‘发起还款确认失败’。监控系统发送邮件抱错‘BadSqlGrammarException’,

Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: In aggregated query without GROUP BY, expression #2 of SELECT list contains nonaggregated column 'malm.t.buy_back_date'; this is incompatible with sql_mode=only_full_group_by ### The error may exist in class path resource [mybatis/financial/customized/BuybackDao.xml] ### The error may involve

三.分析

查询的SQL为:

select

sum(a.advance_amount) as advanceSumAmount,

COUNT(1) as countNum,

sum(a.expected_principal_amount) as expectedPrincipalAmount,

sum(a.expected_interest_amount) as expectedInterestAmount,

sum(a.expected_fine_amount) as expectedFineAmount,

sum(a.expected_service_amount) as expectedServiceAmount,

a.pay_date as payDate

from tb_loan_prepayment a

where a.capital_id = 2

AND a.STATUS = 5

AND a.pay_date BETWEEN '2017-10-27' AND '2017-10-27 23:59:59';

该sql在测试环境运行时没有报错的,并且能够正确地返回结果。那为什么到了生产环境就不能执行呢?原因在于两个环境使用的SQL_Mode不同。

sql模式定义了MySQL应支持的SQL语法,以及应该在数据上执行何种确认检查。我们可以使用 select @@sql_mode; 来查看mysql使用的模式。

以下为测试环境的执行结果(STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION)

以下为生产环境的执行结果(ONLY_FULL_GROUP_BY,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_B

Y就是导致以上现象的问题所在。其限制为:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中。

四.解决:

方法1)在应用中修改sql语法问题,添加GROUP BY条件。

方法2)将生产环境的sql模式同步到测试环境。同步以后保证两个环境无差异,可以有效防止其他同事或其他sql限制造成该问题

相关文章

  • sql模式导致SQL生产环境执行失败

    一.问题背景 测试环境测试SQL没有问题,但是上生产环境之后,sql执行报错 二.现象 生产环境:点击‘一键还款确...

  • 数据库相关异常分析

    起因 最近一段时间,生产系统持续碰到一些数据库异常,导致 sql 执行失败。 应用环境 Java 1.7 + My...

  • 【MySQL】sql优化小调优一例

    前言:今天在生产环境抓到慢SQL一例,单独拿出来执行速度非常快,我们拿出该SQL分析一下。 原始SQL: 执行计划...

  • Flyway数据迁移工具使用和安装

    以前生产环境数据库增加字段是写一个sql放入本地,到时候部署生产环境的时候先手动执行sql,在部署项目。Flywa...

  • java面试题 --- MySQL③

    1. 生产环境中一条 SQL 执行特别慢,你要如何排查问题?可以查看 SQL 的执行计划。 2. 执行计划怎么用?...

  • sql审核-避免离线sql导致的db集群故障

    关键词: sql审核、sql审批、sql检查、sql检测、sql执行 离线sql可能会导致的问题 首先,什么是离线...

  • DBeaver导入脚本中文乱码

    改用 SQL 编辑器 如果是普通执行SQL 模式会报错,需要执行脚本模式

  • 复杂SQL的子查询性能问题

    复杂SQL的子查询中的多表关联,执行计划中表连接顺序不一样,导致sql执行效率降低。 案例1: 问题背景:测试环境...

  • sql注入与sql预处理

    sql注入 什么是SQL注入 sql注入是指用户通过传递一些非法参数导致sql语句未按预想效果执行,从而导致用户能...

  • sql注入

    sql注入是指把sql关键字以变量的形式拼接到要执行的sql中,导致sql的执行效果发生变化。 非法字符:’ or...

网友评论

      本文标题:sql模式导致SQL生产环境执行失败

      本文链接:https://www.haomeiwen.com/subject/ttcdpxtx.html