我有一个导入过程,该过程采用制表符分隔值文件并将其清除为另一个与标签分隔的值文件,可以与LOAD DATA LOCAL INFILE
一起使用。
当我在我的测试批处理服务器上运行此过程时,它工作正常,连接到在另一个VM上运行的MySQL服务器并成功完成导入过程。
当我在暂存批处理服务器上运行它时,我从PDO获得以下异常:
PDOException
SQLSTATE[42000]: Syntax error or access violation: 1148 The used command is not
allowed with this MySQL version
我收集此错误通常是由于客户端或服务器配置中缺少local-infile=1
选项引起的,但是这似乎是在所有正确的位置设置,因为该过程有效在测试服务器上,但我仍然在暂存时收到此错误。
我正在创建我的PDO连接,如下所示:
$db = new \PDO("mysql:host={$connParams['host']};dbname={$connParams['dbname']}",
$connParams['user'], $connParams['password'], [
\PDO::MYSQL_ATTR_LOCAL_INFILE => true,
]);
创建LOAD DATA
语句并按如下方式执行:*
$stmt = $db->prepare('LOAD DATA LOCAL INFILE :file INTO TABLE `fll_import_data`
FIELDS TERMINATED BY \'\t\';');
$stmt->bindParam(':file', $userDataFile, \PDO::PARAM_STR, strlen($userDataFile));
$stmt->execute();
在MySQL服务器上,local_infile
设置为ON
:
mysql> SHOW VARIABLES LIKE '%local%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | ON |
+---------------+-------+
1 row in set (0.00 sec)
mysqld
未在命令行中使用--local-infile=0
启动:
$ ps aux | grep [m]ysql
mysql 11976 0.0 0.0 4180 728 ? S 13:32 0:00
/bin/sh /usr/bin/mysqld_safe
mysql 12537 0.0 0.8 532896 132580 ? Sl 13:32 0:01
/usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
$
我在两台服务器上的/etc/mysql/conf.d/custom.cnf
都有以下内容:
[client]
default-character-set = utf8mb4
local-infile=1
[mysqld]
innodb_large_prefix=ON
innodb_file_format=BARRACUDA
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
innodb_strict_mode=ON
innodb_file_per_table=ON
default_time_zone='+00:00'
local-infile=1
[mysql]
default-character-set = utf8mb4
local-infile=1
两台服务器上的 open_basedir
为空。 (var_dump
它会产生string(0) ""
)
mysqld
在两台服务器上都是版本5.6.23-1~dotdeb.3
,而php
在版本5.5.23-1~dotdeb.2
上同样适用于两台服务器。
我很难过,因为这个过程在测试环境中完美运行。我必须在/etc/php5/cli/php.ini
或/etc/mysql/*
的临时服务器上的某个位置丢失一个配置选项,但是关于此问题的所有其他SO帖子都指向缺少在实例化PDO时,配置中的local-infile = 1或缺少PDO::MYSQL_ATTR_LOCAL_INFILE
参数,但我确实已经有了这两个参数。
有人有任何想法吗?
(* 注意: PDO允许准备好的LOAD DATA语句,因为它模拟了准备过程)
更新1
为了确认,我可以从MySQL命令行客户端成功运行LOAD DATA LOCAL INFILE
:
mysql> LOAD DATA LOCAL INFILE '/home/batch-user/test.dat' INTO TABLE `test` FIELDS TERMINATED BY '\t';
Query OK, 4 rows affected, 8 warnings (0.00 sec)
Records: 4 Deleted: 0 Skipped: 0 Warnings: 8
mysql>