(如何)是否可以将表转换为 Postgres 中的外部表?

(How) Is it possible to convert tables into foreign tables in Postgres?

我们的 Postgres 生产数据库中有一个很大的 table,我们希望使用外部 table 和继承来启动它 "sharding"。

所需的体系结构将有 1 个(空)table 定义模式和几个从空 "parent" table 继承的外部 table。 (可能与 Postgres 9.5 一起使用)

我发现这篇写得很好的文章 https://www.depesz.com/2015/04/02/waiting-for-9-5-allow-foreign-tables-to-participate-in-inheritance/ 解释了如何从头开始做的一切。 我的问题是如何将所需的数据迁移减少到最低限度。

我们现在有这个 100+ GB table,这应该成为我们的第一个 "shard"。将来我们会定期添加新的 "shards"。在某些时候,较旧的碎片将被移动到另一个 table 空间(在更便宜的硬件上,因为它们变得不那么重要)。

我现在的问题: 有没有办法 "ALTER" 现有 table 成为外国 table?

无法使用 alter table 来执行此操作。

你真的必须基本上手动完成。这与进行 table 分区没有什么不同(真的)。您创建分区,加载数据。您直接对分区进行读写操作。

现在就您的情况而言,就进行分片而言,我会考虑使用多种工具来减轻这种痛苦。首先,如果你确保你的 table 是按照你喜欢的方式拆分的,你可以使用像 Bucardo 这样的逻辑复制解决方案在你移动所有内容时复制写入。

还有一些其他方法(并行读取器和写入器)可能会以数据库负载为代价为您节省一些时间,但这些都是小众工具。

标准 PostgreSQL 的分片管理没有本地解决方案(而且我在这方面对 Postgres-XL 的了解还不够,不知道它能多好地管理不断变化的分片标准)。然而,只需一点点工作和知识,几乎任何事情都是可能的。