【问题标题】:Unable to write MySQL temp file when running Rails migration运行 Rails 迁移时无法写入 MySQL 临时文件
【发布时间】:2012-05-01 23:20:23
【问题描述】:

更新:我公司的系统管理员删除了 /tmp 目录并创建了一个 指向已安装驱动器的符号链接(例如 ln -s /mnt/somewhere /tmp)。 MySQL 显然不喜欢这个符号链接。 在本地文件系统上创建真正的 /tmp 目录后,问题就消失了。


我正在运行一个进程 (rake db:migrate),它导致 MySQL 尝试创建一个临时文件。 但是,出现以下错误:

Mysql::Error: Can't create/write to file '/tmp/#sql_196_0.MYI' (Errcode: 13): 
SHOW FIELDS FROM `user_rules`

Errcode 13 显然是文件权限问题。 运行该进程的用户对 /tmp 目录具有写权限。 我还搜索了网络,有人提到问题可能是文件以井号为前缀(例如'#')。

我转到 /tmp 目录并尝试创建文件,发现在某些情况下我无法创建文件。所以我想知道英镑符号是否确实导致了问题。如果是,如何使用 MySQL 或 Rails 来解决问题:

cd /tmp
echo "Hello" > #sql_123
touch #sql_123

echo "Hello" > "#sql_123"
touch "#sql_123"

第二个和第三个命令(不带引号)失败。第 4 行和第 5 行(带引号)正在工作。所以也许失败是因为井号没有用引号引起来或用反斜杠转义。但同样,即使这是原因,我也不确定如何告诉 MySQL 或 Rails 如何处理它。

有什么想法吗?

【问题讨论】:

  • 更新:我公司的系统管理员删除了 /tmp 目录并创建了一个指向已安装驱动器的符号链接(例如 ln -s /mnt/somewhere /tmp)。 MySQL 显然不喜欢这个符号链接。一旦在本地文件系统上创建了一个真正的 /tmp 目录,问题就消失了。

标签: mysql ruby-on-rails rake


【解决方案1】:

在 shell 中你需要引号,因为 # 引入了注释,除非被反斜杠或引号转义。那些带有井号前缀的#sql_123 文件是mysql 拥有的临时文件,它们是正常的。但是,您无法移动它们,并且无论何时它们存在,您都无法使用二进制文件移动数据库,您要么需要关闭并移动;或对 SQL 执行 mysqldump。

现在对于您的系统管理员,他是否在 mysql 运行时删除了 /tmp? Mysql 在 /tmp 中打开文件,然后从目录中删除它们,使文件句柄保持打开状态。当服务器启动或关闭时,您会看到磁盘空间的差异。 MySQL 将所有临时文件创建为隐藏文件。这可确保在 mysqld 终止时删除临时文件。使用隐藏文件的缺点是你看不到一个大的临时文件填满临时文件目录所在的文件系统。

因此,如果您想保留符号链接(即到更大的磁盘),那么您最好关闭 mysql,创建链接,然后启动 mysql 以发现符号链接没有问题。

【讨论】:

    猜你喜欢
    • 2017-06-28
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2023-03-27
    相关资源
    最近更新 更多