【问题标题】:MySQL: Enable LOAD DATA LOCAL INFILEMySQL:启用 LOAD DATA LOCAL INFILE
【发布时间】:2012-06-01 11:57:07
【问题描述】:

我在 Ubuntu 12 LTS 上运行 Mysql 5.5。我应该如何在 my.cnf 中启用 LOAD DATA LOCAL INFILE?

我尝试在我的配置中的各个位置添加 local-infile,但我仍然收到“此 MySQL 版本不允许使用的命令”

【问题讨论】:

    标签: mysql


    【解决方案1】:

    来自 MySQL 5.5 手册页:

    LOCAL 仅在您的服务器和客户端都已 配置为允许它。例如,如果 mysqld 以 --local-infile=0,本地不起作用。请参阅第 6.1.6 节,“LOAD DATA LOCAL 的安全问题”。

    你应该设置选项:

    local-infile=1
    

    进入 my.cnf 文件的 [mysql] 条目或使用 --local-infile 选项调用 mysql 客户端:

    mysql --local-infile -uroot -pyourpwd yourdbname
    

    您必须确保在您的 [mysqld] 部分中也定义了相同的参数,以启用“本地 infile”功能服务器端。

    这是一个安全限制。

    【讨论】:

    • 谢谢。顺便说一句,我的机器(AWS EC2)中的my.cnf 路径是/etc/mysql/my.cnf
    • 有趣的是,my.cnf 文件在我的 /etc 目录中。
    • 如果仍然失败,关于去哪里的任何想法。我在 [client]、[mysqld] 和 [mysql] 下的 my.cnf 文件中添加了 local-infile=1,并使用了这些组合。所有结果都相同。我试过重新启动工作台,但没有运气。我也在每次更改之间停止并启动了 mySQL 工作台。
    • 将 mySQL 更新到 6.2.5 为我解决了这个问题
    • 答案是正确的方向。但对于那些面临这个问题的人来说,这是另一个问题。如果您在系统上启用了 apparmor 并且问题仍然存在,请检查 syslog 以查看 mysqld 守护程序是否被阻止。我遇到了这个问题:apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/var/www/myfile.csv" pid=19488 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=106 ouid=33。解决方案非常简单。只需更新您的 /etc/apparmor.d/local/usr.sbin.mysqld 并重新加载 apparmor 服务。
    【解决方案2】:

    您应该编辑的 my.cnf 文件是 /etc/mysql/my.cnf 文件。只是:

    sudo nano /etc/mysql/my.cnf
    

    然后添加:

    [mysqld]
    local-infile 
    
    [mysql]
    local-infile 
    

    标题 [mysqld][mysql] 已经给出,只需在文件中找到它们并在每个下面添加 local-infile其中。

    它适用于我在 Ubuntu 12.04 LTS 上的 MySQL 5.5。

    【讨论】:

    • 这绝对是在 Ubuntu 12.04 上为我解决的问题。
    • 我也可以确认Ubuntu 14.04.2 LTS not working
    • 也适用于 Mac。对于 Mac 用户,/mysql/my.cnf 默认不存在。只需创建目录和文件,然后将这些行粘贴到文件中。
    • 如果你不希望这个配置在 mysql 升级时被覆盖,你应该把它放到/etc/mysql/conf.d/enable-local-infile.cnf 也不要忘记在进行配置更改后sudo service mysql restart 以便它需要效果。
    • 这是正确的解决方案。最高支持的解决方案没有提到您必须将 [mysqld] 放在 local-infile 行之前。
    【解决方案3】:

    我在 MySQL 8.0.11 上使用 mysql 终端命令解决了这个问题:

    SET GLOBAL local_infile = true;
    

    我的意思是我先用通常的方式登录:

    mysql -u user -p*
    

    之后你可以通过命令查看状态:

    SHOW GLOBAL VARIABLES LIKE 'local_infile';
    

    它应该打开。我不会在这里写关于将本地文件加载到数据库中的安全问题。

    【讨论】:

    • 我尝试了许多其他解决方案,但只有命令 SET GLOBAL local_infile = true; 有效。我的 MySQL 版本是 8.0.12。也许这是最新的解决方案。非常感谢。
    • 不幸的是,重启服务器后变量再次关闭。
    • Mohit,我以某种方式解决了它,因为现在全局变量“local_infile”始终处于打开状态,即使在重新启动后也是如此。看来我没有为此使用 my.cnf 文件。请您尝试以 root 身份登录最新版本的 PhpMyAdmin,转到变量部分,搜索“local_infile”,然后单击编辑,将其更改为 ON,最后按 Enter。成功了吗?
    • 只有这个答案在 Windows 上的 8.0.12 MySQL Community Server 上对我有用。
    • 我在 Windows server 2016 上安装了 MySQL 8.0.16,我执行了 SET GLOBAL local_infile = true; 命令,但我仍然收到相同的错误 ERROR 1148 (42000): The used command is not allowed with this MySQL version,但使用 --load-infile=1 连接到 mysql工作mysql --local-infile=1 -u root -p
    【解决方案4】:

    用原生驱动替换驱动php5-mysql

    在 debian 上

    apt-get install php5-mysqlnd
    

    【讨论】:

    • 这成功了!使用股票 aws 12.04 ubuntu,当我连接到 RDS 时,我需要“本地”。谢谢一百万!
    • 非常感谢,这个解决方案对我有用。我已经问过问题stackoverflow.com/questions/36526102/…
    • 没有成功 ubuntu 12.04
    • 又一位满意的客户! ubuntu 14.04 mysql 5.7
    【解决方案5】:

    如果您在 ubuntu 上使用的 mysql 在任何情况下都不起作用,并且仍然出现 1148 错误,您可以通过命令行运行 load data infile 命令

    打开一个终端窗口

    运行mysql -u YOURUSERNAME -p --local-infile YOURDBNAME

    您将被要求输入 mysqluser 密码

    您将运行 MySQLMonitor,您的命令提示符将是 mysql>

    运行load data infile 命令(不要忘记以分号结尾;

    像这样:

    load data local infile '/home/tony/Desktop/2013Mini.csv' into table Reading_Table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
    

    【讨论】:

      【解决方案6】:

      见下图……

      我已将--local-infile=1 添加到正常的mysql 命令mysql -u root -p

      所以总行是:

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

      【讨论】:

      • 这对我有用,而 SET GLOBAL .. 没有。 “源”命令 (\. file.sql) 是否以某种方式启动新会话或重置它?我没有尝试将设置放入 mmy sql 脚本中。
      【解决方案7】:

      另外,对于其他读者,如果您尝试在 Django 中执行此操作,并且您的服务器允许 local_infile(您可以通过 mysql 客户端键入 SHOW VARIABLES 进行检查),那么您可以将其添加到您的 settings.py 文件(因为 python MySQLdb 默认不读取 .my.cnf 文件):

      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.mysql',
              'NAME': 'mydb',
              'USER': 'myname',
              'PASSWORD': 'mypass',
              'HOST': 'myserver',
              'PORT': '3306',
              'OPTIONS' : {
                  'local_infile':1,
              },
          }
      }
      

      【讨论】:

      • 你在哪里找到'OPTIONS' : { 'local_infile':1, }, 可以工作?
      【解决方案8】:

      您必须注意如何建立 mysqli 连接。此解决方案的全部功劳归于 Jorge Albarenque,source

      为了修复它,我必须:

      • 将 local-infile=1 添加到 my.cnf 的 [mysqld] 和 [mysql] 部分(如上面的 cmets 中所述)
      • 使用 mysqli_real_connect 函数 (PHP documentation)。

      问题在于,使用该函数,您可以显式启用对 LOAD DATA LOCAL INFILE 的支持。例如(程序风格):

      $link = mysqli_init();
      mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
      mysqli_real_connect($link, $host, $username, $password, $database);
      

      或面向对象

      $mysqli = mysqli_init();
      $mysqli->options(MYSQLI_OPT_LOCAL_INFILE, true);
      $mysqli->real_connect($host, $username, $password, $database);
      

      【讨论】:

      • @Mask 无法确认。我的解决方案在 5.5.46 (Ubuntu) 上运行
      【解决方案9】:

      如果您的 csv 文件与 db 位于 same,则需要在 LOAD DATA INFILE 中删除 LOCAL, 否则你会得到错误

      此 MySQL 版本不允许使用的命令

      【讨论】:

      【解决方案10】:

      clientmysqld 部分中添加local_infile

      [client]
      local_infile=1
      ...
      
      [mysqld]
      local_infile=1
      ...
      

      在 Windows 和 Linux 的 MySQL 8.x 中测试。

      【讨论】:

        【解决方案11】:

        另一种方法是使用mysqlimport 客户端程序。

        你调用它如下:

        mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt
        

        这会生成一个LOAD DATA 语句,它将tableName.txt 加载到tableName 表中。

        请记住以下几点:

        mysqlimport根据你提供的文件确定表名;使用从文件名开头到第一个句点的所有文本作为表名。因此,如果您希望将多个文件加载到同一个表中,您可以区分它们,例如 tableName.1.txttableName.2.txt、...等。

        【讨论】:

          【解决方案12】:

          这对我来说有点奇怪,从一天到下一天,几天以来一直在工作的脚本就停止工作了。没有更新版本的 mysql 或任何类型的升级,但我遇到了同样的错误,所以我最后一次尝试 CSV 文件并注意到行尾使用 \n 而不是预期的(根据我的脚本) \r\n 所以我用正确的 EOL 保存它并再次运行脚本没有任何问题。

          我觉得 mysql 告诉我这个 MySQL 版本不允许使用的命令有点奇怪,因为原因完全不同。

          我的工作命令如下所示:

          LOAD DATA LOCAL INFILE 'file-name' IGNORE INTO TABLE table-name CHARACTER SET latin1 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES.
          

          【讨论】:

            【解决方案13】:

            我使用了以下方法,该方法不需要对配置进行任何更改,在 mysql-5.5.51-winx64 和 5.5.50-MariaDB 上进行了测试:

            将“加载数据...”放入 .sql 文件(例如:LoadTableName.sql)

            LOAD DATA INFILE 'D:\\Work\\TableRecords.csv' INTO TABLE tbl1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (col1,col2);
            

            然后:

            mysql -uroot -pStr0ngP@ss -Ddatabasename -e "source D:\Work\LoadTableName.sql"
            

            【讨论】:

              【解决方案14】:

              如果是 Mysql 5.7,您可以使用“显示全局变量,如“local_infile”;”这将给出本地 infile 状态,您可以使用“set global local_infile=ON;”打开它。

              【讨论】:

                【解决方案15】:

                我正在使用 xampp v3.2.4 和 mysql 服务器 8.0.20。

                我在文件“my.ini”中将local-infile=1 添加到[mysql][mysqld]。该文件位于“C:\xampp\mysql\bin\my.ini”。

                然后我使用以下代码 LOAD DATA INFILE ... 从 csv 文件中插入数据。移动本地很重要。否则它将无法正常工作。

                感谢以上所有建议。我终于找到了一个组合。

                【讨论】:

                  【解决方案16】:

                  好的,这里发生了一些奇怪的事情。要使其工作,不需要在 /etc/mysql/my.cnf 中进行任何配置更改。您需要做的就是在终端中重新启动当前的mysql服务:

                  sudo service mysql restart
                  

                  然后如果我想“重新创建”错误,我只需重新启动 apache 服务:

                  sudo service apache2 restart
                  

                  然后可以通过输入以下命令再次修复:

                  sudo service mysql restart
                  

                  所以,看来 apache2 正在做一些不允许此功能的事情 当它启动时(如果重新启动 mysql 服务,则会反转/纠正)。

                  在基于 Debian 的发行版中有效。

                  service mysqld restart
                  service httpd restart
                  

                  在基于 RedHat 的发行版中有效

                  【讨论】:

                    【解决方案17】:

                    对于那些正在寻找答案以使 LOAD DATA LOCAL INFILE 像我一样工作的人来说,这可能会起作用。好吧,它对我有用,所以就这样吧。按照链接中的步骤安装 percona 作为您的 mysql 服务器和客户端。安装过程中会提示输入密码,因此请提供一个您会记住并在以后使用的密码。安装完成后,重新启动系统并通过转到terminal 并输入mysql -u root -p 然后输入密码来测试服务器是否已启动并运行。现在尝试运行命令LOAD DATA LOCAL INFILE .. 希望它有效:)

                    顺便说一句,我在 Ubuntu 12.04 上使用 Ruby 1.9.3 开发 Rails 2.3。

                    【讨论】:

                      【解决方案18】:

                      All:显然这是按设计工作的。请参阅 2019 年 7 月 23 日的新参考手册,第 6.1.6 节, LOAD DATA LOCAL 的安全问题

                      【讨论】:

                        【解决方案19】:

                        我知道这并不是 OP 所要求的,但由于这个线程已经很老了,而且这里提出的解决方案都不适合我,所以我决定分享这个。

                        如果有人在 MySql 版本 8 中启用 local_infile 时遇到问题,这里的命令对我有用:

                        SET PERSIST local_infile = 1;
                        

                        它将配置保存在“mysqld-auto.cnf”配置文件中,然后在服务或服务器重新启动后记住更改。

                        【讨论】:

                        • 为我工作,并且持续存在 - 但在版本 8.0.26 中找不到“mysqld-auto.cnf”。 “auto.cnf”存在但不包含设置。
                        • @user947737 在 Windows 上,文件默认创建在“C:\ProgramData\MySQL\MySQL Server 8.0\Data”中。
                        猜你喜欢
                        • 2020-07-25
                        • 1970-01-01
                        • 2012-10-05
                        • 2020-09-09
                        • 2013-01-24
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多