Mysql:当内存表达到max_heap_table_size时该怎么办?

时间:2011-01-25 13:08:19

标签: mysql memory-management out-of-memory memory-table

我正在使用mysql内存表作为缓存多次读取数据行的方法。我选择了这个替代方案,因为我无法在我的解决方案中使用xcache或memcache。 在阅读有关此主题的mysql manual and forum后,我得出结论,当表达到其最大内存大小时,将引发错误。我想知道是否有办法捕获此错误,以截断表并释放内存。我不想提高可以使用的内存限制,我需要一种方法来自动释放内存,以便表可以继续工作。

感谢。

2 个答案:

答案 0 :(得分:5)

如果内存不足,引擎会引发错误1114,并显示以下错误消息:

The table 'table_name' is full

您应该在客户端捕获此错误并从表中删除一些数据。

答案 1 :(得分:1)

您应该使用普通的持久表,并依赖于固有的缓存。对于可以安全地丢弃内容的表,MyISAM是一个安全引擎(如果您乐意在每次启动时执行TRUNCATE TABLE),或者,您可以使用与永久表相同的引擎(例如InnoDB)。 / p>

无论如何,内存表都非常糟糕(在所有已发布的MySQL版本中;在Drizzle和其他一些版本中更好),因为它们将行填充到最大长度,这意味着您无法真正开始将VARCHAR放入其中。

不幸的是,你还不能在每个表(或每个事务)的基础上设置innodb持久性参数,所以你必须根据每个服务器决定你需要多少耐久性 - 在你的情况下,没有,所以你可以将innodb_flush_log_at_trx_commit设置为2(或者甚至是0,但它会让你收获不多)