【问题标题】:Error 1148 MySQL The used command is not allowed with this MySQL version错误 1148 MySQL 此 MySQL 版本不允许使用的命令
【发布时间】:2012-09-30 21:50:08
【问题描述】:

我正在使用 MySQL LOAD DATA LOCAL INFILE 命令并收到此错误:

PDOException: SQLSTATE[42000]: Syntax error or access violation: 1148 The used 
command is not allowed with this MySQL version: LOAD DATA LOCAL INFILE 
'/tmp/phpI0ox54' INTO TABLE `dev_tmp` FIELDS TERMINATED BY ',' ENCLOSED 
BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES; Array ( ) in 
dc_real_estate_form_submit() (line 147 of /PATH/TO/PHP/SCRIPT).

我们可以更改哪些设置以允许 LOAD DATA LOCAL infile?

这是我们正在使用的 Drupal 7 代码:

$sql = "LOAD DATA LOCAL INFILE '".$file."'
    INTO TABLE `dev_tmp`
    FIELDS
        TERMINATED BY ','
        ENCLOSED BY '\"'
    LINES
    TERMINATED BY '\\r\\n'
    IGNORE 1 LINES";

db_query($sql);

【问题讨论】:

  • 暂时需要新权限,可能是这个问题?
  • 在调用 mysql 时添加 --local-infile。有用。例如:mysql -h localhost --local-infile

标签: php mysql load-data-infile


【解决方案1】:

只需按照以下流程即可解决问题:

  1. 使用命令行登录mysql。

    mysql -u root -p

  2. 查看本地infile状态:

    显示像“local_infile”这样的变量;

  3. 如果输出关闭,请运行以下命令:

    SET GLOBAL local_infile = 1;

  4. 再次检查状态:

    显示像“local_infile”这样的变量;

  5. 输出将是: see now

  6. 最后重启mysql:

    服务mysql重启

【讨论】:

    【解决方案2】:

    我们使用 LOCAL 关键字的主要原因是 在 MySQL 手册中解释:

    另一方面,您不需要 FILE 权限来加载本地 文件。

    因此,如果您确实对服务器有文件访问权限,那么请尝试在 SQL 查询中跳过使用单词“LOCAL”,而是将文件复制到服务器和目录 mysql/data/[tablename]。

    更多关于这个本地/非本地的信息:PHPMyAdmin Bug

    您不必再担心更改 /etc/mysql/my.cnf

    【讨论】:

      【解决方案3】:

      旧版mysql_connect还有一个参数'client_flag'可以用来设置mysql参数。

      client_flags 参数可以是以下的组合 常量:128(启用 LOAD DATA LOCAL 处理),MYSQL_CLIENT_SSL, MYSQL_CLIENT_COMPRESS、MYSQL_CLIENT_IGNORE_SPACE 或 MYSQL_CLIENT_INTERACTIVE。阅读有关 MySQL 客户端的部分 常量以获取更多信息。在 SQL 安全模式下,此参数为 忽略。 http://php.net/function.mysql-connect

      例子:

      $db = mysql_connect($host, $user, $pass, FALSE, 128);
      

      但是,您也可能会遇到以下错误:

      ERROR 29 (HY000): File '/var/www/.../mysql_import.csv' not found (Errcode: 13)
      

      在这种情况下,您可能需要检查 App Armor 设置以允许 MySQL 访问文件系统上的导入文件。

      我特别补充了:

        /import/ r,
        /import/* rw,
      

      授予 MySQL 对 /import 的读/写访问权限

      例如:App Armor 配置文件示例

      cat /etc/apparmor.d/usr.sbin.mysqld 
      
      # vim:syntax=apparmor
      # Last Modified: Tue Jun 19 17:37:30 2007
      #include <tunables/global>
      
      /usr/sbin/mysqld {
        #include <abstractions/base>
        #include <abstractions/nameservice>
        #include <abstractions/user-tmp>
        #include <abstractions/mysql>
        #include <abstractions/winbind>
      
        capability dac_override,
        capability sys_resource,
        capability setgid,
        capability setuid,
      
        network tcp,
      
        /etc/hosts.allow r,
        /etc/hosts.deny r,
      
        /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,
        /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,
      
        # Custom import folders start
        # These folders will also be read/writeable by mysql.
        /import/ r,
        /import/* rw,
        # Custom import folders end
      
        /sys/devices/system/cpu/ r,
      
        # Site-specific additions and overrides. See local/README for details.
        #include <local/usr.sbin.mysqld>
      }
      

      之后 MySQL 可以从 /import 目录读取文件。

      【讨论】:

        【解决方案4】:

        除了在 MySQL 服务器上使用local-infile(你也可以把它放在 /etc/my.cnf 文件中),你还需要启用 PDO 来允许它:

        <?php
        $pdo = new PDO($dsn, $user, $password, 
            array(PDO::MYSQL_ATTR_LOCAL_INFILE => true)
        );
        

        否则不管 MySQL 服务器上local-infile 的值如何,它都不起作用。

        【讨论】:

          【解决方案5】:

          在 MySQL 中加载本地文件存在安全隐患,并且默认情况下处于关闭状态,如果可以的话,您希望将其关闭。如果不允许,您会收到此错误:

          ERROR 1148 (42000): The used command is not allowed with this MySQL version
          

          解决方案:

          1. 在 mysql 命令行上使用 --local-infile=1 参数:

            当你在终端启动 MySQL 时,包含 --local-infile=1 参数,类似这样:

            mysql --local-infile=1 -uroot -p
            
            mysql>LOAD DATA LOCAL INFILE '/tmp/foo.txt' INTO TABLE foo 
            COLUMNS TERMINATED BY '\t';
            

            那么命令是允许的:

            Query OK, 3 rows affected (0.00 sec)
            Records: 3  Deleted: 0  Skipped: 0  Warnings: 0
            
          2. 或者将参数发送到mysql守护进程中:

            mysqld --local-infile=1
            
          3. 或者在my.cnf文件中设置(这是有安全风险的):

            找到你的 mysql my.cnf 文件并以 root 身份编辑它。

            在 mysqld 和 mysql 指示符下添加 local-infile 行:

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

            保存文件,重启mysql。再试一次。

          更多信息可以在这里找到:http://dev.mysql.com/doc/refman/5.1/en/load-data-local.html

          【讨论】:

            猜你喜欢
            • 2013-08-28
            • 2015-10-10
            • 2020-04-28
            • 2019-06-22
            • 2017-04-06
            • 2017-02-01
            • 2014-11-10
            • 2015-04-17
            • 1970-01-01
            相关资源
            最近更新 更多