我正在尝试使用MySQL选择将表的内容转移到CSV文件中,然后将其插入Outfile语句中。如果我做:

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是一个权限错误,但是即使我将 /数据的所有权更改为MySQL:MySQL并给予777权限,我也会明白它。 MySQL作为用户“ mysql”运行。

奇怪的是,我可以在 /tmp中创建文件,而不是在我尝试过的任何其他目录中,即使设置了权限,因此用户MySQL应该能够写入目录。

这是在Ubuntu上运行的MySQL 5.0.75。

有帮助吗?

解决方案

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

最近使用Apparmor和MySQL的配置文件的Ubuntu Server版本(例如10.04)可能处于执行模式。您可以执行 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读写到 /数据目录。我们希望您已经考虑了这一点的安全含义。

其他提示

Ubuntu使用Apparmor,这是阻止您访问 /数据 /的原因。软呢帽使用SELINUX,这将在RHEL/Fedora/Centos机器上进行防止。

要修改AppArmor,以允许MySQL访问 /数据 /执行以下操作:

sudo gedit /etc/apparmor.d/usr.sbin.mysqld

在目录列表中的任何地方添加此行:

/data/ rw,

然后做一个:

sudo /etc/init.d/apparmor restart

另一个选择是完全禁用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相对应的配置文件,但是我通过将MySQL可读和可访问的目录路径中的每个目录在目录路径中进行解决,从而解决了问题。例如,如果创建目录 /TMP,则以下两个命令使SELECT进入Outfile能够输出.sql和.sql文件

chown mysql:mysql /tmp
chmod a+rx /tmp

如果您在主目录 /主页 /汤姆中创建一个目录,则必须对 /home和 /home /tom执行此操作。

你可以这样做 :

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

有些事情要尝试:

  • 是个 secure_file_priv 系统变量集?如果是这样,则所有文件必须写入该目录。
  • 确保该文件不存在-MySQL只会创建新文件,而不是覆盖现有文件。

我有同样的问题,我通过以下步骤解决了此问题:

  • 操作系统:Ubuntu 12.04
  • 已安装灯
  • 假设您的目录保存输出文件是:/var/www/csv/

在终端上执行以下命令,并使用GEDIT编辑器编辑此文件,以将您的目录添加到输出文件中。

sudo gedit/etc/apparmor.d/usr.sbin.mysqld

  • 现在将在编辑器中打开文件,请在此处添加您的目录

    /var/www/csv/* rw,

  • 同样,我在文件中添加了以下图像:

enter image description here

执行下一个命令重新启动服务:

sudo /etc/init.d/apparmor restart

例如,我执行查询后将查询中的phpmyadmin查询构建器输出CSV文件中的数据

SELECT colName1, colName2,colName3
INTO OUTFILE '/var/www/csv/OUTFILE.csv'
FIELDS TERMINATED BY ','
FROM tableName;

它成功完成并将所有行带有选定的列写入output.csv文件...

就我而言,解决方案是使目录路径中的每个目录在 mysql (chmod a+rx)。目录仍由其命令行中的相对路径指定。

chmod a+rx /tmp
chmod a+rx /tmp/migration
etc.

我只是遇到了同样的问题。我的问题是我试图倾倒的目录没有对MySQLD进程的写入权限。初始的SQL转储将写出,但CSV/TXT文件的写入将失败。看起来SQL转储是当前用户运行的,并且将转换为CSV/TXT作为运行MySQLD的用户运行。因此,目录需要两个用户的写入权限。

您需要提供绝对路径,而不是相对路径。

提供您要编写的 /数据目录的完整路径。

Ubuntu是否使用Selinux?检查是否已启用并执行。 /var/log/audit/audit.log可能会有所帮助(如果这是Ubuntu粘贴的地方 - 那是Rhel/Fedora的位置)。

在我的情况下,我在CentOS 6.7上遇到了同样的问题,所有权限都设置了,但仍然发生了错误。问题是SE Linux处于“执行”模式。

我使用命令将其切换为“允许” sudo setenforce 0

然后一切都为我解决了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top