MySQL:无法创建/写入文件'/tmp/#sql_3c6_0.MYI'(错误代码:2) - 它甚至意味着什么?

时间:2012-08-16 23:47:39

标签: mysql exception jdbc

出于某种原因,我的生产数据库决定将此消息发出。所有应用程序调用都失败到DB并出现错误:

PreparedStatementCallback; SQL [ /*long sql statement here*/ ]; 
Can't create/write to file '/tmp/#sql_3c6_0.MYI' (Errcode: 2); 
nested exception is java.sql.SQLException: Can't create/write to file '/tmp/#sql_3c6_0.MYI' (Errcode: 2)

我不知道,这甚至意味着什么。 #sql_3c6_0.MYI中没有文件/tmp,由于某种原因,我无法创建一个#字符。有没有人听说过或看到过这个错误?可能出现什么问题和一些可能的事情?

MySQL数据库似乎启动并运行,可以通过控制台查询,但应用程序似乎无法通过它。应用程序代码/文件没有变化。它只是发生了蓝色。所以我甚至不确定从哪里开始看,或者应用什么样的解决方案。有什么想法吗?

13 个答案:

答案 0 :(得分:35)

当我在Fedora系统上运行wordpress时,我也遇到了这个错误。

我用Google搜索,并找到解决此问题的方法。

也许这对你也有帮助。

  1. 检查mysql config:my.cnf

     cat /etc/my.cnf | grep tmpdir
    

    我在my.cnf

  2. 中看不到任何内容
  3. tmpdir=/tmp添加到my.cnf下的[mysqld]

  4. 重启web / app和mysql服务器

    /etc/init.d/mysqld restart

答案 1 :(得分:19)

这通常意味着您的/tmp分区空间不足并且无法创建文件,或者出于某种原因mysqld进程由于权限问题而无法写入该目录。有时在你的游行中selinux下雨时会出现这种情况。

默认情况下,任何需要“临时文件”的操作都会进入/tmp目录。您看到的名称只是一些内部随机名称。

答案 2 :(得分:13)

文件名看起来像是MySQL中的查询创建的临时表。这些文件通常非常短暂,它们是在一个特定查询期间创建的,并在之后立即清理。

然而,它们可能变得非常大,具体取决于查询需要在临时表中处理的数据量。或者,您可能有多个并发查询创建临时表,如果这些查询中有足够多个同时运行,则会占用磁盘空间。

我做MySQL咨询,我帮助一个客户在他的根分区上出现间歇性磁盘完全错误,即使他每次看,他都有大约6GB的免费空间。在我们检查了他的查询日志之后,我们发现他有时会同时运行四个或更多查询,每个查询在/ tmp中创建一个1.5GB临时表,该表在他的根分区上。吊杆!

我给他的解决方案:

  • 增加MySQL配置变量tmp_table_sizemax_heap_table_size,以便MySQL可以在内存中创建非常大的临时表。但是允许MySQL在内存中创建1.5GB临时表并不是一个好主意,因为没有办法限制同时创建多少个临时表。你可以用这种方式快速耗尽你的记忆。

  • 将MySQL配置变量tmpdir设置为另一个具有更多空间的磁盘分区上的目录。

  • 找出哪些查询正在创建如此大的临时表,并优化查询。例如,使用索引来帮助该查询将其扫描减少到表的较小片段。或者归档故事中的一些数据,以便查询没有那么多行要扫描。

答案 3 :(得分:13)

非常感谢ArturZ指出我正确的方向。我没有在我的系统上安装tmpwatch,因此这不是我的问题的原因。但最终结果是一样的:systemd创建的private / tmp被删除了。这是发生的事情:

  1. systemd通过clone()与CLONE_NEWNS创建一个新进程 用于获取私有名称空间的标志。或者它可能会调用unshare() 与CLONE_NEWNS。同样的事情。

  2. systemd在/ tmp中创建一个子目录(例如 / tmp / systemd-namespace-XRiWad / private)并将其安装在/ tmp上。 因为CLONE_NEWNS在#1中设置,所以此挂载点是不可见的 所有其他过程。

  3. systemd然后在这个私有命名空间中调用mysqld。

  4. 创建一些特定的数据库操作(例如“describe;”) &安培;删除临时文件,其副作用是更新 / tmp / systemd-namespace-XRiWad / private上的时间戳。其他数据库 操作执行时完全不使用/ tmp。

  5. 即使是数据库本身,最终也要过10天 保持活动状态,不会发生更新时间戳的操作 的/ tmp / systemd名称空间XRiWad /私有

  6. / bin / systemd-tmpfiles出现并删除“旧” / tmp / systemd-namespace-XRiWad / private目录,有效 在public / tmp中渲染private / tmp对mysqld不可用 仍可用于系统中的其他所有内容。

  7. 重新启动mysqld是有效的,因为这会在步骤#1重新开始,并带有一个全新的private / tmp目录。然而,问题最终又回来了。再一次。

    简单的解决方案是配置/ bin / systemd-tmpfiles,以便使用名称/ tmp / systemd-namespace- *保留/ tmp中的任何内容。我通过使用以下内容创建/etc/tmpfiles.d/privatetmp.conf来完成此操作:

    x   /tmp/systemd-namespace-*
    x   /tmp/systemd-namespace-*/private
    

    问题解决了。

