Rya*_*son 114 mysql sql into-outfile
我试图使用MySQL SELECT INTO OUTFILE语句将表的内容转储到csv文件.如果我做:
SELECT column1, column2
INTO OUTFILE 'outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;
Run Code Online (Sandbox Code Playgroud)
outfile.csv将在服务器上创建,该数据库的文件存储在同一目录中.
但是,当我将查询更改为:
SELECT column1, column2
INTO OUTFILE '/data/outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;
Run Code Online (Sandbox Code Playgroud)
我明白了:
ERROR 1 (HY000): Can't create/write to file '/data/outfile.csv' (Errcode: 13)
Run Code Online (Sandbox Code Playgroud)
Errcode 13是一个权限错误,但即使我将/ data的所有权更改为mysql:mysql并赋予它777权限,我也能得到它.MySQL以用户"mysql"运行.
奇怪的是我可以在/ tmp中创建文件,只是没有在我尝试过的任何其他目录中,即使权限设置使得用户mysql应该能够写入目录.
这是在Ubuntu上运行的MySQL 5.0.75.
Vin*_*n-G 187
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.
Run Code Online (Sandbox Code Playgroud)
如果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,**
}
Run Code Online (Sandbox Code Playgroud)
然后让AppArmor重新加载配置文件.
# sudo /etc/init.d/apparmor reload
Run Code Online (Sandbox Code Playgroud)
警告:上面的更改将允许MySQL读取和写入/ data目录.我们希望您已经考虑过此的安全隐患.
roo*_*ook 17
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
bas*_*ode 14
我知道你说过你已经尝试过设置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 $
Run Code Online (Sandbox Code Playgroud)
MySQL在这里变得愚蠢.它尝试在/ tmp/data/....下创建文件.所以你可以做的是以下内容:
mkdir /tmp/data
mount --bind /data /tmp/data
Run Code Online (Sandbox Code Playgroud)
然后尝试你的查询.经过几个小时的调试后,这对我有用.
这个问题困扰了我很长时间。我注意到该讨论并未指出RHEL / Fecora上的解决方案。我正在使用RHEL,但在Ubuntu上找不到与AppArmer对应的配置文件,但是我通过使PATH目录中的EVERY目录可被mysql读取和访问来解决了我的问题。例如,如果创建目录/ tmp,则以下两个命令使SELECT INTO OUTFILE能够输出.sql和.sql文件
chown mysql:mysql /tmp
chmod a+rx /tmp
Run Code Online (Sandbox Code Playgroud)
如果在主目录/ home / tom中创建目录,则必须对/ home和/ home / tom都执行此操作。
小智 5
你可以这样做 :
mysql -u USERNAME --password=PASSWORD --database=DATABASE --execute='SELECT `FIELD`, `FIELD` FROM `TABLE` LIMIT 0, 10000 ' -X > file.xml
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
148491 次 |
| 最近记录: |