mysql - Rails 3.2.3 mysql 错误 "max_prepared_stmt_count"

标签 mysql ruby-on-rails-3.2

我正在运行一个 Rails 3.2.3 应用程序,该应用程序使用 apache2/passenger 部署在具有 mysql 数据库服务器的虚拟主机上。在网站访问量很大后我收到了这个错误:

ActiveRecord::StatementInvalid (Mysql::Error: Can't create more than 
max_prepared_stmt_count statements (current value: 16382)

我认为这与流量有关,但如果是这样,我必须找到解决方法。以前有人遇到过这个错误吗?我不知道如何阻止它。

这是我在 mysql 中看到的:

mysql> 显示全局状态,如 'com_stmt%';

| Com_stmt_关闭 | 1720319 | Com_stmt_执行 | 2094137 |

| com_stmt_fetch | 0 |

| Com_stmt_准备 | 1768924 |

| Com_stmt_reprepare | 0 |

| Com_stmt_重置 | 0 |

| Com_stmt_send_long_data | 0 |

+------------------------+--------+

我正在运行 resque gem。

最佳答案

很可能某些东西正在针对数据库打开准备好的语句而不是关闭它们。

要检查这一点,请尝试查询:

show global status like ‘com_stmt%’;

Com_stmt_prepare 和 Com_stmt_close 之间的非常大的差异表明某些事情使准备好的语句处于打开状态。 Com_stmt_close = 0 当然会特别有说服力。


有可能,由于两者之间的差异相对较小,您实际上确实同时需要那么多 open 语句,但我仍然认为您更有可能将它们泄漏到某个地方(错误/边缘情况处理,正在人们经常忘记关闭资源的经典示例)。

您可以增加允许的语句数量:

set global max_prepared_stmt_count=<some_larger number>;

这应该会让事情重新开始。小心设置过高的限制,因为这会使您容易受到 DoS 攻击。

之后,我会监控它,看看是否随着时间的推移积累了更多准备好的语句。

如果你:

set global general_log = 'ON';

通用日志将记录Prepare 语句。查找任何没有匹配的关闭,以帮助找到任何此类问题。

关于mysql - Rails 3.2.3 mysql 错误 "max_prepared_stmt_count",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13849027/

相关文章:

PHP:如何从另一个类中的方法捕获异常?

Ruby 似乎引用一个变量而不是处理它的值

ruby-on-rails - 如何从另一个目录中获取 ruby​​ 文件

ruby-on-rails - 自定义 Rails 脚手架生成器 View 的简单方法?

ruby-on-rails - Ruby on Rails : Order users based on average ratings with most reviews?

MYSQL统计重复值

MySQL 批量兼容 : use relations and foreign keys or not?

mysql - Web API 没有得到正确的结果

mysql - Rails activerecord 按相关表中的字段排序

jquery - RoR : jQuery jCrop, 在预览中无法正确裁剪