【问题标题】:LOAD DATA INFILE Error Code : 13加载数据输入错误代码:13
【发布时间】:2011-05-12 01:01:26
【问题描述】:

在我的远程 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)

一个。数据库用户登录拥有所有的授权权限。

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'@'%';

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

【问题讨论】:

  • 你说的是远程mysql,是不是把csv放到远程mysql?
  • 从 MS Windows 系统使用 mysqlbench 连接到远程 mysql 数据库。是的,csv 文件确实驻留在远程 Linux 服务器中。

标签: mysql file-io


【解决方案1】:
  1. 将 db_name.* 上的所有权限授予 'db_user'@'localhost';
  2. 将 .* 上的文件授予 'db_user'@'localhost' 由 'password' 识别;
  3. 刷新特权;
  4. SET GLOBAL local_infile = 1;
  5. MYSQL 配置中的变量“secure-file-priv”必须为空 线!!!

【讨论】:

    【解决方案2】:

    CentOS 7+ Minimal Secure 解决方案:(也应该与 RedHat 一起使用)

    chcon -Rv --type=mysqld_db_t /YOUR/PATH/
    

    说明:

    知道您应用了在my.cnf 中使用secure-file-priv=/YOUR/PATH/ 的良好实践以便使用load data infile sql 语句,您仍然会看到以下内容:

    ERROR 13 (HY000): Can't get stat of '/YOUR/PATH/FILE.EXT' (Errcode: 13 "Permission denied")

    这是由 SELinux Enforcing 模式引起的,将模式更改为 Permissive 或禁用 SELinux 是不安全的。
    总之,

    chcon 更改文件的 SELinux 安全上下文或 文件/目录的方式类似于“chown”或“chmod”的方式 用于更改文件的所有权或标准文件权限。

    SELinux Enforcing 模式阻止mysqld 访问安全上下文类型为default_t 的目录,因此我们需要将路径的安全上下文类型更改为mysqld_db_t。要查看当前的安全上下文类型,请使用以下命令:

    ls --directory --scontext /YOUR/PATH/
    

    如果您想重置/撤消解决方案,请应用以下命令:

    restorecon -Rv /YOUR/PATH/
    

    以下链接引用了我分享的解决方案:

    https://wiki.centos.org/HowTos/SELinux
    https://mariadb.com/kb/en/selinux/
    https://linux.die.net/man/8/mysqld_selinux

    【讨论】:

      【解决方案3】:

      我知道,这是一个旧线程,但仍有许多人面临 LOAD DATA INFILE 的问题!

      有很多很好的答案,但对我来说,没有一个有用:)

      我正在使用 mariadb/server docker 容器运行 MariaDB,它在 Ubuntu 上运行,但我对 apparmor 没有任何问题

      对我来说问题很简单,我在 /root/data.csv 中有文件,当然 mysql 用户无法访问它!

      另一方面,人们推荐 LOAD DATA LOCAL INFILE 作为替代方案,虽然它可以工作,但它的性能不如标准的“LOAD DATA INFILE”,因为当使用“LOCAL”时,它假定文件正在被加载从远程终端,它的处理变得不同。

      为获得最佳性能,请始终使用“加载数据输入文件”,除非您必须直接从远程服务器或笔记本电脑/台式机加载文件。由于安全原因,这当然被禁用,因此您必须通过服务器的配置文件“/etc/my.cnf”或“/etc/my.cnf.d/server.cnf”允许“LOCAL_INFILE”,具体取决于您的操作系统。

      最后,对我来说,容器将“secure_file_priv”参数定义为“/data”

      b510bf09bc5c [testdb]> SHOW GLOBAL VARIABLES LIKE '%SECURE_FILE_%';
      +------------------+--------+
      | Variable_name    | Value  |
      +------------------+--------+
      | secure_file_priv | /data/ |
      +------------------+--------+
      

      这意味着,只有在从“/data”文件夹加载数据文件时,LOAD DATA INFILE 才会起作用!注意这一点并使用正确的文件夹:)

      希望这对某人有所帮助。

      干杯。

      【讨论】:

        【解决方案4】:

        过去几天我也一直在为这个问题苦苦挣扎,我也求助于堆栈溢出来寻求答案。

        然而,似乎没有人提到将数据导入 MySQL 的最简单方法实际上是通过他们自己的导入数据向导工具!!

        只需右键单击表格,它就会出现。

        以上答案都没有帮助我,所以如果你遇到困难就用这个! :)

        【讨论】:

          【解决方案5】:
          1. 检查此系统变量local_infile 是否开启
           SHOW VARIABLES LIKE 'local_infile';
          +---------------+-------+
          | Variable_name | Value |
          +---------------+-------+
          | local_infile  | ON    |
          +---------------+-------+
          

          如果没有,重启mysqld

          sudo ./mysqld_safe --local-infile
          
          1. 将 csv 文件更改为 /tmp 文件夹,以便 mysqls 可以读取它。

          2. 导入到数据库

          mysql> LOAD DATA INFILE '/tmp/a.csv'  INTO TABLE table_a  FIELDS TERMINATED BY ','  ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
          Query OK, 18 rows affected (0.17 sec)
          Records: 18  Deleted: 0  Skipped: 0  Warnings: 0
          

          【讨论】:

          • 同样的错误。 Error Code: 29. File '/tmp/movies.csv' not found (Errcode: 13 - Permission denied)
          【解决方案6】:

          如果您在 Mac 上使用 XAMPP,这对我有用:

          将 CSV/TXT 文件移动到 /Applications/XAMPP/xamppfiles/htdocs/ 如下

          LOAD DATA LOCAL INFILE '/Applications/XAMPP/xamppfiles/htdocs/file.csv' INTO TABLE `tablename` FIELDS TERMINATED BY ',' LINES TERMINATED BY ';'
          

          【讨论】:

            【解决方案7】:

            旧:

            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, 500 rows affected, 284 warnings (1.24 sec)
            Query OK, 5000 rows affected, 2846 warnings (1.24 sec)
            

            【讨论】:

              【解决方案8】:

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

              • [mysql] 段落之后的两个 位置用local-infile =1 更新文件/etc/mysql/my.cnf(这允许使用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/(这允许使用您的文件所在的目录)。

              【讨论】:

                【解决方案9】:

                如果您使用 cPanel 或 phpmyadmin 导入 CSV using LOAD DATA,请务必启用 Use LOCAL keyword。这在共享服务器环境中对我有用。

                【讨论】:

                  【解决方案10】:

                  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 文件权限相关的东西

                  【讨论】:

                  【解决方案11】:

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

                  首先我的测试环境如下

                  • Ubuntu 14.04.3 64 位
                  • mysql Ver 14.14 Distrib 5.5.47,适用于使用 readline 6.3 的 debian-linux-gnu (x86_64)(仅通过 'sudo apt-get install ...' 命令安装)

                  我的测试结果是

                  i) AppArmor 解决方案仅适用于 /tmp 案例。

                  ii) 以下解决方案无需 AppArmor 解决方案即可工作。 我想感谢 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
                  • 检查所有路径元素是否具有从 / 到数据文件路径的全局读取权限。例如,如果 INFILE 的目标是 '/home/hongsoog/study/mysql/memer.dat',则以下子路径应该是全局可读的或 mysql 组可读的

                    • /家
                    • /home/hongsoog
                    • /home/hongsoog/study/mysql
                    • /home/hongsoog/study/mysql/member.data

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

                  加载数据本地INFILE ...
                  , 你会得到

                  ERROR 1148 (42000):此 MySQL 版本不允许使用的命令


                  总之,mysql 客户端命令中的“--in-file=1”选项和“LOAD DATA LOCAL INFILE ...”应该齐头并进。

                  希望对大家有所帮助。

                  【讨论】:

                    【解决方案12】:

                    对于 Ubuntu 用户

                    我在 Ubuntu 15.10 上运行 mysql 5.6.28,但我遇到了完全相同的问题,我在 my.cnf 中有所有必要的标志 tmpdir = /tmp 本地文件=1 重新启动mysql,我仍然会得到 加载数据输入错误代码:13

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

                    基本上,假设您的 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
                    

                    我希望这对少数 Ubuntu 用户有所帮助

                    【讨论】:

                      【解决方案13】:

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

                      解决方案如下:

                      默认情况下

                      --local-infile 设置为值 0

                      ,要使用 LOAD DATA LOCAL INFILE,必须启用它。

                      所以 像这样启动 mySQL

                      mysql -u 用户名 -p --local-infile

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

                      【讨论】:

                        【解决方案14】:

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

                        setenforce 0
                        

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

                        setenforce 1
                        

                        【讨论】:

                        • 您需要 root 权限才能执行此操作。
                        • 我的电脑和手机上都有 selinux 手册,但从来没有哪个安全软件比 selinux 更让人伤心。现在我必须弄清楚如何在 selinux 中授予 mysql 权限以访问另一个驱动器中的文件。
                        【解决方案15】:

                        mysql 配置文件中的 [mysqld] 部分下有一个属性 有名字 - tmpdir

                        例如:

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

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

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

                        另一种解决方案

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

                        load data local infile
                        

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

                        --local-infile
                        

                        你可以在访问mysql时通过命令提示符改变它的值

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

                        干杯

                        【讨论】:

                        • 谢谢你,它对我有用。我只是先将需要读取的每个 CSV 复制到 /tmp,然后运行 ​​LOAD DATA 并解决了“错误代码 13”问题。
                        • 这也解决了我的代码 13 问题。将我的日志文件迁移到那里,就像魔术一样,它起作用了(加载数据本地 infile 'c:/temp/kmwdw.log')
                        【解决方案16】:

                        我使用的是 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
                        

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

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

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

                        注意 csv 文件的扩展名前必须与表格名称相同。

                        【讨论】:

                          【解决方案17】:

                          在我的查询中添加关键字“本地”对我有用:

                          LOAD DATA LOCAL INFILE 'file_name' INTO TABLE table_name
                          

                          关键字的详细说明可以查看here

                          【讨论】:

                          • 这不适用于 MariaDB(Linux x86_64 上至少版本 10.0.22):“此 MariaDB 版本不允许使用使用的命令”
                          • @jciloa,您可以添加 --local-infile=1 或使用松散本地文件的 [client] 配置选项(从内存中稍微阅读一下)让它成为允许。通过此命令访问本地文件存在安全风险,因此默认情况下不启用。
                          • ERROR 1148 (42000): The used command is not allowed with this MySQL version
                          • 在 mariadb 上非常适合我...
                          • 这在 MariaDB v.15.1 上对我有用
                          【解决方案18】:

                          我知道这篇文章很旧,但它仍然出现在搜索结果中。我在网上找不到这个问题的解决方案,所以我最终自己弄清楚了。如果您使用的是 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”,但是用你最喜欢的文本编辑器替换它,你知道如何使用。

                          【讨论】:

                          • 这件衣服很不成熟。这个解决方案对我来说也很好。但是今天它拒绝了完美工作的 before 子文件夹,该子文件夹使用 /UPPERFOLDER/* rw 符号注册在文件中。我必须明确添加一行命名该子文件夹!
                          • 谢谢,但这仍然没有为我解决。作为最后的解决方法,我切换到 MariaDB,那里一切正常。
                          • 谢谢,这对我也有用。请注意,本地关键字在 MySQL 5.6.16 版本中不起作用,我收到“错误代码 1148,此 MySQL 版本不允许使用的命令”
                          • 非常感谢...这整件事花了我太长时间,在找到解决我问题的方法之前,我不得不查看很多其他帖子!我首先尝试解决不允许使用命令LOAD DATA LOCAL INFILE ... 的问题。删除LOCAL 后,我遇到了您的帖子,最终解决了它。谢谢!
                          【解决方案19】:

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

                          目录权限不足

                          这个例子中的错误导致 因为您要尝试的文件 导入不在一个目录中 用户可以读取 MySql 服务器 正在运行。请注意,所有 目录的父目录 需要被 MySql 用户为此工作。保存 /tmp 的文件通常用作 这通常是可读的(并且 可写)由所有用户。错误代码 数字是 13。 Source

                          编辑:

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

                          示例来自 MySql 论坛上的 this 帖子。

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

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

                          /tmp

                          /tmp/imports

                          以及主要的两个:

                          /tmp/imports/site1

                          /tmp/imports/site1/data.file

                          您需要文件和目录是世界可读的。 如果您已经尝试过此方法,我们深表歉意,但可能值得回顾您的步骤,仔细检查不会有任何坏处。

                          【讨论】:

                          • 我尝试使用 LOAD DATA LOCAL INFILE。但我收到错误消息 - 此 MySQL 版本不允许使用使用的命令。 mysql的版本是5.0.77
                          • 您好,感谢您的光临。我已经使用 drwxrwxrwx 授予了所有目录、子目录、文件的权限。重新连接数据库,刷新它,但仍然无法正常工作。
                          • 哇,这真是令人讨厌。我会到处打猎。
                          • 如果你很懒惰,只需暂时将数据文件放在 MySQL 可以访问的位置 - 例如在/etc/mysql/conf.d/ 目录中,不要忘记在导入后从那里删除它;)无论如何,这是当您在 mysql“root”用户上获得“权限被拒绝”时的主要解决方案:D,谢谢 :)
                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2016-02-14
                          • 2020-03-19
                          • 2013-05-25
                          • 2013-04-24
                          • 1970-01-01
                          相关资源
                          最近更新 更多