45

MySQL 太棒了!我目前正在参与一个主要的服务器迁移,以前,我们的小型数据库曾经与客户端托管在同一台服务器上。
所以我们曾经这样做:SELECT * INTO OUTFILE .... LOAD DATA INFILE ....

现在,我们将数据库移至另一台服务器,SELECT * INTO OUTFILE ....但不再有效,这是可以理解的——我相信是出于安全原因。但是,有趣LOAD DATA INFILE ....的是可以更改为LOAD DATA LOCAL INFILE ....和 bam,它可以工作。

我没有抱怨,也没有表达对 MySQL 的厌恶。替代方案添加了 2 行额外代码和一个系统调用,形成一个 .sql 脚本。我只想知道为什么LOAD DATA LOCAL INFILE有效,为什么没有这样的东西SELECT INTO OUTFILE LOCAL

我做了功课,找不到上述问题的直接答案。我也找不到@ MySQL 的功能请求。如果有人能澄清这一点,那就太棒了!

MariaDB 有能力处理这个问题吗?

4

7 回答 7

60

从手册:The SELECT ... INTO OUTFILE语句主要是为了让您非常快速地将表转储到服务器机器上的文本文件中。如果要在服务器主机以外的某个客户端主机上创建结果文件,则不能使用SELECT ... INTO OUTFILE. 在这种情况下,您应该改用命令,例如mysql -e "SELECT ..." > file_name在客户端主机上生成文件。”

http://dev.mysql.com/doc/refman/5.0/en/select.html

一个例子:

mysql -h my.db.com -u usrname--password=pass db_name -e 'SELECT foo FROM bar' > /tmp/myfile.txt
于 2010-06-03T23:34:44.997 回答
7

您可以使用传入的 -s (--silent) 选项使用 mysql 控制台实现所需的功能。

传入 -r (--raw) 选项可能是个好主意,这样特殊字符就不会被转义。您可以使用它来管理您想要的查询。

mysql -u 用户名 -h 主机名 -p -s -r -e "select concat('this',' ','works')"

编辑:另外,如果你想从输出中删除列名,只需添加另一个 -s (mysql -ss -r 等)

于 2013-03-21T13:57:46.357 回答
5

您提供的路径LOAD DATA INFILE是运行服务器的机器上的文件系统,而不是您连接的机器。LOAD DATA LOCAL INFILE是针对客户端机器的,但它要求服务器以正确的设置启动,否则是不允许的。您可以在这里阅读所有相关信息:http: //dev.mysql.com/doc/refman/5.0/en/load-data-local.html

至于SELECT INTO OUTFILE我不确定为什么没有本地版本,除了通过连接可能很棘手。您可以通过该mysqldump工具获得相同的功能,但不能通过将 SQL 发送到服务器。

于 2010-05-19T17:19:53.060 回答
3

正如 Waverly360 所建议的那样,使用带有 -e 选项的 mysql CLI 是一个不错的选择,但这可能会耗尽内存并在大结果时被杀死。(还没有找到背后的原因)。如果是这种情况,并且您需要所有记录,我的解决方案是:mysqldump + mysqldump2csv:

wget https://raw.githubusercontent.com/jamesmishra/mysqldump-to-csv/master/mysqldump_to_csv.py
mysqldump -u username -p --host=hostname database table | python mysqldump_to_csv.py > table.csv
于 2015-01-27T10:59:30.460 回答
3

由于我发现自己经常寻找这个确切的问题(希望我之前错过了一些东西......),我最终决定花时间写一个小要点来将 MySQL 查询导出为 CSV 文件,有点像https:/ /stackoverflow.com/a/28168869但基于 PHP 和更多选项。这对我的用例很重要,因为我需要能够微调 CSV 参数(分隔符、NULL 值处理)并且文件需要是实际有效的 CSV,所以简单CONCAT是不够的,因为它不如果值包含换行符或 CSV 分隔符,则生成有效的 CSV 文件。

注意:需要在服务器上安装 PHP! (可以通过检查php -v

“安装”mysql2csv通过

wget https://gist.githubusercontent.com/paslandau/37bf787eab1b84fc7ae679d1823cf401/raw/29a48bb0a43f6750858e1ddec054d3552f3cbc45/mysql2csv -O mysql2csv -q && (sha256sum mysql2csv | cmp <(echo "b109535b29733bd596ecc8608e008732e617e97906f119c66dd7cf6ab2865a65  mysql2csv") || (echo "ERROR comparing hash, Found:" ;sha256sum mysql2csv) ) && chmod +x mysql2csv

(下载要点的内容,检查校验和并使其可执行)

使用示例

./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"

生成/tmp/result.csv包含内容的文件

foo,bar
1,2

帮助参考

./mysql2csv --help
Helper command to export data for an arbitrary mysql query into a CSV file.
Especially helpful if the use of "SELECT ... INTO OUTFILE" is not an option, e.g.
because the mysql server is running on a remote host.

Usage example:
./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"

cat /tmp/result.csv

Options:
        -q,--query=name [required]
                The query string to extract data from mysql.
        -h,--host=name
                (Default: 127.0.0.1) The hostname of the mysql server.
        -D,--database=name
                The default database.
        -P,--port=name
                (Default: 3306) The port of the mysql server.
        -u,--user=name
                The username to connect to the mysql server.
        -p,--password=name
                The password to connect to the mysql server.
        -F,--file=name
                (Default: php://stdout) The filename to export the query result to ('php://stdout' prints to console).
        -L,--delimiter=name
                (Default: ,) The CSV delimiter.
        -C,--enclosure=name
                (Default: ") The CSV enclosure (that is used to enclose values that contain special characters).
        -E,--escape=name
                (Default: \) The CSV escape character.
        -N,--null=name
                (Default: \N) The value that is used to replace NULL values in the CSV file.
        -H,--header=name
                (Default: 1) If '0', the resulting CSV file does not contain headers.
        --help
                Prints the help for this command.
于 2018-05-16T10:01:05.797 回答
1

回复:SELECT * INTO OUTFILE

检查 MySQL 是否有权将文件写入服务器上的 OUTFILE 目录。

于 2010-05-19T17:15:57.910 回答
1

尝试将路径设置为/var/lib/mysql-files/filename.csv(MySQL 8)。SHOW VARIABLES LIKE "secure_file_priv";通过在 mysql 客户端命令行中键入来确定您的文件目录。

请参阅此处的答案:(...) --secure-file-priv in MySQL于 2015 年由vhu 用户回答

于 2020-07-24T09:25:41.610 回答