MySQL 温度 Table 位置

MySQL Temp Table Location

我在 运行 查询时遇到此错误:

[ERROR] [MY-013132] [Server] The table '/tmp/#sql1127b_9_0' is full!

我进入 /tmp 目录,但看不到 table,我假设它在查询完成后被删除 运行ning.

所以我在查询 运行ning 时进入目录(查询需要几分钟 运行 - 针对 4000 万条记录)。我没有看到 table。我刷新了目录,还是看不到。我怎样才能看到它?我想查看它并确定它的位置,这样我就可以弄清楚为什么当我有很多可用磁盘时它会填满space。

我正在使用 MySQL 8.0.23 - 我之前在同一台机器上使用过 MySQL 5.7.33,具有相同的数据库和相同的查询,从来没有遇到过问题。

这是我的磁盘space:

Filesystem      Size  Used Avail Use% Mounted on
tmpfs           3.2G  3.7M  3.2G   1% /run
/dev/sdc3       215G   38G  167G  19% /
tmpfs            16G     0   16G   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           4.0M     0  4.0M   0% /sys/fs/cgroup
/dev/sdb6       107G   81G   21G  80% /media/Kingston_SSD_120GB
/dev/sda        459G  335G  101G  77% /media/Hitachi
/dev/sdc2        33M  7.8M   25M  24% /boot/efi
tmpfs           3.2G  120K  3.2G   1% /run/user/1001

我没有为 /tmp 设置任何磁盘space - 可以看出,我在 /.

上有 167GB 可用空间 space

来自官方文档:

On Unix, MySQL uses the value of the TMPDIR environment variable as the path name of the directory in which to store temporary files. If TMPDIR is not set, MySQL uses the system default, which is usually /tmp, /var/tmp, or /usr/tmp.

所以如果你没有配置 TMPDIR,那么你的文件需要在 /tmp, /var/tmp, or /usr/tmp

如果您立即(在一两秒内)收到此错误,我怀疑这是一个权限问题。但除此之外,看起来临时 table 确实填满了磁盘。

编辑: 尝试在执行查询时查找文件。因为文件在 SQL 错误后被删除

另外这个post可以帮到你

How can I limit the size of temporary tables?

MySQL 使用的技巧一直是 POSIX 系统的一部分。它打开临时文件,并立即取消链接。因此,它在任何目录列表中都不可见。但是 POSIX 系统如 UNIX 和 Linux 实际上不应该删除一个未链接的文件,而进程有一个打开的文件句柄。因此,一旦使用临时 table 的查询完成,它将关闭文件句柄,然后 OS 将自动删除该文件并释放它正在使用的存储空间。

这通常比要求服务器代码记住在使用完临时文件后将其删除要好。它还会导致线程终止或 mysqld 崩溃。至少它不会在您的文件系统中留下陈旧的临时文件。

您可以使用 lsof -s 查看未链接文件的大小。我将留给您查找如何使用该命令的示例(Google 是您的朋友)。

临时文件很可能用完您的 167GB 免费 space。

或者可能是临时文件只使用了 8GB,但您可能有 20 个线程同时执行相同的查询。我见过一次。

但更有可能是您的值 tmp_table_size 限制了临时文件的大小 table。

如果达到限制,您可以提高该配置选项,在需要时作为会话变量,或在 my.cnf 中全局设置。

但我会首先尝试优化查询。为什么需要创建这么大的临时 tables?是否可以对其进行优化以检查更少的行,或者完全避免创建临时 table?