LOAD DATA INFILE错误代码:13

在我的远程MySQL中,当我尝试执行这个查询时,我得到了MySQL错误代码:13。

查询 –

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

错误代码: 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'@'%'; 

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

我知道这个post是旧的,但是这仍然出现在search结果中。 我无法在网上find这个问题的解决scheme,所以我最终自己搞清楚了。 如果您使用的是Ubuntu,那么有一个名为“Apparmor”的程序阻止MySQL查看该文件。 如果您希望MySQL能够从“tmp”目录读取文件,那么您需要执行以下操作:

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

一旦你在文件中,你会看到一堆MySQL可以使用的目录。 将/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, 

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

 sudo /etc/init.d/apparmor reload 

注意我使用了“vim”,但用任何你最喜欢的文本编辑器replace,你知道如何使用。

将关键字'LOCAL'添加到我的查询为我工作:

 LOAD DATA LOCAL INFILE 'file_name' INTO TABLE table_name 

关键字的详细描述可以在这里find。

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

目录权限不足

此示例中的错误是由于您要导入的文件不在MySql服务器正在运行的用户可读的目录中导致的。 请注意,目录中的所有父目录都需要MySql用户可以读取才能正常工作。 将文件保存到/ tmp通常会工作,因为这通常是所有用户可读(和可写)的。 错误代码编号是13. 来源

编辑:

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

在MySql论坛上的这个post的例子。

如果你的文件被包含在下面的结构中:/tmp/imports/site1/data.file

你会需要(我认为,755工作)r + x的“其他”在这些目录:

/ tmp目录

的/ tmp /import

以及主要的两个:

的/ tmp /import/ site1的

/tmp/imports/site1/data.file

你需要文件和目录是世界可读的。 道歉,如果你已经尝试过这种方法,但它可能是值得回溯你的步骤,从来没有伤害,仔细检查。

在configuration文件[mysqld]下有一个名为tmpdirconfiguration文件

例如:

 tmpdir = c:/temp (Windows) or tmpdir = /tmp (Linux) 

LOAD DATA INFILE命令只能在这个位置读写。

所以如果你把你的文件放在指定的位置,那么LOAD DATA INFILE可以轻松地读/写任何文件。

多一个解决scheme

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

 load data local infile 

在这种情况下,不需要将文件移动到tmpdir,你可以给文件的绝对path,但要执行这个命令,你需要改变一个标志值。 国旗是

 --local-infile 

你可以通过命令提示符改变它的值,同时获得MySQL的访问权限

 mysql -u username -p --local-infile=1 

干杯

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

这是解决scheme:

默认情况下

–local-infile被设置为0

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

所以像这样启动mySQL

mysql -u username -p –local-infile

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

我使用Ubuntu 12.04,我不得不创build表,然后执行其中的一个:

使用本地给出一个错误(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 

LOAD DATA INFILE命令由于安全原因被默认禁用,在这里重新启用它,它应该工作: https : //stackoverflow.com/a/16286112/445131

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

 mysqlimport -u root -p --fields-terminated-by=',' --local dbname tablename.csv 

请注意,csv文件在扩展名前必须与表相同。

如果您使用的是Fedora / RHEL / CentOO,则可以暂时禁用SELinux:

 setenforce 0 

加载您的数据,然后启用它:

 setenforce 1 

为Ubuntu用户

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

就像Nelson提到的问题是“apparmor”,有关权限的赞助mysql,然后我发现解决scheme感谢这个快速简单的教程。

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

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

 sudo nano /etc/apparmor.d/local/usr.sbin.mysqld 

*加这个

 /tmp/ r, /mnt/foo/tmp/** rw, 

重新加载AppArmor

 sudo service apparmor reload 

重新启动MySQL

 sudo service mysql restart 

我希望这将有助于less数Ubuntu的人

我有很多麻烦来解决这个问题,有两件事要做:

  • [mysql]段落之后的两个位置更新/etc/mysql/my.cnf文件,使用local-infile =1 (这允许使用LOCAL INFILE sql命令)。

  • 通过sudo gedit /etc/apparmor.d/usr.sbin.mysqld更新,所以apparmor将允许你通过添加行来写入/var/www/的特殊文件:

/name of your directory/ r,

/name of your directory/* rw,

您的目录的名称可以是/var/www/toto/ (这允许使用您的文件所在的目录)。

我遇到了同样的问题,并应用了上面的解决scheme。

首先我的testing环境如下

  • Ubuntu 14.04.3 64bit
  • mysql Ver 14.14 Distrib 5.5.47,对于使用readline 6.3的debian-linux-gnu(x86_64)(只需安装'sudo apt-get install …'命令)

我的testing结果是

i)AppArmor解决scheme仅适用于/ tmp情况。

ii)以下解决scheme无AppArmor解决scheme。 我想感谢Avnish Mehta的回答。

 $ mysql -u root -p --in-file=1 ... mysql> LOAD DATA LOCAL INFILE '/home/hongsoog/study/mysql/member.dat' -> INTO TABLE member_table; 

重要的三点是

  • 用–in-file = 1选项启动mysql客户端
  • 使用LOAD DATA LOCAL INFILE而不是LOAD DATA INFILE
  • 检查所有path元素具有从/到数据文件path的世界读取权限。 例如,如果INFILE定位为“/home/hongsoog/study/mysql/memer.dat”,那么下面的子path应该是世界可读的或者是mysql可读的。

    • /家
    • /家/ hongsoog
    • /家庭/ hongsoog /学习/ MySQL的
    • /home/hongsoog/study/mysql/member.data

当你启动mysql客户端没有“–in-file = 1”选项并使用

  LOAD DATA LOCAL INFILE ... 

, 你会得到

错误1148(42000):这个MySQL版本不允许使用该命令


总之,mysql客户端命令中的“–in-file = 1”选项和“LOAD DATA LOCAL INFILE …”应该结合在一起。

希望对任何人有帮助。

load data infile '/root/source/in.txt' into table employee; ==>错误代码:13

load data infile '/tmp/in.txt' into table employee; ==>的作品

CentOS 6.6版(最终版) – 5.5.32 MySQL社区服务器(GPL)

一些与Linux文件权限有关的东西

如果您使用cPanel或phpmyadmin CSV using LOAD DATA导入CSV using LOAD DATAUse LOCAL keyword确保启用Use LOCAL keyword 。 这在共享服务器环境中适用于我。

旧:

 LOAD DATA INFILE '/home/root12/Downloads/task1.csv' INTO TABLE test.task FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS; File '/home/root12/Downloads/task1.csv' not found (Errcode: 13 - Permission denied) 

新的工作给我:

 LOAD DATA LOCAL INFILE '/home/root12/Downloads/task1.csv' INTO TABLE test.task FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS; Query OK, 5000 rows affected, 29684 warnings (2.24 sec)