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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql模式导致SQL生产环境执行失败相关的知识,希望对你有一定的参考价值。

参考技术A 一.问题背景

测试环境测试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-maven-plugin 忽略失败的 sql

【中文标题】如何强制 sql-maven-plugin 忽略失败的 sql【英文标题】:How to force sql-maven-plugin to ignore failling sqls 【发布时间】:2015-02-11 09:36:32 【问题描述】:

我有一个构建,它从测试环境复制模式(创建 sql)并在本地数据库上执行(使用 sql-maven-plugin)那些 sql。问题是一些视图,存储过程在测试环境中被破坏。我需要忽略损坏的 sql(有错误的视图等)并继续构建。我需要动态地执行此操作,例如我们有 sqls A、B、C 和 A sql 已损坏,我不想让整个构建失败,但添加一些警告并执行下一个 sqls B、C .. 直到结束。

这可能吗?有任何想法吗?解决方法?

【问题讨论】:

【参考方案1】:

终于找到了……

link to documentation

onError:

Action to perform if an error is found. Possible values are abort and continue.
Type: java.lang.String
Since: 1.0
Required: No
Expression: $onError
Default: abort

我添加到配置中:

<configuration>
   (...)
   <onError>continue</onError>
</configuration>

【讨论】:

以上是关于sql模式导致SQL生产环境执行失败的主要内容,如果未能解决你的问题,请参考以下文章

DataWorks开发ODPS SQL开发生产环境自动补全ProjectName

Mplabipeverify失败

同样sql,同样的执行计划在不同环境效率相差10倍

同样sql,同样的执行计划在不同环境效率相差10倍

生产环境重启oracle实例有啥影响

一次ISV诉求引出的SQL优化步骤的分享