我正在尝试将 Postgresql 版本 9.2 的数据库备份恢复到 Postgresql 13.5,但在恢复时我收到以下消息:
索引行大小 2712 超过了 btree 版本 4 索引的最大值 2704
数据库恢复显示成功,但恢复完成后数据不可用。
除非您的旧数据库使用非标准块大小(这是不寻常且不推荐的),否则您一定是 PostgreSQL v12 更改的受害者:
在新的 btree 索引中,最大索引条目长度减少了 8 个字节,以改进对重复条目的处理 (Peter Geoghegan)
这意味着对先前版本的索引 pg_upgrade 进行 REINDEX 操作可能会失败。
您必须将表中的数据修改得更短一些。
pg_upgrade
而不是转储和恢复。这将使索引保持原样。但这样你就永远无法 REINDEX
或转储并恢复该数据库。
我的猜测是,与新实例相比,旧实例上的
SELECT current_setting('block_size');
一定更大,这会导致当 pg_restore 插入行时,索引中包含的非键列超出限制。您可以使用 --schema-only
pg_restore 选项恢复仅模式,检查索引,暂时删除它们,然后使用
--data-only
安全地恢复仅数据。索引并不真正在备份中,它们是在恢复过程中从头开始重建的 - 因此您可以稍后自己进行。
=> SELECT current_setting('block_size');
current_setting
-----------------
8192
有什么建议吗?