从 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的使用

MySQL存储过程中使用SELECT …INTO语句为变量赋值

INSERT INTO SELECT 语句

[22]SQL INSERT INTO SELECT 语句

小5聊Sql Server基础之insert into select从一个表添加到另一个表