我正在尝试使用MySQL SELECT INTO OUTFILE语句将表的内容转储到csv文件中。如果我做:
SELECT column1, column2 INTO OUTFILE 'outfile.csv' FIELDS TERMINATED BY ',' FROM table_name; outfile.csv将在服务器上与数据库文件存储在同一目录中创建。
但是,当我将查询更改为:
SELECT column1, column2 INTO OUTFILE '/data/outfile.csv' FIELDS TERMINATED BY ',' FROM table_name; 我得到:
ERROR 1 (HY000): Can't create/write to file '/data/outfile.csv' (Errcode: 13) Errcode 13是一个权限错误,但是即使我将/ data的所有权更改为mysql:mysql并赋予它777权限,我也得到了它。MySQL以用户“ mysql”的身份运行。
奇怪的是,我可以在/ tmp中创建该文件,只是不能在我尝试过的任何其他目录中创建该文件,即使设置了权限,以便用户mysql应该能够写入该目录。
这是在Ubuntu上运行的MySQL 5.0.75。
这是哪个特定的Ubuntu版本,并且这是Ubuntu Server Edition?
AppArmor随附了最新的Ubuntu Server Edition(例如10.04),默认情况下MySQL的配置文件可能处于强制模式。您可以这样执行检查sudo aa-status:
5 profiles are loaded. 5 profiles are in enforce mode. /usr/lib/connman/scripts/dhclient-script /sbin/dhclient3 /usr/sbin/tcpdump /usr/lib/NetworkManager/nm-dhcp-client.action /usr/sbin/mysqld 0 profiles are in complain mode. 1 processes have profiles defined. 1 processes are in enforce mode : /usr/sbin/mysqld (1089) 0 processes are in complain mode. 如果mysqld包含在强制模式下,则可能是拒绝写入的程序。/var/log/messages当AppArmor阻止写入/访问时,也将写入条目。您可以做的就是编辑/etc/apparmor.d/usr.sbin.mysqld并添加/data/并/data/*靠近底部,如下所示:
...
/usr/sbin/mysqld {
...
/var/log/mysql/ r,
/var/log/mysql/* rw,
/var/run/mysqld/mysqld.pid w,
/var/run/mysqld/mysqld.sock w,
/data/ r,
/data/ rw,*
} 然后使AppArmor重新加载配置文件。
警告:以上更改将使MySQL可以读写/ data目录。我们希望您已经考虑了此问题的安全性。来源:stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。