【发布时间】:2017-11-21 00:29:53
【问题描述】:
我需要将数据从 S3 加载到 Postgres RDS(大约 50-100 GB)我没有使用 AWS Data Pipeline 的选项,我正在寻找类似于使用 COPY 命令加载数据的东西S3 到 Amazon Redshift。
如果有任何关于如何完成此任务的建议,我将不胜感激。
【问题讨论】:
标签: postgresql amazon-s3 amazon-rds
我需要将数据从 S3 加载到 Postgres RDS(大约 50-100 GB)我没有使用 AWS Data Pipeline 的选项,我正在寻找类似于使用 COPY 命令加载数据的东西S3 到 Amazon Redshift。
如果有任何关于如何完成此任务的建议,我将不胜感激。
【问题讨论】:
标签: postgresql amazon-s3 amazon-rds
最初,这个答案试图使用 S3 到 Postgres RDS 功能。整个企业都失败了(见下文)。
我终于能够做到这一点的方法是:
最后一部分非常非常重要。如果您使用 SQL COPY 命令,整个 RDS Postgres 角色结构将使您感到沮丧。它有一个不稳定的 SUPERRDSADMIN 角色,一点也不超级。但是,如果您使用 psql /copy commany,您显然可以做任何事情。我已经确认是这种情况并已成功开始我的上传。我会回来重新编辑这篇文章(时间允许),为上述内容添加相关文档步骤。
Caveat Emptor: 下面的帖子是我为实现此功能所做的所有原始工作。尽管付出了很多努力(包括只能被描述为来自 AWS 的可悲技术支持),但我不想掩盖领先地位。我不相信这个功能已经准备好迎接黄金时间。尽管测试环境非常简单,易于复制,但 AWS 并没有提供一种有效的方法来避免复制语句如下所示:
对
aws_s3.table_import_from_s3(...)的实际调用报告了RDS 和S3 之间的权限问题。根据我对psql的研究工作,这似乎是一个 C 库,可能由 AWS 安装。注意:CURL 错误代码:尝试验证预签名 URL 时出现 28 次,剩余 1 次尝试 注意:提示:确保您的实例能够与 S3 连接。
AWS 于 2019 年 4 月 24 日发布了允许 Postgres RDS 直接从 S3 加载的功能。您可以阅读公告here,并查看文档页面here。
我与 OP 分享,因为这似乎是 AWS 支持的解决问题的方式。
psql 并能够将其连接到 RDS 实例aws_s3 扩展,它会引入aws_commons。COPY 命令相同的数据格式这些说明相当详细,并提供了多种配置路径(AWS CLI 脚本、控制台说明等)。此外,使用您的 IAM 密钥而不是必须设置角色的选项也不错。
我没有找到只下载 psql 的方法,所以我不得不将完整的 postgres 安装到我的 mac,但这对 brew 没什么大不了的:
brew install postgres
而且由于数据库服务没有被激活,它是获取 psql 的最快方法。
更新:决定在我的 mac 上安装 psql 是一个安全漏洞、端口转发等。我发现AMI Extras rubric 下有一个简单的 Postgres 安装可用于 AMI Linux 2。对于您的 ami 实例类型,安装命令相当简单。
sudo amazon-linux-extras install postgresql10
psql 相当容易使用,然而,重要的是要记住,任何对psql 本身的指令都会被\ 转义。 psql 上的文档可以在 here 找到。建议在执行 AWS 推荐的脚本之前至少检查一次。
如果您运行严格的安全性并且可以访问您的 RDS 实例受到严格限制(我这样做),请不要忘记打开从运行 Postgres 的 AMI 实例到您的 RDS 实例的端口。
如果您的偏好是 GUI,那么您可以尝试使用 PGAdmin4。根据文档,这是 AWS 推荐的连接 RDS Postgres 实例的方式。我无法让任何 SSH 隧道功能工作(这就是为什么我最终做了我用于 psql 的 localhost SSH 映射)。我还发现它在其他方面相当有问题。阅读产品评论,似乎第 4 版可能不是最稳定的版本。
【讨论】:
psql=> CREATE EXTENSION aws_s3 CASCADE; 命令安装aws_s3 时遇到问题吗?我得到:ERROR: could not open extension control file "/usr/share/postgresql/11/extension/aws_s3.control": No such file or directory。在正确安装这些方面,我似乎找不到太多帮助。
http://docs.aws.amazon.com/redshift/latest/dg/t_loading-tables-from-s3.html
使用 COPY 命令从数据文件中并行加载表 亚马逊 S3。您可以使用 Amazon 指定要加载的文件 S3 对象前缀或使用清单文件。
使用前缀指定要加载的文件的语法如下 如下:
copy <table_name> from 's3://<bucket_name>/<object_prefix>' authorization;
更新
另一个选项是挂载 s3 并使用 COPY 命令使用 csv 的直接路径。我不确定它是否能有效地容纳 100GB,但值得一试。 Here is some list 的软件选项。
另一种选择是将 s3 文件逐部分“解析”with something described here 到一个文件,COPY 来自命名管道 described here
最明显的选择是将文件下载到本地存储并使用COPY 我根本不介绍
还值得一提的是s3_fdw(状态不稳定)。 Readme 非常简洁,但我假设您可以创建一个指向 s3 文件的外部表。这本身意味着您可以将数据加载到其他关系...
【讨论】: