LOAD DATA INFILE错误代码:13

use*_*049 50 mysql file-io

在我的远程MySQL中,当我尝试执行此查询时,我收到MySQL错误代码:13.

查询 -

LOAD DATA INFILE 
'/httpdocs/.../.../testFile.csv'
INTO TABLE table_temp
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\\r \\n'
(sku, qty);
Run Code Online (Sandbox Code Playgroud)

错误代码 : 13 Can't get stat of '/httpdocs/.../.../testFile.csv' (Errcode: 2)

一个.数据库userlogin具有所有授权权限.

CREATE USER 'userName'@'%' IDENTIFIED BY '************';

GRANT ALL PRIVILEGES ON * . * TO 'userName'@'%' IDENTIFIED BY '************' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

GRANT ALL PRIVILEGES ON `userName\_%` . * TO 'userName'@'%';
Run Code Online (Sandbox Code Playgroud)

湾 我还使用FTP工具将文件和文件夹权限设置为chmod 777(rwxrwxrwx)

小智 99

我知道这篇文章很老了,但搜索结果仍然存在.我无法在网上找到这个问题的解决方案,所以我最终自己搞清楚了.如果您正在使用Ubuntu,那么有一个名为"Apparmor"的程序阻止MySQL查看该文件.如果您希望MySQL能够从"tmp"目录中读取文件,那么您需要执行以下操作:

sudo vim /etc/apparmor.d/usr.sbin.mysqld
Run Code Online (Sandbox Code Playgroud)

