有一个数据库,其中损坏的唯一索引数量未知。目前,当我尝试时,我会逐一发现它们REINDEX DATABASE CONCURRENTLY <db_name>
,处理特定的重复违规(操作数据,主要使用脚本删除重复项),重新索引特定的表或索引,然后继续下一个索引(同样,只有在我发现它之后才使用REINDEX DATABASE CONCURRENTLY
)。
更不用说每次我得到带有“_ccnew”后缀的索引时,据我所知,这些索引都是之前重新索引尝试同时创建的但无法完成的,通常是因为它们违反了唯一性检查。同时重新索引的失败尝试将保留在那里,应手动删除。
使用并发重新索引是为了防止关闭。
我想减少搜索下一个违规的“往返”,并想知道是否有更有效的方法来获取有关 Postgres DB 的所有索引损坏或唯一违规的状态的一般数据。
您可以使用amcheck扩展来检查 B-tree 索引是否损坏。对于其他索引类型,除了重建索引外别无选择。
您可以运行以下命令检查索引是否存在损坏:
可以自动针对数据库中的所有索引运行:
bt_index_check()
有一个可选的第二个参数;如果您提供TRUE
,检查将花费更长时间,但可以验证所有表行都已被索引。请注意,
bt_index_check()
并不涵盖所有类型的索引损坏。还有bt_index_parent_check()
,测试更彻底,但需要一个SHARE
防止并发数据修改的锁。