客户采用mysql作为华丹数据分析平台的系统库。
在进行大数据导出时报错:
charisma.sys.exception.CharismaException: 数据库操作错误:errcode=0,sqlstate=S1000
com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (14,032,319 > 4,194,304). You can change this value on the server by setting the 'max_allowed_packet' variable.
当前异常的源异常(根异常)详细信息为:
com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (14,032,319 > 4,194,304). You can change this value on the server by setting the 'max_allowed_packet' variable.
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:107)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:970)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1109)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1057)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1377)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1042)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:384)
按错误提示分析,出现问题的原因是批量插入数据量过大,MySQL根据配置文件会限制Server接受的数据包大小。有时候插入、更新或查询时数据包的大小,会受 max_allowed_packet 参数限制,导致操作失败。
在mysql.ini(linux下为mysql.cnf)加上
max_allowed_packet = 524288000
说明:
500*1024*1024 =524288000=500M
修改完成后重启mysql,仍出错,错误信息为:
charisma.sys.exception.CharismaException:数据库操作错误:errcode=1118,sqlstate=42000
java.sql.SQL SyntaxErrorException:The size of BLOB/TEXT data inserted in one transaction is greater than 10% of redo log size. Increase the redo log size using innodb log?_file_size.
显然不能继续更改参数,必须找到哪里导致产生这么大的更改数据。
从错误信息看是update blob时出的问题,分析后发现,原来客户在利用华丹WEB报表平台作查询模块时,在报表设置中,将该业务报表设成了“自动缓存结果”。该选项是用于实时性不强、比较耗时的汇总类查询,且结果条件不多,一般几十条,几百条时进行缓存处理,这样以后相同条件查询时,可以不必再次查询数据,直接从缓存结果中读出。
但是客户的应用场景,该报表只是一般的查询类报表,且数据量很大,几十万,而需要经常导出,查询时进行缓存处理,往数据库中写入缓存数据过大才导致上述错误。显然这类报表不适用“自动缓存结果”。
在WEB报表设计器中将“自动缓存结果”设成“否”后,问题解决。
在华丹WEB报表平台新版中,我们会对这一情况进行优化限制。同时客户也要注意不要随意设定自动缓存结果,只有符合前述标准时才自动缓存。