在 MySQL 中找不到 outfile 创建的文件

Posted

技术标签:

【中文标题】在 MySQL 中找不到 outfile 创建的文件【英文标题】:Can't find the file created by outfile in MySQL 【发布时间】:2012-07-14 03:06:50 【问题描述】:

我正在使用以下查询来创建 CSV 文件

SELECT email INTO OUTFILE "mydata.csv"
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY "\n"
FROM users;

但是当我通过 filezilla 搜索时,我无法在任何地方找到 mydata.csv 文件。

知道这个文件存储在哪里吗?

查询运行成功,没有任何错误!有什么帮助吗?

【问题讨论】:

它很可能在 mysql 数据目录中(如 /var/lib/mysql)。要指定目录,请使用完整路径,例如 INTO OUTFILE '/tmp/mydata.csv' @Michael 我在我的根目录中看不到 /var/lib/mysql 之类的东西。我的意思是没有这样的文件夹称为var。有办法吗? 发生的有趣的事情是当我使用路径作为 /tmp/mydata.csv 时,查询被执行,但是,在我的根目录中没有名为 tmp 的文件夹! :s @user1460822: 你是windows系统吗?地球上几乎每个 unix 系统都有 /tmp。在 Windows 上,您可能需要使用 c:\temp 并创建该目录 我相信默认行为是将其写入所选数据库的目录,即在 MySQL 数据目录中(例如 /var/lib/mysql/mydatabase)。 【参考方案1】:

如果您没有指定绝对路径而是使用INTO OUTFILE 'output.csv'INTO OUTFILE './output.csv' 之类的东西,它会将输出文件存储到show variables like 'datadir'; 指定的目录中。

【讨论】:

【参考方案2】:

+1 到@michael-berkowski 我需要 windows 的答案是(正如他所说)

MariaDB 的数据目录

具体来说,我在名为“mydatabase”的数据库的数据文件夹中

C:\Program Files\MariaDB 10.3\data\mydatabase

【讨论】:

【参考方案3】:

如果 OS X 上的任何人遇到此问题,使用 homebrew 安装的 mysql 的默认输出位于 /usr/local/var/mysql/database-name/

【讨论】:

【参考方案4】:

MySQL 可能正在将文件写入它自己的数据目录,例如/var/lib/mysql/<databasename>。要指定路径,请使用完整路径。

但是,它必须是一个可由运行 MySQL 服务器守护程序的用户帐户写入的目录。因此,我会经常使用/tmp

指定要写入的路径,如:

INTO OUTFILE '/tmp/mydata.csv'

请注意,MySQL 会将文件写入 MySQL 服务器,而不是您的客户端计算机。因此远程连接将在远程服务器上创建输出文件。有关更多详细信息和解决方法,另请参阅 SELECT INTO OUTFILE local ?。

系统和 Linux

关于在运行 systemd 的 Linux 系统上写信给 /tmp 的说明

在最初发布此内容几年后,我发现自己无法找到通过 /tmp 写入的文件

...INTO OUTFILE '/tmp/outfile.csv'

在使用 systemd 运行 Fedora Linux 的 MariaDB 5.5 服务器上。不是按照指定将文件直接写入/tmp/outfile.csv,而是在/tmp 的systemd 目录下创建该目录和文件:

/tmp/systemd-mariadb.service-XXXXXXX/tmp/outfile.csv

虽然文件outfile.csv 本身和tmp/ 子目录都被创建为全局可写的,但systemd 服务目录本身具有700 权限并且是root 拥有的,需要sudo 访问权限才能检索其中的文件。

不是将 MariaDB 中的绝对路径指定为 /tmp/outfile.csv 并将其相对指定为 outfile.csv,而是按预期将文件写入 MariaDB 的当前所选数据库的数据目录中。

【讨论】:

发生的有趣的事情是当我使用路径作为 /tmp/mydata.csv 时,查询被执行,但是,在我的根目录中没有名为 tmp 的文件夹! :s @user1460822 如果这是共享主机,您可能只是将该文件写入系统的公共 /tmp 目录(您无法访问该目录)。它最终会被自动化脚本清除。您需要将文件写入您可以访问的位置,无论根目录中的哪个位置。如果您的根目录类似于/home/users/your_username/public_html,请使用它。 @MichaelBerkowski,我试图将文件放入/home/username/myfolder/。但我收到了Persmission denied 错误消息。我做了chmod 777 /home/username/myfolder,它仍然存在。是不是因为chmod只影响目录(不影响文件)? 请注意,如果您的 mysql 服务器是远程的,它会将文件放在其文件系统中,而不是您的脚本所在的位置,您应该使用 scp 来获取它。 @OkiErieRinaldi 如果您尝试将其写入主目录,则需要确保 MySQL 守护程序用户可以遍历到其中,这意味着在 /home/usernamechmod o+x /home/username 上添加执行权限. Homedirs 通常除了拥有用户之外的所有人都无法访问,所以如果你想这样做,我建议添加执行权限,然后写入文件,然后立即撤销它chmod o-x /home/username。只要父目录已执行,目标目录上的 777 就应该工作。【参考方案5】:

我找到了使用以下命令创建的 INTO OUTFILE 文件

select name from users into outfile "name.csv"

在以下位置

C:\ProgramData\MySQL\MySQL Server 5.6\data\name.csv

这可能是默认位置,因为我从未更改过任何内容。

【讨论】:

【参考方案6】:

举例:

我在 MySQL Workbench 中运行了以下查询,并且在

中找到了我的文件
SELECT * FROM `db`.`table` INTO OUTFILE 'file.csv' FIELDS TERMINATED BY ',';

D:\wamp\bin\mysql\mysql5.6.17\data\db\file.csv

你可以使用下面的例子来设置你的文件路径:

SELECT * FROM `db`.`table` INTO OUTFILE 'C:\\file.csv' FIELDS TERMINATED BY ',';

【讨论】:

【参考方案7】:

您在C:\wamp\bin\mysql\mysql5.5.24\data 中找到该文件,但如果您关注select * from carro where id_cor<4 INTO OUTFILE 'C:\Users\Name\carro.txt';,则名称将是UsersNamecarro.txt

所以只需写.....OUTFILE 'C:\carro.txt' 即可在data 文件夹中获取名为carro.txt 的文件

【讨论】:

【参考方案8】:

我怀疑您正在客户端计算机上查找该文件。

SELECT .. INTO OUTFILE 将文件写入服务器机器上。

【讨论】:

是的......这是我在调查这个问题时遇到的确切问题。即使您在 MySQL 工作台上运行该命令,该文件也会在服务器上写出。一旦我弄清楚了,只需将文件 scp 到我的本地机器就很简单了。 非常有价值的细节!

以上是关于在 MySQL 中找不到 outfile 创建的文件的主要内容,如果未能解决你的问题,请参考以下文章

在 OS X 10.7 中找不到 Mysql 命令

出现错误 - 在用户表中找不到任何匹配的行

在 discordjs 中找不到 mysql 语法错误

在 Docker 中找不到 MySQL 的 mysql_config [重复]

那我用SQL创建表之后,为啥在所创建的数据库中找不到呢?

在 Qt Creator 中找不到 .pro 文件