在 postgresql 中发送数据集

Posted

技术标签:

【中文标题】在 postgresql 中发送数据集【英文标题】:Shipping datasets in postgresql 【发布时间】:2020-11-03 11:40:05 【问题描述】:

我正在考虑在 postgresql(或任何)关系数据库中传送数据集的最佳方式。对于我们的大多数用例,我们将 parquet 文件放在带时间戳的文件夹中,并让客户端指向最新的、经过验证的数据集。如果我们无法更改客户端,那么我们将拥有一个“最新”文件夹,我们会将经过验证的数据放入其中。使用数据库表执行此操作的最佳方法是什么?生成数据并将其写入表是一项耗时的操作。我们可以关闭数据库,对其进行写入,然后将其恢复,但这需要一些停机时间。理想情况下,我正在寻找一种在后台写入数据库,验证数据,然后“翻转”以使新数据“活动”的方法。有没有简单的方法可以做到这一点?我想我可以在绿色/蓝色部署中拥有两个数据库,然后更新客户端,但想知道是否有办法在不更改客户端的情况下做到这一点。

【问题讨论】:

【参考方案1】:

根据数据集的大小,我会考虑几种方法。

最简单的一种是带有数据的 SQL 脚本,例如INSERTCOPY。 CSV 文件很好,允许执行COPY 来获取它。 pg_dump 二进制输出文件(或文件夹)是另一种选择,应由pg_restore 恢复 您可以将数据集存储为您喜欢的文件格式,并使用file_fdw 外部数据包装器来访问它。

如您所见,有很多选择。所以我们需要一些细节,我相信。

【讨论】:

所以问题不在于插入数据。更多的是如何在后台执行此操作并切换到新数据集而不更新客户端(并且没有停机时间)。如果我们确实接受停机时间,我可以像往常一样截断表、插入和恢复。 由于 DDL 在 Postgres 中是完全事务性的,因此您可以将数据插入到临时表中,然后使用真实表进行切换。 听起来很有趣。开关将如何工作? 值得注意的是,数据集将涉及多个表,但我希望这不会成为问题。 那行得通。在加载新数据之前,我创建了一个表,插入,将旧表重命名为存档表,然后将新表重命名为旧表。必须处理权限,并且只有表所有者才能重命名表。

以上是关于在 postgresql 中发送数据集的主要内容,如果未能解决你的问题,请参考以下文章

Python 提取数据库(Postgresql)并邮件发送

Spring 数据存储库将 null 作为 bytea 发送到 PostgreSQL 数据库

如何在 SSIS 或 SQL 中使用不同的数据集向不同的收件人发送电子邮件?

Blazor Web 程序集在每个请求中发送数据

如何在 Flutter+Spring Boot+PostgreSQL+Heroku 结构中发送和存储图像?

如何通过 FTP 发送我最近的数据集?