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)
祝好运!
首先,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\nRun Code Online (Sandbox Code Playgroud)\n正如Halfgaar 所指出的,--quick选项会立即刷新,因此可以避免大型表出现内存不足错误。要引用字符串(推荐),您需要在查询中做一些额外的工作:
SELECT id, CONCAT(\'"\', REPLACE(text_column, \'"\', \'""\'), \'"\'), float_column\n FROM my_table\nRun Code Online (Sandbox Code Playgroud)\n转义REPLACE中的任何双引号字符text_column。我还建议对日期时间字段使用 iso8601 字符串,因此:
SELECT CONCAT(\'"\', DATE_FORMAT(datetime_column, \'%Y%m%dT%T\'), \'"\') FROM my_table\nRun Code Online (Sandbox Code Playgroud)\n请注意,如果您有 NULL 列值,CONCAT 将返回 NULL。
\n我已经在一些相当大的表上运行了它,并且具有合理的性能。在同一VPC中运行 MySQL 命令时,600M 行和 23\xc2\xa0GB 数据大约需要 30 分钟在与 RDS 实例
\n| 归档时间: |
|
| 查看次数: |
42260 次 |
| 最近记录: |