【问题标题】:How large does MySQL ibtmp1 Temporary Tablespace grow?MySQL ibtmp1 临时表空间有多大?
【发布时间】:2020-10-26 11:44:14
【问题描述】:

我们有一个 MySQL Master 运行在 1TB SSD 和 500GB 数据库上。正如您从下面的屏幕截图中看到的那样,我们的空间不足是因为ibtmp1 变得太大了。现在是 194GB。

MySQL Manual 说:

“当数据文件达到最大大小时,查询失败,并显示表已满的错误。”

因此我们有两个担忧:

  1. 如果此文件继续增长并填满 SSD,我们的数据库将停止工作。
  2. 如果我们限制这个文件的大小,比如 100GB,那么如果它被填满,就会“查询失败,并显示表已满的错误。”

我确定手册有误导性或者我们有误解,因为肯定不可能 MySQL 的默认设置允许它填满磁盘然后失败?

【问题讨论】:

    标签: mysql innodb temp-tables


    【解决方案1】:

    我真的很喜欢 MySQL,但是有些事情你只能打你的额头。这是其中之一。但首先要做的是:

    当你有这么大的 ibtmp1 文件时,你要么有

    • 一个查询正在构建一个太大的临时表,可能是不小心进行了交叉连接
    • 大量查询同时创建相对较小的临时表
    • 运行时间很长的事务
    • 要处理的数据异常庞大

    在所有情况下,我都会立即采取行动,如果可能的话,请摆脱这些查询。在 innodb 状态监视器或您用来识别这些查询的任何工具中查看您的慢查询日志。

    要回答您的问题,不要期望 MySQL 在任何地方都使用合理的默认值。

    我不了解您,但对我来说,由于磁盘已满而停止工作的数据库不是一种选择。当查询失败时,它就不那么痛苦了。请记住,我们最有可能谈论的是有问题的查询。

    我已将所有服务器的最大大小配置为 10GB,我对此非常慷慨。

    [mysqld]
    innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:10G
    

    另外请记住,您必须重新启动 MySQL 服务器才能缩小 ibtmp1 文件。与设置 innodb_temp_data_file_path 选项相同。因此,额头拍打。

    【讨论】:

    • 我是否理解正确,我们也可以恢复使用 MyISAM 作为临时表空间,这不需要重新启动?见:percona.com/blog/2019/07/17/…SET GLOBAL internal_tmp_disk_storage_engine = MYISAM;
    • 请注意 MySQL 的错误:bugs.mysql.com/bug.php?id=82556
    • 另外,在这个错误报告中,MySQL 中的 InnoDB 实现似乎修复了这个问题:“这个错误可以关闭。8.0 使用临时表引擎与磁盘溢出和 InnoDB 引入了“会话临时表空间” .ibtmp1 不再使用。” (来自上面的错误报告)
    • 注意,在 5.7 Master 上,我使用了SET GLOBAL internal_tmp_disk_storage_engine = MYISAM;,但服务器没有运行失败,据我所知,ibtmp1 文件不再被使用。我已经对上面的 MySQL 错误发表了评论,尽管关于该错误的说法是,MySQL 8.0 似乎仍然创建了ibtmp1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2014-03-03
    相关资源
    最近更新 更多