临时表已满

pie*_*rot 3 mysql temporary-tables

The table '/mnt/disks/data/tmp/#sql58de_a0f6_7' is full

查询相当复杂/大。连接和并集中的大量连接、排序、分组……返回十分之一的结果。否则会导致上述错误。

运行查询时,CPU 和内存会增加,但不会达到最大值。有足够的磁盘空间(100Gb 可用)。

我摆弄过:

innodb_log_file_size
innodb_log_buffer_size
innodb_temp_data_file_path
innodb_data_file_path
innodb_data_home_dir

max_heap_table_size
tmp_table_size

table_open_cache
table_definition_cache
thread_cache_size
sort_buffer_size
Run Code Online (Sandbox Code Playgroud)

tmpdirslave_load_tmpdir设置为/mnt/disks/data/tmp具有足够的空间并且在运行查询时永远不会耗尽空间。innodb_tmpdir设置为NULL这意味着它回落到tmpdir?

由于我读到了有关此问题的内容,我更改了一些设置。其他的经过mysqltuner的建议。但我不能让查询始终成功。

所以:有些东西空间不足。但什么?那么在哪里呢?

  • 版本:Ver 8.0.23 for Linux on x86_64 (MySQL Community Server - GPL)
  • 存储引擎:InnoDB

小智 7

请参阅上面 @Yoseph 的答案中的错误链接(尽管他提到的 temptable_use_mmap 变量不是解决方案)。

如果您使用的是低于 8.0.27 的 Mysql 8.0.2x 版本并遇到此问题,则此问题的临时修复方法是:

set global internal_tmp_mem_storage_engine=MEMORY
Run Code Online (Sandbox Code Playgroud)

这将实现从新的 TempTable 切换回内存,这就是 5.7 系列中使用的。

新的 TempTable 实现是一个很大的改变,但也有很多错误。一般来说,8.0.x 系列的每个版本中修复的错误数量之多是相当令人不安的。