我在PostgreSQL数据库中有大约10TB的数据。我需要将此数据导出到AWS S3存储桶。
我知道如何导出到本地文件,例如:
CONNECT DATABASE_NAME;
COPY (SELECT (ID, NAME, ADDRESS) FROM CUSTOMERS) TO ‘CUSTOMERS_DATA.CSV WITH DELIMITER '|' CSV;
但是我没有10TB大小的本地驱动器。
如何直接导出到AWS S3存储桶?
答案 0 :(得分:2)
您可以将程序的输出通过管道传输到s3,例如:
cat "hello world" | aws s3 cp - s3://some-bucket/hello.txt
我对postgresql
并没有丰富的经验,但据我了解,以下方法应该有效:
psql -U user -d DATABASE_NAME -c "Copy (Select ID, NAME, ADDRESS From CUSTOMERS) To STDOUT With CSV HEADER DELIMITER ',';" | aws s3 cp - s3://some-bucket/CUSTOMERS_DATA.csv.gz
答案 1 :(得分:1)
导出大型数据转储时,您最大的担忧应该是减少故障。即使您可以使GB网络连接饱和,移动10 TB数据也将花费> 24小时。您不希望由于故障(例如数据库连接超时)而重新启动它。
这意味着您应该将导出分为多个部分。您可以通过在副本内部的select语句中添加ID范围来做到这一点(我刚刚编辑了示例,因此可能会出现错误):
COPY (SELECT (ID, NAME, ADDRESS) FROM CUSTOMERS WHERE ID BETWEEN 0 and 1000000) TO ‘CUSTOMERS_DATA_0.CSV WITH DELIMITER '|' CSV;
您当然可以使用简短的程序生成这些语句;不要忘记为每个文件更改输出文件的名称。我建议选择一个ID范围,每个输出文件可以为您提供1 GB左右的字节,这样可以生成10,000个中间文件。
这些文件的写入位置由您决定。如果S3FS足够可靠,我认为这是个好主意。
通过将卸载分成多个较小的部分,您还可以将其划分为多个EC2实例。您可能只需要几个读取器就可以饱和数据库计算机的带宽。另外请注意,AWS对跨可用区的数据传输收取每GB 0.01 USD的费用-10TB即$ 100-因此请确保这些EC2计算机与数据库计算机位于同一可用区。
这还意味着您可以在数据库不忙的情况下(即,在正常工作时间之外)执行卸载。
最后,这意味着您可以测试您的过程,并且可以修复任何数据错误,而不必运行整个导出过程(或每次修复处理10TB数据)。
在导入方面,Redshift can load multiple files in parallel。尽管我不能说多少,但这应该可以改善您的整体时间。
一个警告:使用清单文件,而不是对象名称前缀。我遇到过S3最终一致性导致文件在加载期间被丢弃的情况。