【问题标题】:Index row size 2712 exceeds btree version 4 maximum 2704 for index, while doing DB restore索引行大小 2712 超过 btree 版本 4 最大 2704 用于索引,同时进行 DB 恢复
【发布时间】:2021-11-26 21:07:23
【问题描述】:

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

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

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

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    我的猜测是,与新实例相比,旧实例上的 SELECT current_setting('block_size'); 一定更大,这会在 pg_restore 插入行时导致 non-key column included in an indexexceed the limit。您可以使用--schema-only pg_restore 选项恢复only the schema,检查您的索引,暂时删除它们,然后使用--data-only 安全地恢复just the data。索引实际上并不在备份中,它们是在恢复过程中从头开始重建的 - 因此您可以稍后自己进行。

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

    【讨论】:

      【解决方案2】:

      除非您的旧数据库使用非标准块大小(这是不常见且不推荐的),否则您一定会成为这个change in PostgreSQL v12 的受害者:

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

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

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

      另一种但不值得称赞的解决方案是使用pg_upgrade 而不是转储和恢复。这将使索引保持原样。但是,您永远无法REINDEX 或转储并恢复该数据库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-29
        • 2013-10-09
        • 1970-01-01
        • 2021-12-10
        • 2018-01-14
        相关资源
        最近更新 更多