2012-04-20 83 views
2

更新:我公司的系统管理员删除了/ tmp目录,并创建了一个 到已装入驱动器(例如ln -s/mnt/somewhere/tmp)的符号链接。 MySQL显然不喜欢这个符号链接。 一旦创建了本地文件系统上的real/tmp目录,问题就消失了。在运行Rails迁移时无法写入MySQL临时文件


我正在运行一个进程(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" 

的第二和第三个命令(没有引号)失败了,第四和第五行(带引号)正在工作,所以也许失败是因为英镑符号不在引号中或者用反斜线转义,但是即使这样原因,我不知道如何ell MySQL或Rails如何处理它。

任何想法?

+0

UPDATE:我公司的系统管理员删除了/ tmp目录,并创建了一个 指向挂载驱动器的符号链接(例如ln -s/mnt/somewhere/tmp)。 MySQL显然不喜欢这个符号链接。 一旦创建了本地文件系统上的real/tmp目录,问题就消失了。 – Chris 2012-05-12 06:13:31

回答

0

在shell中,您需要引号,因为#引入注释,除非通过反斜杠或引号转义。那些带有磅符号前缀的#sql_123文件是mysql拥有的临时文件,它们是正常的。你不能移动它们,只要它们在场,你不能使用二进制文件移动你的数据库,你需要关闭并移动;或者对SQL执行mysqldump。

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

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