当前位置:  开发笔记 > 编程语言 > 正文

如何使用SELECT INTO OUTFILE绕过MySQL Errcode 13?

如何解决《如何使用SELECTINTOOUTFILE绕过MySQLErrcode13?》经验,为你挑选了6个好方法。

我试图使用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.



1> Vin-G..:

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目录.我们希望您已经考虑过此的安全隐患.


我不想指出这一点,但有一个原因App Armor不允许这样做.MySQL现在能够修改和读取/ data文件夹中的任何内容.现在就不要被黑了.
@Serdar,与发行版一起发布的AppArmor MySQL规则集默认情况下不允许**.这是有道理的,因为它是新安装规则的良好基线.我相信我们应该并且可以修改规则集以满足我们在安装后的需求.原始提问者打算允许MySQL写入特定目录.但是,如果上面没有明确说明,那么人们就会对这个解决方案感到磕磕绊绊:警​​告:上面的更改将允许MySQL读取和写入/ data目录.我们希望您已经考虑过此的安全隐患.

2> rook..:

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



3> basilikode..:

我知道你说过你已经尝试过设置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 $ 



4> vimdude..:

MySQL在这里变得愚蠢.它尝试在/ tmp/data/....下创建文件.所以你可以做的是以下内容:

mkdir /tmp/data
mount --bind /data /tmp/data

然后尝试你的查询.经过几个小时的调试后,这对我有用.



5> fanchyna..:

这个问题困扰了我很长时间。我注意到该讨论并未指出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都执行此操作。


使用/ tmp作为示例不是一个好主意,并且您实际上不想更改/ tmp目录的所有权(在大多数情况下)。

6> 小智..:

你可以这样做 :

mysql -u USERNAME --password=PASSWORD --database=DATABASE --execute='SELECT `FIELD`, `FIELD` FROM `TABLE` LIMIT 0, 10000 ' -X > file.xml

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有