myql mysql_stmt_prepare failed! 问题处理

 : jank    :   : 1993    : 2021-03-02 10:12  mysql

昨天不小心在测试环境出现了一条这个日志

mysql_stmt_prepare failed! error(1461)Can't create more than max_prepared_stmt_count statements (current value: 16382)

通过查询mysql stmt 信息发现如下日志

MariaDB [(none)]> show global status like '%stmt%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Binlog_stmt_cache_disk_use | 0     |
| Binlog_stmt_cache_use      | 0     |
| Com_stmt_close             | 52511  |
| Com_stmt_execute           | 104841 |
| Com_stmt_fetch             | 0     |
| Com_stmt_prepare           | 155711 |
| Com_stmt_reprepare         | 0     |
| Com_stmt_reset             | 0     |
| Com_stmt_send_long_data    | 0     |
| Prepared_stmt_count        | 16382    |
+----------------------------+-------+

其中以上各字段含义:

    Com_stmt_close :  prepare 语句总共关闭的次数

    Com_stmt_execute: prepare 语句总共运行的次数

    Com_stmt_prepare: prepare 语句总共创建的次数

    以上三个参数都是参考指标

    Prepared_stmt_count:  当前未关闭的prepare语句个数

而 prepared_stmt_count 默认是16382,可配置范围是“0 - 1048576” ,

所以通过上面的信息发现当前的prepare 数已经满了,要解决这个问题,目前只能是重启应用服务或着把prepare 数设置更大。

MariaDB [tip_web]> set global max_prepared_stmt_count=1048576;
Query OK, 0 rows affected (0.000 sec)

查看配置结果
MariaDB [(none)]> show variables like '%stmt%';
+----------------------------+----------------------+
| Variable_name              | Value                |
+----------------------------+----------------------+
| binlog_stmt_cache_size     | 32768                |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| max_prepared_stmt_count    | 1048576              |
+----------------------------+----------------------+

  但这不是解决问题的关键,最终怎么解决问题,还是要看prepare 创建语句是否被关闭。如果要频繁创建的prepare语句未关闭就可能出现这个问题。

  注:查询语句、prepare语句都应该再使用完后调用Close, 否则 当前prepare数都会激增

  补充: 如果服务初始化时执行prepare, 中途mysql挂机后,会导致prepare语句失效,需要重新调用prepare,否则会调用失败,但调用失败后,第二次调用将会成功。

   

备案编号:赣ICP备15011386号

联系方式:qq:1150662577    邮箱:1150662577@qq.com