2016-10-19 3 views
1

明らかに有効ではないタプルを生成しているOIDを持っています。Postgres: `キャッシュルックアップが制約34055で失敗しました。 '

これは、いくつかの\set VERBOSITY verbose後psqlでテーブルを削除しようとしたとき、私は取得エラーです:

delete from my_table where my_column = 'some_value'; 
ERROR: XX000: cache lookup failed for constraint 34055 
LOCATION: ri_LoadConstraintInfo, ri_triggers.c:2832 

これは私がelsewhere見つけたものです。

2827    :  /* 
2828    :  * Fetch the pg_constraint row so we can fill in the entry. 
2829    :  */ 
2830   548 :  tup = SearchSysCache1(CONSTROID, ObjectIdGetDatum(constraintOid)); 
2831   548 :  if (!HeapTupleIsValid(tup)) /* should not happen */ 
2832   0 :   elog(ERROR, "cache lookup failed for constraint %u", constraintOid); 
2833   548 :  conForm = (Form_pg_constraint) GETSTRUCT(tup); 
2834    : 
2835   548 :  if (conForm->contype != CONSTRAINT_FOREIGN) /* should not happen */ 
2836   0 :   elog(ERROR, "constraint %u is not a foreign key constraint", 

これは、OIDが他の場所で参照されていることを意味します。これらの他の場所はどこにありますか、誰かがこのようなものをどのようにきれいにするかを知っていますか?

私は本当にライン上/* should not happen */コメント2831

答えて

4

ように私は、これはあなたがカタログの破損を持っていることを意味していることと思います。

外部キー制約は内部的にトリガとして実装されています。そのトリガが起動すると、トリガはそのトリガに属する制約を見つけようとします。これはあなたのケースでは失敗したように見えますが、そのエラーが発生します。

あなた自身のため見ることができます:

SELECT tgtype, tgisinternal, tgconstraint 
    FROM pg_trigger 
    WHERE tgrelid = 'my_table'::regclass; 

┌────────┬──────────────┬──────────────┐ 
│ tgtype │ tgisinternal │ tgconstraint │ 
├────────┼──────────────┼──────────────┤ 
│  5 │ t   │  34055 │ 
│  17 │ t   │  34055 │ 
└────────┴──────────────┴──────────────┘ 
(2 rows) 

は今その制約を検索してみてください:

SELECT conname 
    FROM pg_constraint 
    WHERE oid = 34055; 

┌─────────┐ 
│ conname │ 
├─────────┤ 
└─────────┘ 
(0 rows) 

は、このような破損から回復するには、あなたは、最新の良好なバックアップを復元する必要があります。

pg_dumpallを使用して、実行中のPostgreSQLクラスタをダンプし、新しいクラスタを作成してそこでダンプを復元することで、データをサルベージすることができます。運が良ければ、クラスターの優れたコピーが作成され、それを使用することができます。データの不一致によりダンプまたはリストアが失敗した場合は、より高度な方法を使用する必要があります。

は、いつものように、データが破損した場合には、それは最初

pg_ctl stop -m immediate 

でクラスタを停止し、データディレクトリの物理的なバックアップを作成するのが最善の方法です。あなたの救助活動がさらにデータに損害を与えた場合、あなたはコピーを持っています。

関連する問題