: jank : : 3288 : 2021-03-02 10:12 mysql
昨天不小心在测试环境出现了一条这个日志
通过查询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,否则会调用失败,但调用失败后,第二次调用将会成功。