之后使用 pg_upgrade 和 --link 选项是否有任何负面的性能或功能缺点?

Are there any negative performance or functionality downsides to using pg_upgrade with --link option afterwards?

我要将一个相当大的 PostgreSQL 集群从 9.3 升级到 11。

升级

集群的大小约为 1.2Tb。该数据库有一个磁盘系统,由一个快速 HW RAID 10 阵列组成,该阵列由 8 个 DC 版 SSD 组成,具有 192GB 内存和 64 个内核。我通过首先使用流复制将数据复制到新服务器来执行升级,然后将该服务器升级到 11。

我使用 pg_upgrade--link 选项测试了升级,这需要不到一分钟的时间。我还定期测试升级(没有 --link)许多作业,需要几个小时 (+4)。

问题

现在显而易见的选择是我使用 --link 选项的原因,但是所有这一切让我想知道 - 与常规较慢的方法相比,使用它是否有任何缺点(性能或功能方面)?我不知道 postgresql 数据结构的内部工作原理,但我感觉升级 后完全重写数据和仅使用 hard links 之间可能存在性能差异 - 那是什么意思?

注意事项

关于 --link 的缺点,我在文档中唯一能找到的是执行升级后无法访问旧数据目录的缺点 https://www.postgresql.org/docs/11/pgupgrade.htm 然而,这只是一个安全问题而不是性能缺陷并且并不真正适用于我首先复制数据的情况。 我唯一能想到的另一件事是回收 space,无论它有什么性能优势。但是据我了解,在 --link-upgraded 数据库升级后,也可以通过 运行 VACUUM FULL DATABASE(或 CLUSTER?)命令来实现?据我所知,space 的回收对 SSD 的性能影响不是很大。

如果有人能对此有所帮助,我将不胜感激。

使用 hard links 绝对没有任何缺点(除了你提到的例外情况,旧集群已经死了,必须被删除)。

硬 link 与普通文件没有任何区别。

UNIX 中的“文件”实际上是一个“inode”,一种包含文件元数据的结构。目录中的条目是该 inode 的(硬)link。

如果您为 inode 创建另一个硬 link,同一个文件将位于两个不同的目录中,但这对文件的行为没有任何影响。

当然,您必须确保您不会同时启动唯一的服务器和新的服务器。随之而来的是即时数据损坏。这就是为什么您应该尽快删除旧集群的原因。