在 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/username
和 chmod 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 创建的文件的主要内容,如果未能解决你的问题,请参考以下文章