进入文件后,您将看到My​​SQL可以使用的一堆目录.将行添加/tmp/** rwk到文件中(我不确定它在哪里重要,但这里是我放置它的示例):

  /etc/mysql/*.pem r,

  /etc/mysql/conf.d/ r,

  /etc/mysql/conf.d/* r,

  /etc/mysql/*.cnf r,

  /usr/lib/mysql/plugin/ r,

  /usr/lib/mysql/plugin/*.so* mr,

  /usr/sbin/mysqld mr,

  /usr/share/mysql/** r,

  /var/log/mysql.log rw,

  /var/log/mysql.err rw,

  /var/lib/mysql/ r,

  /var/lib/mysql/** rwk,


  /tmp/** rwk,


  /var/log/mysql/ r,

  /var/log/mysql/* rw,

  /var/run/mysqld/mysqld.pid w,

  /var/run/mysqld/mysqld.sock w,

  /run/mysqld/mysqld.pid w,

  /run/mysqld/mysqld.sock w,
Run Code Online (Sandbox Code Playgroud)

现在您需要做的就是重新加载Apparmor:

sudo /etc/init.d/apparmor reload
Run Code Online (Sandbox Code Playgroud)

注意我使用了"vim",但用你最喜欢的文本编辑器代替你知道如何使用它.

  • 谢谢,但这对我来说仍然无法解决.作为最后的解决方法,我切换到MariaDB,那里的工作正常. (4认同)
  • aparmor 非常不成熟。这个解决方案对我来说也很好用。但是今天它拒绝了之前完美工作的子文件夹,该子文件夹在文件中使用 /UPPERFOLDER/* rw 符号注册。我必须添加一行明确命名该子文件夹! (2认同)

Mat*_*unz 53

在我的查询中添加关键字"LOCAL"对我有用:

LOAD DATA LOCAL INFILE 'file_name' INTO TABLE table_name
Run Code Online (Sandbox Code Playgroud)

可以在此处找到关键字的详细说明.

  • `ERROR 1148 (42000): 此 MySQL 版本不允许使用的命令` (2认同)

Jon*_*nVD 19

这通常是一个文件访问权限问题,但我看到你已经在b点解决了这个问题,但为了以防万一,它值得一试.另一种选择是使用LOAD DATA LOCAL INFILE,它可以解决许多文件访问权限问题.要使用此方法,您需要先在本地复制文件(最好在mysql文件夹中).•如果指定了LOCAL,则客户端主机上的客户端程序将读取该文件并将其发送到服务器.

目录权限不足

在这个例子中的错误导致,因为您要导入的文件是不是一个目录,其MySQL服务器正在运行,并且用户是可读的.请注意,MySql用户需要读取目录的所有父目录才能使其正常工作.将文件保存到/ tmp通常可以正常工作,因为这通常是所有用户都可读(可写).错误代码为13.

编辑:

请记住,您不仅需要拥有文件夹的文件夹,还需要上层目录的权限.

MySql论坛上这篇文章的例子.

如果您的文件包含了以下strucutre内:/tmp/imports/site1/data.file

你需要(我认为,755工作)r + x这些目录上的'other':

/ tmp目录

的/ tmp /进口

以及主要两个:

的/ tmp /进口/ site1的

/tmp/imports/site1/data.file

您需要文件和目录是世界可读的.道歉,如果你已经尝试过这种方法,但它可能是值得追溯你的步骤,绝不会伤害双重检查.


Ank*_*rma 14

mysql配置文件中的一个属性在[mysqld]部分下面,带有名称 - tmpdir

例如:

tmpdir = c:/temp (Windows) or tmpdir = /tmp (Linux)
Run Code Online (Sandbox Code Playgroud)

LOAD DATA INFILE命令只能在此位置执行读写操作.

因此,如果您将文件放在指定位置,则LOAD DATA INFILE可以轻松读取/写入任何文件.

还有一个解决方案

我们也可以通过以下命令导入数据

load data local infile
Run Code Online (Sandbox Code Playgroud)

在这种情况下,不需要将文件移动到tmpdir,您可以给出文件的绝对路径,但是要执行此命令,您需要更改一个标志值.国旗是

--local-infile
Run Code Online (Sandbox Code Playgroud)

您可以在访问mysql时通过命令提示符更改其值

mysql -u username -p --local-infile=1
Run Code Online (Sandbox Code Playgroud)

干杯

  • 谢谢你,这对我有用.我只是先将需要读取的每个CSV复制到/ tmp,然后运行LOAD DATA并解决了"错误代码13"问题. (2认同)

小智 5

我使用Ubuntu 12.04,我必须创建表,然后执行以下操作之一:

使用local给出错误(mysql 5.5):

> LOAD DATA LOCAL INFILE "file.csv" INTO table inverter FIELDS TERMINATED BY ',';
ERROR 1148 (42000): The used command is not allowed with this MySQL version
Run Code Online (Sandbox Code Playgroud)

出于安全原因,默认情况下禁用LOAD DATA INFILE命令,在此重新启用它并且它应该工作:https://stackoverflow.com/a/16286112/445131

您可以使用mysqlimport导入csv文件:

mysqlimport -u root -p --fields-terminated-by=',' --local dbname tablename.csv
Run Code Online (Sandbox Code Playgroud)

请注意,csv文件在扩展名之前必须与表格具有相同的名称.


小智 5

错误13只是权限问题.即使我有同样的问题,无法将数据加载到mysql表,然后自己解决了这个问题.

这是解决方案:

默认了

--local-infile设置为值0

,为了使用LOAD DATA LOCAL INFILE,必须启用它.

所以启动mySQL是这样的:

mysql -u username -p --local-infile

这将使启动期间启用LOCAL INFILE,因此不会出现任何问题!


Arn*_*hot 5

对于 Ubuntu 用户

我在 Ubuntu 15.10 上运行 mysql 5.6.28,我刚刚遇到了完全相同的问题,我在 my.cnf tmpdir = /tmp local-infile=1 中拥有所有必要的标志,重新启动了 mysql,我仍然会得到 LOAD DATA INFILE错误代码:13

就像 Nelson 提到的问题是“apparmor”,有点光顾 mysql 的权限,然后我通过这个快速简单的教程找到了解决方案。

基本上,假设您的 tmp 目录是/tmp

将新的 tmpdir 条目添加到 /etc/apparmor.d/local/usr.sbin.mysqld

sudo nano /etc/apparmor.d/local/usr.sbin.mysqld
Run Code Online (Sandbox Code Playgroud)

*添加这个

/tmp/ r,
/mnt/foo/tmp/** rw,
Run Code Online (Sandbox Code Playgroud)

重新加载AppArmor

sudo service apparmor reload
Run Code Online (Sandbox Code Playgroud)

重启MySQL

sudo service mysql restart
Run Code Online (Sandbox Code Playgroud)

我希望这能帮助一些 Ubuntu 用户