从 RDS SELECT * INTO OUTFILE 到 S3
Posted
技术标签:
【中文标题】从 RDS SELECT * INTO OUTFILE 到 S3【英文标题】:SELECT * INTO OUTFILE to S3 from RDS 【发布时间】:2018-07-02 21:51:15 【问题描述】:我正在尝试将一些数据从 RDS
实例重定向到 .csv
。
我尝试重定向到我们用作客户端的EC2 box
并收到权限错误。我有点明白这一点。
首先,有解决方法吗?
或者我可以
SELECT * INTO OUTFILE S3:.... from table bob....
这是一个每周运行的过程,其中包含日期和数据库名称等动态参数。我目前使用 mysql 存储过程执行动态 SQL。
提前致谢。
【问题讨论】:
Exporting table from Amazon RDS into a csv file的可能重复 基本上你做不到。 rds 不支持 INTO OUTFILE。 感谢您的 cmets。你应该如何提取部分数据集? 您可以随时从客户端选择数据并将其写入s3。 【参考方案1】:如果您使用的是 RDS 的 AWS Aurora 风格,那么您很幸运:https://aws.amazon.com/about-aws/whats-new/2017/06/amazon-aurora-can-export-data-into-amazon-s3/
如果您使用带有 RDS 的普通 MySql,我有一个解决方法可以将一些数据重定向到 .csv
。我将 aws data pipeline 产品与 CopyActivity
一起使用 - 它可以将数据从您指定的 SQL 查询复制到您指定的 S3 存储桶。
这是我的管道定义yml
的摘录,它显示了输入、输出和CopyActivity
:
"myDescription": "Mysql datanode that represents the input database and query that gets the marketing table data.",
"type": "MySqlDataNode",
"name": "SourceRDSTable",
"id": "SourceRDSTable",
"connectionString": "jdbc:mysql://marketing.example.com:3306/schemaname",
"table": "marketing",
"selectQuery": "SELECT * FROM schemaname.marketing WHERE active=1 AND isOptedOut=0",
"username": "mysqluser",
"*password": "redacted"
,
"myDescription": "S3 datanode that represents the S3 directory where the table data will be stored.",
"type": "S3DataNode",
"name": "S3OutputLocation",
"id": "S3OutputLocation",
"filePath": "s3://mys3bucket/output/marketing_dump_#format(@scheduledStartTime, 'YYYY-MM-dd').csv"
,
"myDescription": "CopyActivity used to dump a subset of the marketing table to S3 as csv",
"type": "CopyActivity",
"name": "Copy marketing table to S3",
"id": "RDStoS3CopyActivity",
"input":
"ref": "SourceRDSTable"
,
"output":
"ref": "S3OutputLocation"
,
"runsOn":
"ref": "ec2_worker_instance"
(虽然我对完成后的结果感到满意,但我不得不承认我花了一周的时间来设置这条管道!它已经每天运行 4 个月,没有任何问题,但如果我要再做一次,我会改为升级到 Aurora 并使用他们的 INTO OUTFILE S3
语法)
【讨论】:
您好,Tom,非常感谢您抽出宝贵时间分享您的解决方案。我正在寻找使用不同日期从数百个数据库的少数表中存档数据。我现有的方法调用形成动态 sql 的存储过程。工作流程是提取数据以存档,然后删除数据。不知何故,我需要在删除数据之前将其取出。由于查询的动态特性,我认为这会使数据管道方法变得非常混乱。为什么他们不能只添加对 INTO OUTFILE 的支持? 我认为他们想通过在 Aurora 上实现有用的功能而不是在 Mysql 上实现很多功能来销售 Aurora。在您的情况下,是否有可能执行 aws api 调用以从原始数据库创建 Aurora 只读副本数据库,然后使用 Aurora 执行 SELECT INTO OUTFILE,然后关闭只读副本?【参考方案2】:Select into S3,从 S3 加载比使用 select into Outfile 和 Load data infile 慢得多。 (接近两倍慢,尤其是在大型数据集上)。
【讨论】:
以上是关于从 RDS SELECT * INTO OUTFILE 到 S3的主要内容,如果未能解决你的问题,请参考以下文章
SELECT INTO 和 INSERT INTO SELECT
select into from 和 insert into select的使用