【问题标题】:mysql LOAD INFILE / OUTFILEmysql 加载文件/输出文件
【发布时间】: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 INFILESELECT 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 值将不匹配,因此 OUTFILEINFILE 名称也不匹配。
  • @Ken-- 谢谢,但也不是这样,因为时间戳是相同的 - 类设置该时间戳/md5,然后使用它同时进行导出/导入.它不会针对不同版本的 outfile 运行。

标签: mysql load-data-infile


【解决方案1】:

你试过LOAD DATA LOCAL INFILE吗?

【讨论】:

  • 这实际上是问题所在——删除 LOCAL 并指定文件系统路径就可以了。 LOCAL infile 更改了 mySQL 查找数据的路径。
【解决方案2】:

我认为 julio,问题出在逻辑上,而不是 SELECT INTO OUTFILELOAD DATA INFILE

在您的两个示例中,您将 $this->prefix 添加到 OUTFILE / INFILE 语句中,您每次都在重新生成 md5() 。因此,您在 OUTFILE 中使用的前缀与 INFILE 的前缀不匹配,因此会出现错误。

可能的解决方案: - 将前缀存储在一个表中,稍后在执行 LOAD DATA INFILE 时可以从中读取 - 如果您定期生成报告,例如每小时生成报告,而不是 md5(),请使用日期时间作为前缀,例如20110618_1000-table.csv.

【讨论】:

    猜你喜欢
    • 2017-07-04
    • 2020-03-23
    • 2017-07-09
    • 2011-06-11
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    相关资源
    最近更新 更多