11

我正在使用 MySQLLOAD 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);
4

5 回答 5

28

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

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

解决方案:

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

    当您在终端上启动 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文件中设置(这是有安全风险的):

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

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

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

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

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

于 2012-10-10T22:01:19.307 回答
2

除了local-infile与 MySQL 服务器一起使用(您也可以将其放在 /etc/my.cnf 文件中),您还需要启用 PDO 以允许它:

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

local-infile否则,无论MySQL 服务器上的值如何,它都不会工作。

于 2014-01-02T22:22:42.183 回答
0

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

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

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

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

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

于 2015-04-29T09:11:45.020 回答
0

旧版 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目录中读取文件。

于 2014-04-02T08:37:15.100 回答
0

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

  1. 使用命令行登录 mysql。

    mysql -u 根目录 -p

  2. 检查本地infile状态:

    显示像'local_infile'这样的变量;

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

    设置全局 local_infile = 1;

  4. 再次检查状态:

    显示像'local_infile'这样的变量;

  5. 输出将是: 立即查看

  6. 最后重启mysql:

    服务mysql重启

于 2019-12-05T05:54:30.240 回答