我的数据库中有较大的(InnoDB)表;显然,用户能够使用 JOIN 进行 SELECT,从而生成临时的大型(因此位于磁盘上)表。有时,它们太大以至于耗尽磁盘空间,导致各种奇怪的问题。
有没有办法限制临时表的最大大小对于磁盘表,以便该表不会使磁盘过度增长?不管名称如何,tmp_table_size仅适用于内存表。我在文档中没有找到任何相关内容。
MariaDB 和 MySQL 中没有此选项。 几个月前我遇到了和你一样的问题,我进行了很多搜索,最终通过在 NAS 上为临时数据集创建一个特殊的存储区域来部分解决它。
在您的 NAS 上创建一个文件夹或在内部 HDD 上创建一个分区,根据定义,它的大小会受到限制,然后挂载它,并在 mysql ini 中将临时存储分配给该驱动器:(选择 windows/linux)
tmpdir="mnt/DBtmp/"
tmpdir="T:\"
更改后应重新启动 mysql 服务。
使用这种方法,一旦驱动器已满,磁盘查询仍然会出现“奇怪的问题”,但其他问题都消失了。
有关于选项disk-tmp-table-size
的讨论,但看起来提交没有通过审查或由于其他原因丢失(至少该选项在当前代码库中不再存在) )。
我猜你的下一个最佳尝试(除了增加存储空间之外)是调整 MySQL,使其不创建磁盘临时表。 DBA 上有一些这方面的技巧。另一种尝试可能是创建一个 ramdisk 来存储“磁盘上”临时表,如果您有足够的 RAM 并且仅缺少磁盘存储。
虽然它没有回答 MySQL 的问题,但 MariaDB 有 tmp_disk_table_size 以及可能也有用的 max_join_size 设置。但是,
tmp_disk_table_size
仅适用于MyISAM或Aria表,不适用于InnoDB。此外,max_join_size
仅适用于连接的估计行数,而不适用于实际行数。好的一面是,错误几乎立即发出。
MariaDB 10.2.7 添加了选项
tmp_disk_table_size
,该选项在 文档中描述为:
内部临时磁盘 MyISAM 或 Aria 表的数据最大大小。当结果不适合内存引擎时,这些表将作为复杂查询的一部分创建。如果您想限制在临时目录 tmpdir 中创建的临时表的大小,您可以设置此变量。
不要让这种误导您认为它不适用于您使用 InnoDB(或其他引擎)表。磁盘上的内部临时表始终是 Aria(或 MyISAM 作为编译时选项),如此处:
所述内部临时表空间(即不能保存在内存中的临时表)使用 Aria 或 MyISAM,具体取决于 aria_used_for_temp_tables 系统变量。
有趣的是,MySQL 根据this使用InnoDB:
MySQL 8.4 仅使用 InnoDB 存储引擎作为磁盘内部临时表。 (为此目的不再支持 MYISAM 存储引擎。)
我没有找到与 MariaDB 等效的 MySQL 选项
tmp_disk_table_size
。