【问题标题】:Mysql: what to do when memory tables reach max_heap_table_size?mysql:内存表达到max_heap_table_size怎么办?
【发布时间】:2011-01-25 13:08:18
【问题描述】:

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    The table 'table_name' is full
    

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • MEMORY 存储引擎将 VARCHAR 填充到全长不再是真的。 Percona MySQL 服务器的最新版本修复了这个问题。
      • 我相当肯定,在我编写它时,该声明适用于所有 GA 主线版本的 MySQL。许多分叉已经修复了内存结束填充。
      猜你喜欢
      • 2016-08-24
      • 2012-10-26
      • 1970-01-01
      • 2020-07-08
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      相关资源
      最近更新 更多