ERROR: right sibling's left-link doesn't match: block 19 links to 346956 instead of expected 346955 in index "pg_depend_reference_index"

ERROR: right sibling's left-link doesn't match: block 19 links to 346956 instead of expected 346955 in index "pg_depend_reference_index"

我在 postgres 中有一个数据库。数据库很大,总大小超过 4TB,超过 500,000 tables 和许多索引。 DB 已超过 4 岁。 最近,Pgsql 数据库服务器没有启动,所以我做了以下事情让它重新启动:

/usr/pgsql-9.3/bin/pg_resetxlog -f  /var/lib/pgsql/9.3/data
/usr/pgsql-9.3/bin/pg_ctl -D /var/lib/pgsql/9.3/data stop
/usr/pgsql-9.3/bin/pg_ctl -D /var/lib/pgsql/9.3/data start
/usr/pgsql-9.3/bin/pg_ctl -D /var/lib/pgsql/9.3/data stop
systemctl restart postgresql-9.3

从那时起,每当我尝试在数据库中创建新的 table 时,我都会收到以下错误:

mps_schools=> create table test_test(hello int);
ERROR:  right sibling's left-link doesn't match: block 19 links to 346956 instead of expected 346955 in index "pg_depend_reference_index"

我试过重新索引数据库,但没有用。我还能做什么?

pg_resetxlog破坏了你的数据库,这是很容易发生的事情,这就是为什么你不调用它只是因为你没有启动数据库。恢复损坏的数据库是最后的努力。

你能做什么?

  1. 最佳解决方案:从 运行 pg_resetxlog.

  2. 之前的备份恢复
  3. 执行数据库的脱机备份。

    然后以单用户模式启动数据库:

    postgres --single -P -D /your/database/directory yourdbname
    

    然后尝试重建索引 pg_depend:

    REINDEX TABLE pg_catalog.pg_depend;
    

    退出单用户会话,重新启动数据库,运行 pg_dumpall 转储数据库(并希望它能工作),使用 initdb 创建一个新的数据库集群并导入垃圾场。

    不要继续使用您 运行 pg_resetxlog.

  4. 所在的集群