出于某种原因,我的生产数据库决定将此消息发出。所有应用程序调用都失败到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数据库似乎启动并运行,可以通过控制台查询,但应用程序似乎无法通过它。应用程序代码/文件没有变化。它只是发生了蓝色。所以我甚至不确定从哪里开始看,或者应用什么样的解决方案。有什么想法吗?
答案 0 :(得分:35)
当我在Fedora系统上运行wordpress时,我也遇到了这个错误。
我用Google搜索,并找到解决此问题的方法。
也许这对你也有帮助。
检查mysql config:my.cnf
cat /etc/my.cnf | grep tmpdir
我在my.cnf
将tmpdir=/tmp
添加到my.cnf
下的[mysqld]
重启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_size
和max_heap_table_size
,以便MySQL可以在内存中创建非常大的临时表。但是允许MySQL在内存中创建1.5GB临时表并不是一个好主意,因为没有办法限制同时创建多少个临时表。你可以用这种方式快速耗尽你的记忆。
将MySQL配置变量tmpdir
设置为另一个具有更多空间的磁盘分区上的目录。
找出哪些查询正在创建如此大的临时表,并优化查询。例如,使用索引来帮助该查询将其扫描减少到表的较小片段。或者归档故事中的一些数据,以便查询没有那么多行要扫描。
答案 3 :(得分:13)
非常感谢ArturZ指出我正确的方向。我没有在我的系统上安装tmpwatch,因此这不是我的问题的原因。但最终结果是一样的:systemd创建的private / tmp被删除了。这是发生的事情:
systemd通过clone()与CLONE_NEWNS创建一个新进程 用于获取私有名称空间的标志。或者它可能会调用unshare() 与CLONE_NEWNS。同样的事情。
systemd在/ tmp中创建一个子目录(例如 / tmp / systemd-namespace-XRiWad / private)并将其安装在/ tmp上。 因为CLONE_NEWNS在#1中设置,所以此挂载点是不可见的 所有其他过程。
systemd然后在这个私有命名空间中调用mysqld。
创建一些特定的数据库操作(例如“describe;”) &安培;删除临时文件,其副作用是更新 / tmp / systemd-namespace-XRiWad / private上的时间戳。其他数据库 操作执行时完全不使用/ tmp。
即使是数据库本身,最终也要过10天 保持活动状态,不会发生更新时间戳的操作 的/ tmp / systemd名称空间XRiWad /私有
/ bin / systemd-tmpfiles出现并删除“旧” / tmp / systemd-namespace-XRiWad / private目录,有效 在public / tmp中渲染private / tmp对mysqld不可用 仍可用于系统中的其他所有内容。
重新启动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)
更好的方式对我有用。
chown root:root /tmp
chmod 1777 /tmp
/etc/init.d/mysqld restart
就是这样。
http://smashingweb.info/solved-mysql-tmp-error-cant-createwrite-to-file-tmpmykbo3bl-errcode-13/
答案 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
错误消息,这是一个礼物,它是背景中的磁盘/卷已满。