一尘不染

如何通过SELECT INTO OUTFILE解决MySQL Errcode 13?

mysql

我正在尝试使用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。


阅读 493

收藏
2020-05-17

共1个答案

一尘不染

这是哪个特定的Ubuntu版本,并且这是Ubuntu Server Edition?

AppArmor随附了最新的Ubuntu Server
Edition(例如10.04),默认情况下MySQL的配置文件可能处于强制模式。您可以这样执行检查sudo aa-status

# 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重新加载配置文件。

# sudo /etc/init.d/apparmor reload

警告:以上更改将使MySQL可以读写/ data目录。我们希望您已经考虑了此问题的安全性。

2020-05-17