postgresql - 将大数据从 PostgreSQL 导出到 AWS s3

标签 postgresql amazon-web-services amazon-s3

我在 PostgreSQL 数据库中有大约 10TB 的数据。我需要将此数据导出到 AWS S3 存储桶中。

我知道如何导出到本地文件,例如:

CONNECT DATABASE_NAME;
COPY (SELECT (ID, NAME, ADDRESS) FROM CUSTOMERS) TO ‘CUSTOMERS_DATA.CSV WITH DELIMITER '|' CSV;

但我没有 10TB 大小的本地驱动器。

如何直接导出到AWS S3 bucket?

最佳答案

导出大型数据转储时,您最关心的应该是减少故障。即使您可以使 GB 网络连接饱和,移动 10 TB 数据也需要超过 24 小时。您不希望由于故障(例如数据库连接超时)而不得不重新启动它。

这意味着您应该将导出分成多个部分。您可以通过向副本内的 select 语句添加一个 ID 范围来做到这一点(我刚刚编辑了您的示例,因此可能存在错误):

COPY (SELECT (ID, NAME, ADDRESS) FROM CUSTOMERS WHERE ID BETWEEN BETWEEN 0 and 1000000) TO ‘CUSTOMERS_DATA_0.CSV WITH DELIMITER '|'文件格式;

当然,您可以用一个简短的程序生成这些语句;不要忘记为每个更改输出文件的名称。我建议选择一个 ID 范围,使每个输出文件有 GB 左右,从而产生 10,000 个中间文件。

将这些文件写入何处由您决定。如果 S3FS 足够可靠,我认为这是个好主意。

通过将卸载分成多个较小的部分,您还可以将其划分到多个 EC2 实例中。您可能只用少数几个读取器就会使数据库机器的带宽饱和。另请注意,AWS 对跨可用区数据传输收取每 GB 0.01 美元的费用——10TB 为 100 美元——因此请确保这些 EC2 机器与数据库机器位于同一可用区中。

这也意味着您可以在数据库不忙时(即在正常工作时间之外)执行卸载。

最后,这意味着您可以测试您的流程,并且可以修复任何数据错误,而无需运行整个导出(或为每次修复处理 10TB 的数据)。

在进口方面,Redshift can load multiple files in parallel .这应该会改善您的总体时间,但我真的不能说有多少。

一个警告:使用 list 文件 而不是对象名称前缀。我遇到过 S3 的最终一致性导致文件在加载过程中被丢弃的情况。

关于postgresql - 将大数据从 PostgreSQL 导出到 AWS s3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53032312/

相关文章:

ruby-on-rails - 使用 Cloudfront 从 S3 提供图像

python - AWS Lambda 函数无法连接到 S3 并查询 SQLite 数据库文件

ruby-on-rails - 在单个 Rails 应用程序中使用多个数据库系统和 ORM 是个好主意吗?

amazon-web-services - 如何强制删除 MWAA 环境?

linux - 在本地 Windows 计算机中运行 postgres 命令时出现问题。在Linux、Mac下运行成功,但在windows下失败

amazon-web-services - route53 列表托管区域输出抛出 "does not support indexing"错误

amazon-web-services - 我可以同时运行1000个AWS微型实例吗?

flash - 是否可以使用 S3 进行 Flash 伪流式传输?

postgresql - 与 postgresql 的奇怪排序

postgresql - Postgresql 中十六进制值的适当数据类型?