我试图使用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服务器版?
最近的Ubuntu Server Editions(如10.04)附带AppArmor,默认情况下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目录.我们希望您已经考虑过此的安全隐患.
Ubuntu使用AppArmor,这是什么阻止您访问/ data /.Fedora使用selinux,这会在RHEL/Fedora/CentOS机器上阻止这种情况.
要修改AppArmor以允许MySQL访问/ data /,请执行以下操作:
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
在目录列表中的任何位置添加此行:
/data/ rw,
然后做一个:
sudo /etc/init.d/apparmor restart
另一种选择是完全禁用AppArmor for mysql,这不是推荐的:
sudo mv /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
别忘了重启apparmor:
sudo /etc/init.d/apparmor restart
我知道你说过你已经尝试过设置777的权限了,但是因为我有证据表明这是一个权限问题我发布了我正在运行的内容,希望它可以提供帮助.这是我的经历:
tmp $ pwd /Users/username/tmp tmp $ mkdir bkptest tmp $ mysqldump -u root -T bkptest bkptest mysqldump: Got error: 1: Can't create/write to file '/Users/username/tmp/bkptest/people.txt' (Errcode: 13) when executing 'SELECT INTO OUTFILE' tmp $ chmod a+rwx bkptest/ tmp $ mysqldump -u root -T bkptest bkptest tmp $ ls bkptest/ people.sql people.txt tmp $
MySQL在这里变得愚蠢.它尝试在/ tmp/data/....下创建文件.所以你可以做的是以下内容:
mkdir /tmp/data mount --bind /data /tmp/data
然后尝试你的查询.经过几个小时的调试后,这对我有用.
这个问题困扰了我很长时间。我注意到该讨论并未指出RHEL / Fecora上的解决方案。我正在使用RHEL,但在Ubuntu上找不到与AppArmer对应的配置文件,但是我通过使PATH目录中的EVERY目录可被mysql读取和访问来解决了我的问题。例如,如果创建目录/ tmp,则以下两个命令使SELECT INTO OUTFILE能够输出.sql和.sql文件
chown mysql:mysql /tmp chmod a+rx /tmp
如果在主目录/ home / tom中创建目录,则必须对/ home和/ home / tom都执行此操作。
你可以这样做 :
mysql -u USERNAME --password=PASSWORD --database=DATABASE --execute='SELECT `FIELD`, `FIELD` FROM `TABLE` LIMIT 0, 10000 ' -X > file.xml