【发布时间】:2021-11-26 21:07:23
【问题描述】:
我正在尝试将 Postgresql 版本 9.2 的数据库备份恢复到 Postgresql 13.5,但在恢复时我收到以下消息:
索引行大小 2712 超过了 btree 版本 4 索引的最大值 2704
数据库恢复显示成功,但恢复完成后数据不可用。
【问题讨论】:
标签: postgresql
我正在尝试将 Postgresql 版本 9.2 的数据库备份恢复到 Postgresql 13.5,但在恢复时我收到以下消息:
索引行大小 2712 超过了 btree 版本 4 索引的最大值 2704
数据库恢复显示成功,但恢复完成后数据不可用。
【问题讨论】:
标签: postgresql
我的猜测是,与新实例相比,旧实例上的 SELECT current_setting('block_size'); 一定更大,这会在 pg_restore 插入行时导致 non-key column included in an index 到 exceed the limit。您可以使用--schema-only pg_restore 选项恢复only the schema,检查您的索引,暂时删除它们,然后使用--data-only 安全地恢复just the data。索引实际上并不在备份中,它们是在恢复过程中从头开始重建的 - 因此您可以稍后自己进行。
Here 是一个更改 PostgreSQL 块大小的线程。
【讨论】:
除非您的旧数据库使用非标准块大小(这是不常见且不推荐的),否则您一定会成为这个change in PostgreSQL v12 的受害者:
在新的 btree 索引中,最大索引条目长度减少了 8 个字节,以改进对重复条目的处理 (Peter Geoghegan)
这意味着对先前版本的索引 pg_upgrade 的 REINDEX 操作可能会失败。
您必须将表中的数据修改为更短一些。
另一种但不值得称赞的解决方案是使用pg_upgrade 而不是转储和恢复。这将使索引保持原样。但是,您永远无法REINDEX 或转储并恢复该数据库。
【讨论】: