就地升级
来自 PostgreSQL wiki
跳转到导航跳转到搜索
此页面包含历史信息或已弃用文章。
请注意,pg_upgrade 与 PostgreSQL 一起分发,可以完成大多数这些需求(特别是使用 --link 选项)。 这应该是希望进行就地升级的人员的第一站。
此页面的其余部分通常仅具有历史意义。
此页面介绍了将旧版本 PostgreSQL 数据库转换为新版本的技术挑战,如相关演示文稿中所述 PostgreSQL 升级项目.
描述
目标
一个用户想要看到的一份长期概述...
就地升级意味着无需复制用户数据即可在软件版本之间进行升级(不复制系统目录是理想的,但是即使对于大型数据库,目录大小也往往不会成为障碍)。 升级应该允许在升级后进行在线系统,这意味着我们可以对数据进行完全的读写操作。 格式更改应该使用写时复制,而不是读时复制,以防止升级后出现过多的 I/O 需求(考虑大型表格)。 强制更新物理格式的手动命令将很好(显然,像 cluster/vacuum full 这样的任何东西都可以做到这一点,尽管可能还需要 vacuum upgrade)
子项目
就地升级是一个非常复杂的项目。 幸运的是,它可以拆分为几个子项目。 存储和目录子项目是最重要的,它们是其他项目的基石。
存储
存储升级侧重于将磁盘格式从旧版本升级到新版本。 PostgreSQL 中的所有数据都存储在页面上。 页面大小通常为 8kB。 该大小由 BLCKSZ 常量定义,该常量只能在编译时修改。 目标是在不破坏内部结构依赖性的情况下,将页面从旧格式转换为新格式。 查看存储依赖图
待办事项:依赖图
磁盘格式版本由 PG_PAGE_LAYOUT_VERSION (PLV) (bufpage.h) 指定。 你可以查看详细信息 这里.
以下结构是页面布局的一部分
- PageHeaderData (bufpage.h)
- HeapTupleHeaderData (htup.h)
- IndexTupleHeaderData (itup.h)
- ItemIdData (itemid.h)
每个结构还包含内部结构,通常它们都有标志字段。
问题
- varlena 编码更改(在 PLV 4 - PG8.3 中引入)
- 复合数据类型 - 复合数据类型与 HeapTupleHeaderData 共享数据结构
- 大小扩展 - 转换后的数据可能无法容纳在页面上