我在 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/