![Rails:Mysql:服务器重启后:为什么我会收到“无法创建/写入文件‘/tmp/#sql_4d2b_0.MYI’错误”?](https://linux22.com/image/800493/Rails%EF%BC%9AMysql%EF%BC%9A%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%87%8D%E5%90%AF%E5%90%8E%EF%BC%9A%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E4%BC%9A%E6%94%B6%E5%88%B0%E2%80%9C%E6%97%A0%E6%B3%95%E5%88%9B%E5%BB%BA%2F%E5%86%99%E5%85%A5%E6%96%87%E4%BB%B6%E2%80%98%2Ftmp%2F%23sql_4d2b_0.MYI%E2%80%99%E9%94%99%E8%AF%AF%E2%80%9D%EF%BC%9F.png)
我收到 ErrorCode: 2,我猜是 ENOENT(没有这样的文件或目录)。以下是完整详细信息(来自我的 stackoverflow 帖子,该帖子被当权者关闭,因为兴趣有限。也许如果我提到该应用程序是为了帮助程序员编写就地列表反转函数。但我认为我现在在正确的地方)。以下是详细信息...
在我重新启动 Linode VPS 之后发生了这种情况(事实证明我不需要这样做,但它发现了这个错误)。
$ ps auxww | grep mysql
mysql 19755 0.0 4.2 309904 21396 ? Sl Mar16 20:50 /usr/libexec/mysqld
--basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --log-
error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql
/mysql.sock
这看起来正确。mysql* 在 /usr/bin 中,并且 datadir 是正确的。
当我使用 database.yml 中的凭据启动 mysql 客户端时,它按预期工作。但是当我运行 rails 控制台时,在启动时我收到错误
data_loader.rb 失败:无法创建/写入文件“/tmp/#sql_4d2b_0.MYI”(错误代码:2)
这不是磁盘空间问题
$ ls -ld /tmp
drwxrwxrwt 11 root root 4096 Apr 1 17:36 /tmp
$ df /tmp
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/root 20386924 5496712 14061840 29% /
这是 /etc/my.cnf:
[mysqld]
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under different user or group,
# customize your systemd unit file for mysqld according to the
# instructions in http://fedoraproject.org/wiki/Systemd
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
/etc/rc.d/init.d/mysqld 所做的只是运行 service mysqld start 和....stop(是的,这是在 Fedora Core 上)。
这是 Ruby 1.9.2p320 上的 Rails 3.0.8
还有其他吗?/var/log/mysqld.log 中没有任何东西
答案1
不久前,我遇到了同样的错误,我发现我的一些大查询由于(group by、order by、Join 等)在 /tmp 下的磁盘上创建了大量临时文件。在此期间,如果另一个请求调用查询,则由于 /tmp 空间不足而出错。我到处寻找解决方案,唯一的办法是增加 /tmp 的大小并调整几个服务器变量,然后问题就解决了。我有 MySQL 5.1,后来我将其升级到 5.5。希望这对您有所帮助。
答案2
在 Fedora 上,mysqld 被分配了自己挂载的 /tmp 分区,并且一个单独的进程会收集未使用的分区。我的服务器最近比较安静,所以删除了分区,mysql 无法再运行“显示 [table] 中的完整字段”