我在Postgres中有一个数据库。DB很大,总尺寸超过4TB,超过500,000张桌子和许多索引。DB超过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
从那以后,每当我尝试在DB中创建一个新表时,我都会遇到以下错误:
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"
我尝试重新索引DB,但它不起作用。我还能做什么?
pg_resetxlog
破坏了您的数据库,这是很容易发生的事情,这就是为什么您不仅仅因为您没有启动数据库而不称呼它的原因。这是最后的沟渠努力,以使损坏的数据库升级。
你能做什么?
-
最佳解决方案:从
pg_resetxlog
。
从备份中还原 执行数据库的离线备份。
然后以单用户模式启动数据库:
postgres --single -P -D /your/database/directory yourdbname
然后尝试reidindex
pg_depend
:REINDEX TABLE pg_catalog.pg_depend;
退出单个用户会话,重新启动数据库,运行
pg_dumpall
以倾倒数据库(并希望它有效(,使用initdb
创建一个新的数据库群集并导入转储。不要继续使用
pg_resetxlog
的群集。