将表从Amazon RDS导出到csv文件

Ken*_*nny 59 mysql amazon-web-services amazon-rds

我有一个在Amazon RDS中运行的mysql数据库,我想知道如何将整个表导出为csv格式.我目前在Windows上使用mysql服务器来查询Amazon数据库,但是当我尝试运行导出时出现错误,可能是因为amazon RDS没有专用的文件服务器.这有什么解决方案吗?

Ste*_*pel 101

据推测,您正试图通过查询从Amazon RDS数据库导出SELECT ... INTO OUTFILE,这会产生这个确实常见的问题,例如将数据库导出为CSV.相应的AWS团队响应确认您缺少服务器访问的假设阻止了这样的导出,并通过在mysql命令行客户端中选择数据并管理输出以重新格式化数据来导出CSV格式的数据,从而建议另一种方法像CSV一样,如下:

mysql -u username -p --database=dbname --host=rdshostname --port=rdsport --batch 
  -e "select * from yourtable" 
  | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > yourlocalfilename
Run Code Online (Sandbox Code Playgroud)

如果您事先知道并指定字段,则用户fpalero会提供另一种可能更简单的方法:

mysql -uroot -ppassword --database=dbtest 
  -e "select concat(field1,',',field2,',',field3) FROM tabletest" > tabletest.csv
Run Code Online (Sandbox Code Playgroud)

祝好运!

  • 这里的问题是,如果您要转储大量数据,则会出现内存不足错误。 (2认同)
  • 实际上,我刚刚注意到 `mysql` 也有一个 `--quick` 选项,使它立即刷新到磁盘。 (2认同)
  • `gsed 's/"/""/g;s/^/"/;s​​/$/"/;s​​/\t/","/g'`,关于csv规范,哪个更正式? (2认同)
  • 您可能希望将“--skip-column-names”添加到您的参数中。谢谢! (2认同)

Gab*_*Gab 6

首先,Steffen 的回答在大多数情况下都有效。

我最近遇到了一些更大、更复杂的输出,其中“sed”是不够的,并决定想出一个简单的实用程序来做到这一点。

我构建了一个名为 sql2csv 的模块,它可以解析 MySQL CLI 的输出:

$ mysql my_db -e "SELECT * FROM some_mysql_table" 

+----+----------+-------------+---------------------+
| id | some_int | some_str    | some_date           |
+----+----------+-------------+---------------------+
|  1 |       12 | hello world | 2018-12-01 12:23:12 |
|  2 |       15 | hello       | 2018-12-05 12:18:12 |
|  3 |       18 | world       | 2018-12-08 12:17:12 |
+----+----------+-------------+---------------------+

$ mysql my_db -e "SELECT * FROM some_mysql_table" | sql2csv
 
id,some_int,some_str,some_date
1,12,hello world,2018-12-01 12:23:12
2,15,hello,2018-12-05 12:18:12
3,18,world,2018-12-08 12:17:12
Run Code Online (Sandbox Code Playgroud)

您还可以使用内置的 CLI:

sql2csv -u root -p "secret" -d my_db --query "SELECT * FROM some_mysql_table;"

1,12,hello world,2018-12-01 12:23:12
2,15,hello,2018-12-05 12:18:12
3,18,world,2018-12-08 12:17:12
Run Code Online (Sandbox Code Playgroud)

有关sql2csv (GitHub) 的更多信息。


小智 5

假设 RDS 中使用 MySQL,另一种方法是使用批处理模式,该模式输出制表符分隔的值并转义换行符、制表符和其他特殊字符。我还没有遇到过不能处理制表符分隔数据的 CSV 导入工具。例如:

\n
$ mysql -h myhost.rds.amazonaws.com -u user -D my_database -p --batch --quick -e "SELECT * FROM my_table" > output.csv\n
Run Code Online (Sandbox Code Playgroud)\n

正如Halfgaar 所指出的--quick选项会立即刷新,因此可以避免大型表出现内存不足错误。要引用字符串(推荐),您需要在查询中做一些额外的工作:

\n
SELECT id, CONCAT(\'"\', REPLACE(text_column, \'"\', \'""\'), \'"\'), float_column\n  FROM my_table\n
Run Code Online (Sandbox Code Playgroud)\n

转义REPLACE中的任何双引号字符text_column。我还建议对日期时间字段使用 iso8601 字符串,因此:

\n
SELECT CONCAT(\'"\', DATE_FORMAT(datetime_column, \'%Y%m%dT%T\'), \'"\') FROM my_table\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,如果您有 NULL 列值,CONCAT 将返回 NULL。

\n

我已经在一些相当大的表上运行了它,并且具有合理的性能。在同一VPC中运行 MySQL 命令时,600M 行和 23\xc2\xa0GB 数据大约需要 30 分钟在与 RDS 实例

\n