SELECT INTO OUTFILE
对于 CIFS 挂载目录 ( /mnt/backup/test
) 失败,但对于普通目录 ( /tmp/tests
) 有效。
mysql> select * from mytable into outfile '/tmp/tests/mytable.txt';
Query OK, 3723 rows affected (0.05 sec)
mysql> select * from mytable into outfile '/mnt/backup/test/mytable.txt';
ERROR 1 (HY000): Can't create/write to file '/mnt/backup/test/mytable.txt' (Errcode: 2)
用户mysql
可以毫无问题地写入/mnt/backup/test/mytable.txt
:
root:~# su - -s /bin/bash mysql
mysql:~$ touch /mnt/backup/test/mytable.txt
mysql:~$ ls -l /mnt/backup/test/mytable.txt
-rw-r--r-- 1 root root 0 2009-11-16 10:48 /mnt/backup/test/mytable.txt
CIFS 目录/mnt/backup
已安装:rw,noperm,user=****,password=****
由于-T
可以mysqldump
利用它,有什么选择(MySQL/CIFS)需要为了SELECT INTO OUTFILE
工作和我的互联网金融-挂载目录?
更新:
有趣的是,正如 Michael 所说,其中一个strace
过程mysqld
确实揭示了访问控制失败。但我仍然不知道为什么。以相同的方式启动的简单 Perl 脚本mysql
可以毫无问题地调用相同的系统调用。
mysqld strace 的提取
open("/mnt/backup/tests/bugs.1.txt", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0666)
= -1 EACCES (Permission denied)
perl strace 的摘录
open("/mnt/backup/tests/bugs.32064.txt", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0666) = 3
/mnt/backup/tests
请注意,每次运行之前都会清空该目录。
答案1
事实上问题是应用装甲。
添加/mnt/backup/** w
并/etc/apparmor.d/usr.sbin.mysqld
重新启动它(/etc/init.d/apparmor restart
)解决了问题。
答案2
该错误可能意味着两种情况之一,该文件可能已经存在,或者实际上是权限问题(尽管您的示例显示它不是权限问题,但我相信它实际上是)。
此外,当您使用“-”选项运行“su”来模拟其环境时,您需要将其指定为 su 的最后一个选项。