收到告警邮件,执行mysql出错,如题,代码1390
虽然问题容易定位,但也是出了问题才了解到
对mysql各种配置所对应的限制,尤其是默认限制还是要主动了解的
mysql版本为5.6
原因
报错信息翻译过来就是
预处理 SQL语句时使用的占位符数量超过了限制
而限制默认为65535,能不能修改未知
报错的语句使用了批量插入,总的占位符数量确实超出了65535的限制,导致报错
另外,还有两个相似的配置,在批量操作或并发较多时较为关键
max_prepared_stmt_count
限制了同一时间在mysqld上所有session中prepared 语句的上限。它的取值范围为 0 - 1048576,默认为16382
经典报错方式为Error Code:1461 Can't create more than max_prepared_stmt_count statements (current value: 16382)
max_allowed_packet
设置MySQL服务器和客户端之间通信时可接收数据包的上限(读写),包括主从复制。
如果一条语句插入数据过多,不触发占位符的限制也会触发此限制
当然,不止是写操作,查询也受此配置的限制,当查询结果数据量超过此配置,也会触发Error Code:1153 Got a packet bigger than 'max_allowed_packet' byte
解决方法
拆分操作,将单一语句拆分为多条执行
参考链接
MySQL Prepared SQL Statement Syntax
MySQL Replication and max_allowed_packet
原文链接