答案 4 :(得分:6)

对我来说,这个问题是在长时间不使用mysql或网络服务器之后发生的。所以我确定我的设置在哪里正确;只需重新启动服务即可修复此问题;关于这个问题的奇怪部分是,仍然可以连接到数据库,甚至使用mysql工具查询/添加表。例如:

mysql -u root -p

我重新开始使用:

systemctl start mysqld.service

或     service mysqld restart 要么     /etc/init.d/mysqld restart

注意:根据这些命令的机器/环境,应该重启服务。

答案 5 :(得分:5)

答案 6 :(得分:3)

这很容易,您只需将/ tmp文件夹授予777权限即可。 只需输入:

chmod -R 777 /tmp

答案 7 :(得分:2)

在Ubuntu框中,我将/ tmp移动到另一个卷(符号链接)后开始出现此错误。即使在设置了所需的权限1777之后,问题仍未得到解决。

MySQL受AppArmor保护,后者禁止写入新的tmp位置/ mnt / tmp。 我必须将以下行添加到/etc/apparmor.d/abstractions/user-tmp来修复此问题

  

owner / mnt / tmp / ** rwkl,

     

/ mnt / tmp / rw,

答案 8 :(得分:2)

在debian 7.5上我得到了同样的错误。我意识到/tmp文件夹所有者和权限已关闭。正如另一个答案建议我做了如下(必须是root):

chown root:root /tmp && chmod 1777 /tmp

我甚至没有重启mysql守护进程。

答案 9 :(得分:1)

由于访问控制安全策略,特别是在启用SELinux时,它不允许外部可执行文件在系统位置创建临时文件。

通过发出以下命令禁用SELinux:

echo 0> / selinux / enforce

您现在可以启动mysql,在读取/写入/ tmp或系统目录时不会给出任何与权限相关的错误。

如果您希望启用SELinux安全性,请在上述命令中将0更改为1。

答案 10 :(得分:0)

检查权限问题,mysql配置。

同时检查您是否未达到磁盘空间,配额限制。

注意:有些系统会限制文件数量(而不仅仅是空间),删除一些旧的会话文件有助于解决我的问题。

答案 11 :(得分:0)

我正在使用mariadb。当我尝试将这一行放在/etc/my.cnf:

[mysqld]
tmpdir=/tmp 

它解决了与/ tmp相关的网站前端生成的错误。 但是,它与/ tmp有后端问题。例如,当我尝试从后端重建mariadb时,它无法读取/ tmp目录,然后生成类似的错误。

mysqldump: Couldn't execute 'show fields from `wp_autoupdate`': Can't create/write to file '/tmp/#sql_1680_0.MAI' (Errcode: 2 "No such file or directory") (1)

因此,这对前端和后端均适用:

1。 mkdir / var / lib / mysql / tmp

2。 chown mysql:mysql / var / lib / mysql / tmp

3。将以下行添加到[mysqld]部分:

    tmpdir = /var/lib/mysql/tmp

4。重新启动mysqld(例如Centos7:systemctl重新启动mysqld)

答案 12 :(得分:0)

对于使用VPS /虚拟主机的用户。

我正在使用VPS,但由于MySQL无法写入/ tmp而出现错误,一切看起来都正确。 我有足够的可用空间,足够的可用inode,正确的权限。原来问题出在我的VPS之外,托管VPS的计算机已满。我的文件系统中只有“虚拟空间”,但是在后台托管VPS的计算机上没有“物理空间”。我必须联系他们修复的VPS公司。

如果您认为这可能是您的问题,则可以测试将更大的文件写入/ tmp(1GB):

dd if=/dev/zero of=/tmp/file.txt count=1024 bs=1048576 

我收到一条No space left on device错误消息,这是一个礼物,它是背景中的磁盘/卷已满。