【发布时间】:2011-06-17 21:48:59
【问题描述】:
我正在尝试使用 mySQL 的 SELECT INTO OUTFILE 和 LOAD DATA INFILE 函数为 Web 应用程序创建一个简单的导入/导出功能。
将 outfile/infiles 的路径保留为默认的 mysql 路径(我认为通常进入 mysql.ini 定义的 tmp 目录)似乎最简单。
为确保与现有导出不发生冲突,我生成了一个时间戳的 MD5 作为前缀,并将其附加到 OUTFILE:
$this->prefix = md5(time());
SELECT * INTO OUTFILE ' . $this->prefix . '-' . $table . '.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
FROM " . $table . " WHERE 1
到目前为止一切顺利,我的日志文件显示了 /var/lib/mysql/master/ 中创建的 csv 文件
但当脚本尝试执行LOAD DATA INFILE 时,找不到该文件:
2011-06-17 14:31:35 - INFO --> Created outfile: eae77f210684ba0616c773677f707513-table.csv
2011-06-17 14:31:35 - ERROR --> mySQL Error: 2 - File 'eae77f210684ba0616c773677f707513-table.csv' not found (Errcode: 2)
LOAD INFILE 和 SELECT INTO OUTFILE 是否有可能使用不同的默认位置?
编辑添加:我继续并在 LOAD INFILE 命令中指定了 mysql tmp 目录——由于某种原因它没有找到该文件,即使它显然存在并且我假设相同的“用户”正在读取它并写入它:
$ sudo find / -name '8e357dcba6557a31f9a36230c4233d1b-table.csv'
/var/lib/mysql/master/8e357dcba6557a31f9a36230c4233d1b-table.csv
2011-06-17 15:04:25 - INFO --> Created outfile: 8e357dcba6557a31f9a36230c4233d1b-table.csv
2011-06-17 15:04:25 - ERROR --> mySQL Error: 13 - File '/var/lib/mysql/master/8e357dcba6557a31f9a36230c4233d1b-table.csv' not found (Errcode: 13)
编辑:添加 INFILE 语句
$this->prefix = md5(time());
$this->mysql_dir = "/var/lib/mysql/master/";
LOAD DATA LOCAL INFILE ' . $this->mysql_dir . $this->prefix . '-' . $table . '.csv
INTO TABLE $table
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
谢谢
【问题讨论】:
-
当您尝试“加载文件`?而且,既然你展示了你用来创建 OUTFILE 的 SQL,为什么你不展示 LOAD 命令呢?
-
那些日志条目只是我自己的日志注释——这不是一个“官方”的 mysql 日志文件。它在实际的 OUTFILE 语句返回成功代码时被写入。我将发布 load infile 语句。
-
编辑后,问题似乎很清楚。您正在使用
$this->prefix = md5(time());作为文件名的一部分创建OUTFILE。您的LOAD INFILE也使用$this->prefix = md5(time());作为文件名的一部分;如果时间发生了变化,MD5 值将不匹配,因此OUTFILE和INFILE名称也不匹配。 -
@Ken-- 谢谢,但也不是这样,因为时间戳是相同的 - 类设置该时间戳/md5,然后使用它同时进行导出/导入.它不会针对不同版本的 outfile 运行。