在 postgresql 中发送数据集
Posted
技术标签:
【中文标题】在 postgresql 中发送数据集【英文标题】:Shipping datasets in postgresql 【发布时间】:2020-11-03 11:40:05 【问题描述】:我正在考虑在 postgresql(或任何)关系数据库中传送数据集的最佳方式。对于我们的大多数用例,我们将 parquet 文件放在带时间戳的文件夹中,并让客户端指向最新的、经过验证的数据集。如果我们无法更改客户端,那么我们将拥有一个“最新”文件夹,我们会将经过验证的数据放入其中。使用数据库表执行此操作的最佳方法是什么?生成数据并将其写入表是一项耗时的操作。我们可以关闭数据库,对其进行写入,然后将其恢复,但这需要一些停机时间。理想情况下,我正在寻找一种在后台写入数据库,验证数据,然后“翻转”以使新数据“活动”的方法。有没有简单的方法可以做到这一点?我想我可以在绿色/蓝色部署中拥有两个数据库,然后更新客户端,但想知道是否有办法在不更改客户端的情况下做到这一点。
【问题讨论】:
【参考方案1】:根据数据集的大小,我会考虑几种方法。
最简单的一种是带有数据的 SQL 脚本,例如INSERT
或 COPY
。
CSV 文件很好,允许执行COPY
来获取它。
pg_dump 二进制输出文件(或文件夹)是另一种选择,应由pg_restore 恢复
您可以将数据集存储为您喜欢的文件格式,并使用file_fdw
外部数据包装器来访问它。
如您所见,有很多选择。所以我们需要一些细节,我相信。
【讨论】:
所以问题不在于插入数据。更多的是如何在后台执行此操作并切换到新数据集而不更新客户端(并且没有停机时间)。如果我们确实接受停机时间,我可以像往常一样截断表、插入和恢复。 由于 DDL 在 Postgres 中是完全事务性的,因此您可以将数据插入到临时表中,然后使用真实表进行切换。 听起来很有趣。开关将如何工作? 值得注意的是,数据集将涉及多个表,但我希望这不会成为问题。 那行得通。在加载新数据之前,我创建了一个表,插入,将旧表重命名为存档表,然后将新表重命名为旧表。必须处理权限,并且只有表所有者才能重命名表。以上是关于在 postgresql 中发送数据集的主要内容,如果未能解决你的问题,请参考以下文章
Spring 数据存储库将 null 作为 bytea 发送到 PostgreSQL 数据库
如何在 SSIS 或 SQL 中使用不同的数据集向不同的收件人发送电子邮件?