将表从Amazon RDS导出到csv文件

时间:2012-03-02 15:49:21

标签: mysql amazon-web-services amazon-rds

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

6 个答案:

答案 0 :(得分:93)

据推测,您尝试通过SELECT ... INTO OUTFILE查询从Amazon RDS数据库导出,这会产生这种确实常见的问题,例如, export database to CSV。相应的AWS team response确认您缺少服务器访问的假设阻止了这样的导出,并通过在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

用户fpalero provides an alternative,如果您知道并预先指定字段,则可能是更简单的方法:

mysql -uroot -ppassword --database=dbtest 
  -e "select concat(field1,',',field2,',',field3) FROM tabletest" > tabletest.csv
祝你好运!

答案 1 :(得分:1)

AWS提供了一种新方法。只需使用其DMS(数据库迁移服务)。

以下是有关如何将表导出到S3存储上的文件的文档: https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.S3.html

您将有可能以两种格式导出:CSV或镶木地板。

答案 2 :(得分:0)

我在EC2上使用Yii Framework连接到RDS mySQL。关键是使用fputcsv()。以下工作完美,包括我的本地主机和生产。

$file = 'path/to/filename.csv';
$export_csv = "SELECT * FROM table";

$qry = Yii::app()->db->createCommand($export_csv)->queryAll();

$fh = fopen($file, "w+");
foreach ($qry as $row) {
    fputcsv($fh, $row, ',' , '"');
}
fclose ($fh);

答案 3 :(得分:0)

首先,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

您还可以使用内置的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

更多信息https://github.com/gabfl/sql2csv

答案 4 :(得分:0)

假定RDS中的MySQL,另一种方法是使用批处理模式,该模式输出TAB分隔的值并转义换行符,制表符和其他特殊字符。我尚未触及无法处理TAB分隔数据的CSV导入工具。例如:

$ mysql -h myhost.rds.amazonaws.com -u user -D my_database -p --batch --quick -e "SELECT * FROM my_table" > output.csv

如上文Halfgaar所述,--quick选项将立即刷新,从而避免了大型表的内存不足错误。要引用字符串(推荐),您需要在查询中做一些额外的工作:

SELECT id, CONCAT('"', REPLACE(text_column, '"', '""'), '"'), float_column
  FROM my_table

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

SELECT CONCAT('"', DATE_FORMAT(datetime_column, '%Y%m%dT%T'), '"') FROM my_table

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

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

答案 5 :(得分:0)

如果使用标记为正确的解决方案,您会注意到它会生成一个包含'concat'字符串文字的标头。显然,这不是您想要的。您很可能需要数据的相应标题。除了替换列名和表名之外,此查询无需任何修改即可工作:

mysql -h xxx.xxx.us-east-2.rds.amazonaws.com 
--database=mydb -u admin -p 
-e "SELECT 'column1','column2' 
UNION ALL SELECT column1,column2 
FROM table_name WHERE condition = value" > dataset.csv

我刚刚在Numbers osx应用中打开了结果,输出看起来很完美。