我在Amazon RDS中运行了一个mysql数据库,我想知道如何将整个表导出为csv格式。我目前在Windows上使用mysql服务器来查询Amazon数据库,但是当我尝试运行导出时出现错误,可能是因为amazon RDS没有专用的文件服务器。这有什么解决方案吗?
答案 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
答案 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应用中打开了结果,输出看起来很完美。