查找和修复不一致的索引

数据库索引中出现不一致的原因有很多,包括软件缺陷、硬件问题或底层行为变化(例如排列顺序更改)。

PostgreSQL 社区构建了识别和解决此类问题的工具,这包括 amcheck 等工具,PostgreSQL 社区建议使用这些工具来识别一致性问题,包括早期版本的 PostgreSQL 14 所表现出的问题。

此使用指南供遇到这些一致性问题的 AlloyDB for PostgreSQL 用户参考。此使用指南提供的信息可帮助 PostgreSQL 用户识别和修复不一致的索引。

解决索引不一致的问题涉及以下步骤:

  1. 准备工作

    在开始重新编入索引之前,您应该备份数据库、设置正确的权限、验证 psql 客户端版本,并启用 amcheck 扩展程序。

  2. 检查是否存在不一致的索引

    一个语句会识别唯一键和主键违规行为,另一个语句会检测各种其他不一致情况。

  3. 解决索引的不一致问题

    重新编制索引可修复其所有不一致问题。您可能需要调整实例的内存设置以提高性能。

  4. 监控重新编入索引操作

    我们建议您监控重新编入索引操作的进度,以确保操作正在进行且不会被阻止。

  5. 验证索引一致

    成功重新编制索引后,建议您验证索引不包含任何不一致。

准备工作

备份 AlloyDB 集群的数据

为了确保在重新编入索引期间不丢失任何数据,我们建议您备份集群的数据。如需了解详情,请参阅创建按需备份

设置 alloydbsuperuser 权限

为完成本页面中的步骤,您必须拥有 alloydbsuperuser 权限。如需了解详情,请参阅 AlloyDB 的预定义 PostgreSQL 角色

确保 psql 客户端版本为 9.6 或更高版本

如需完成本页面中的步骤,您必须确保 psql 客户端版本为 9.6 或更高版本。运行 psql --version 命令以验证当前的 psql 客户端版本。

启用 amcheck 扩展程序

如需检查索引不一致,您必须启用 amcheck 扩展程序。

代码示例

  CREATE EXTENSION amcheck;
  

检查是否存在不一致的索引

以下部分介绍了如何通过检查索引不一致情况以及唯一键和主键违规行为来检查是否存在不一致的索引。

检查是否存在不一致的现象

在每个数据库中,运行以下语句以检查不一致情况:

代码示例

DO $$
DECLARE
  r RECORD;
  version varchar(100);
BEGIN
  RAISE NOTICE 'Started relhasindex validation on database: %', current_database();
  FOR r IN
    SELECT indexrelid::regclass relname
      FROM pg_index
    WHERE indrelid NOT IN (SELECT oid FROM pg_class WHERE relhasindex) LOOP
      RAISE LOG 'Failed to check index %: %', r.relname, 'relhasindex is false, want true';
      RAISE WARNING 'Failed to check index %: %', r.relname, 'relhasindex is false, want true';
  END LOOP;
  RAISE NOTICE 'Finished relhasindex validation on database: %', current_database();

  RAISE NOTICE 'Started b-tree amcheck on database: %', current_database();
  SHOW server_version into version;
  SELECT split_part(version, '.', 1) into version;
  FOR r IN
    SELECT c.oid, c.oid::regclass relname, i.indisunique
      FROM pg_index i
      JOIN pg_opclass op ON i.indclass[0] = op.oid
      JOIN pg_am