暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Postgresql-14,在select 和 update时,ERROR: posting list tuple with 7 items cannot be split at offset 137的错误处理

原创 life 2024-06-16
175

参考:

https://www.postgresql.org/message-id/CAPrE0SYkv7%3DqoyHKivAKzCW9_vFCe8jEph8ixTDA8Dh6ae%2BmFA%40mail.gmail.com

https://wiki.postgresql.org/wiki/Locale_data_changes#RHEL.2FCentOS
复制

某天早上,开发人员反馈在select或者update时,会出现以下错误:
ERROR: posting list tuple with 7 items cannot be split at offset 137。
网上查询,有人说是索引重建可以解决,分析一下索引后,重建索引故障可以排除。

经过研究,发现可能是由于OS升级导致这个问题,具体可参考上面的引用文章,于是查到了一个全库检查索引的插件,pg_amcheck。
首先,确保 PostgreSQL 版本: pg_amcheck 在 PostgreSQL 12 及更高版本中可用。首先检查你的 PostgreSQL 版本,如果还没有安装,需要先安装postgresql-contrilib包。

后续部署过程如下:

ostgres=# CREATE EXTENSION amcheck; --切换需要每个检查的database上,创建插件
CREATE EXTENSION

[postgres@DB01 ~]$ pg_amcheck -d db_name --发现有数百个索引有问题,报错如下:
btree index "xxx.xxx_index":
    ERROR:  item order invariant violated for index "unique_index_mac"
    DETAIL:  Lower index tid=(244173,153) (points to heap tid=(818198,14)) higher index tid=(244173,154) (points to heap tid=(817446,23)) page lsn=3BA/23A11AA0.

复制

看来需要一个方法,把所有问题索引找出来,写入脚本进行统一重建:

-- 截取上面日誌內容,生成reindex.sql

grep 'db_name' reindex_commands.sql | sed -n 's/.*"\(.*\)".*/\1/p' > reindex_db_name.sql

--然後給第行加上reindex index concurrently :
sed -i 's/^/reindex index concurrently /' reindex_tj_ims.sql

--每行加上分号:
[root@TJCloudMES-DBCN01 run]# sed -i 's/$/;/' reindex_tj_ims.sql

执行上面的sql,以重建索引
# psql -U postgres -d db_name -f reindex_db_name.sql
复制

执行上面的sql后,问题消失。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论