AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 344634
Accepted
Tombart
Tombart
Asked: 2025-01-10 00:25:29 +0800 CST2025-01-10 00:25:29 +0800 CST 2025-01-10 00:25:29 +0800 CST

如何修复 PostgreSQL 中损坏的索引“项目顺序不变违反”?

  • 772

amcheck报告以下错误:

select bt_index_parent_check(34465);
ERROR:  item order invariant violated for index "admin_access_rights_pkey"
DETAIL:  Lower index tid=(282,71) (points to heap tid=(201,46)) higher index tid=(282,72) (points to heap tid=(197,38)) page lsn=396C/DDF2FD00

我该如何修复这个问题?

文档表明这REINDEX可能没有帮助。

REINDEX 可能无法有效修复损坏。

postgresql
  • 1 1 个回答
  • 36 Views

1 个回答

  • Voted
  1. Best Answer
    Tombart
    2025-01-10T01:27:45+08:002025-01-10T01:27:45+08:00

    此类错误可能由以下原因造成:

    • 重复PRIMARY KEY
    • 更改文本顺序,例如由 glibc 升级导致
    • 内存损坏
    • 假设的 PostgreSQL 错误
    • 文件系统损坏(如果您的数据库不使用数据校验和)
    • PostgreSQL 进程崩溃(被 oom-killer 杀死或使用kill -9)

    检查重复PRIMARY KEY:

    SELECT PRIMARY_KEY,count(*) FROM my_table GROUP BY PRIMARY_KEY HAVING count(*)>1;
    

    如果发现重复的键,请删除:

    DELETE FROM  my_table a
      USING  (
              SELECT   min(ctid) AS ctid,
                      PRIMARY_KEY
              FROM     my_table
              GROUP BY PRIMARY_KEY
                      HAVING count(*) > 1 ) b
      WHERE a.PRIMARY_KEY = b.PRIMARY_KEY
      AND   a.ctid <> b.ctid;
    

    在许多情况下,使用以下命令重建索引似乎就足够了REINDEX:

    REINDEX INDEX admin_access_rights_pkey;
    

    对于损坏的索引,我更喜欢速度较慢但更安全的版本REINDEX CONCURRENTLY。在使用时,我发现了一些问题(希望现在已修复)REINDEX CONCURRENTLY。

    另一个选项是使用pg_repack允许在后台重新打包表和重建索引。如果成功,索引将被移动以替换原始索引。这种方法可能会避免不必要的锁定。尽管重建大型表可能需要大量时间。

    psql -d dbname -c "CREATE EXTENSION pg_repack"
    pg_repack  -d dbname -i 'schema_name.index_name'
    

    pg_repack可能正在针对整个数据库运行:

    pg_repack -d dbname --dry-run
    
    • -N/--dry-run仅打印重新打包的资源
    • -j/--jobs=4并行作业数
    • -x/--only-indexes仅重建索引
    • -c/--schema=public仅限特定架构
    • 3

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve