2

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

/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

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

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"

我已经尝试重新索引数据库,但它不起作用。我还能做什么?

4

1 回答 1

4

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

你能做什么?

  1. 最佳解决方案:从运行之前的备份中恢复pg_resetxlog

  2. 执行数据库的脱机备份。

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

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

    然后尝试重新索引pg_depend

    REINDEX TABLE pg_catalog.pg_depend;
    

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

    不要继续使用您运行的集群pg_resetxlog

于 2018-02-18T20:02:32.060 回答