从存储引擎(磁盘已满)得到错误28,但我的磁盘未满

基本上MySQL给了我很多错误“从存储引擎得到错误28”,这意味着没有更多的磁盘空间可用。

df -h的输出是:

 File system Dim. Usati Disp. Uso% Montato su /dev/md1 10G 7,9G 1,6G 84% / tmpfs 2,0G 0 2,0G 0% /lib/init/rw udev 10M 176K 9,9M 2% /dev tmpfs 2,0G 0 2,0G 0% /dev/shm /dev/md2 683G 601G 48G 93% /home 

这里的每个文件系统都不是空的。 还有其他问题吗?

我在
– 一个专用服务器(debian 64bit)
– 这个错误发生在一个沉重的查询中

这可能是你的查询使MySQL创build临时表。 在默认configuration中,这些表将与其他表一起创build,这可能在仅有1.6GB的/分区上,并且这些表可能比实际上快得多。

当你做这样的查询时,留意你的空闲空间。

请参阅此文档 。

另外两种可能性:

  1. 文件系统通常保留5%的空间,并在达到95%满时返回错误。 你的/home在93%。
  2. 即使您还剩下磁盘空间,当您用完inode时,也会得到相同的错误消息。 你可以用df -i看到inode。

我认为SvenW的答案更可能是正确的 。 他的推理是正确的,我自己遇到了完全一样的问题。

您可以通过在您的MySQL实例中运行EXPLAIN <query>来查找是否要使用临时表,将实际查询replace为<query> 。 您正在寻找Extra部分中的“使用临时”。 如果临时表大于my.cnf max_heap_table_size和/或tmp_table_size ,则会将其写入磁盘。

通过查看运行实例( mysql> SHOW VARIABLES LIKE 'tmpdir'; )或my.cnfgrep tmpdir my.cnf )中的tmpdirvariables,您可以findMySQL用于临时表的目录。