在进行数据库恢复时,索引行大小 2712 超过了 btree 版本 4 索引的最大值 2704

问题描述 投票:0回答:3

我正在尝试将 Postgresql 版本 9.2 的数据库备份恢复到 Postgresql 13.5,但在恢复时我收到以下消息:

索引行大小 2712 超过了 btree 版本 4 索引的最大值 2704

数据库恢复显示成功,但恢复完成后数据不可用。

postgresql
3个回答
6
投票

除非您的旧数据库使用非标准块大小(这是不寻常且不推荐的),否则您一定是 PostgreSQL v12 更改的受害者

在新的 btree 索引中,最大索引条目长度减少了 8 个字节,以改进对重复条目的处理 (Peter Geoghegan)

这意味着对先前版本的索引 pg_upgrade 进行 REINDEX 操作可能会失败。

您必须将表中的数据修改得更短一些。

另一种但不值得称赞的解决方案是使用

pg_upgrade
而不是转储和恢复。这将使索引保持原样。但这样你就永远无法
REINDEX
或转储并恢复该数据库。


2
投票

我的猜测是,与新实例相比,旧实例上的

SELECT current_setting('block_size');
一定更大,这会导致当 pg_restore 插入行时,索引中包含的非键列超出限制。您可以使用 --schema-only pg_restore 选项恢复仅模式
,检查索引,暂时删除它们,然后使用
--data-only安全地恢复仅数据
。索引并不真正在备份中,它们是在恢复过程中从头开始重建的 - 因此您可以稍后自己进行。

Here是一个关于更改 PostgreSQL 块大小的线程。


0
投票
我有同样的问题,但我想使用副本从 csv 文件恢复数据。 旧的(第 12 页)数据库和新数据库(第 16 页)具有相同的块大小。

=> SELECT current_setting('block_size'); current_setting ----------------- 8192
有什么建议吗?

© www.soinside.com 2019 - 2024. All rights reserved.