[pgsql-jp: 39964] Re: pg_dumpでエラーが出てしまう

shin honda makoto @ fes-total.com
2009年 8月 14日 (金) 16:54:57 JST


本田です。

DB停止してデータ領域のバックアップを取ってから色々試してみました。
無事バックアップが取れてDB再構築ができましたので一応記録を残しておきます。

pg_dumpやpg_dumpallで
schema with OID 18841 does not exist
というエラーがでてバックアップができなくなりました。
(-nや-tを付けてもエラーが発生)

schemaと言われてる事からpg_namespaceとそれを参照してるテーブルに当たりを
付けて調べました。

以下のSQLで不整合が発生してるテーブル(のようなもの)が取得できます。
select
oid,relname,relnamespace,relhasrules,relhastriggers,relchecks,relnatts
from pg_class
where not exists (select oid from pg_namespace where relnamespace =
pg_namespace.oid );

テーブルを作成すると複合型も作成される為pg_typeもチェックします。
select
oid,typname,typnamespace,typtype,typcategory,typrelid,typelem,typarray
from pg_type
where not exists (select oid from pg_namespace where typnamespace =
pg_namespace.oid );

出てきたものをdeleteで削除する事でpg_dumpが可能になりました。

上記方法では不整合は残ったまま(pg_attributeにカラム情報が残ったままに
なってる等)なので
バックアップが取れたら速やかにデータ領域の作り直しをお勧めします。

調べてる過程でschemaを作成してrelnamespaceやtypnamespaceをupdateで書き換える
という方法があるようですが、今回はうまくいきませんでした。
うまくいけば、削除ではなくデータの取り出しも可能になるみたいです。
…が今回はデータ不要だし時間がなかったので「できなかった。」で完結しちゃ
いました。

以上、ありがとうございました。(チラシの裏見たくなってますが^^;)


PowerKit H.Tsuchiyama さんは書きました:
>  土山です。
>
>  7.4 の話ですが、同じ様な症状にであったことがあります。
>
>  その際は pg_dump -t でテーブル毎にバックアップを行い、どのテーブルでエ
> ラーが発生しているのか特定し、そのテーブルを drop することで回避できまし
> た。
>
>  ご参考まで。
>
>   
>> お世話になります。本田です。
>>
>>     
>>> 破損でよくあるケースはトランザクションIDの周回ですが、対処はされていますか?
>>> もし、長い間 VACUUM をしていないようであれば、対象のデータベースに
>>> VACUUM を行うと、データを正常な状態に復旧できるかもしれません。
>>>       
>> vacuumとvacuum fullをしてみましたがダメでした。
>>
>> select * from pg_type where typnamespace = 18841;
>> をみると既にDROP済みのテーブル名が残ってるようです。
>> (perlのDBD::Pgのmake testで作られるテーブル)
>> typname | typnamespace
>> ----------------------+--------------
>> dbd_pg_test2 | 18841
>> _dbd_pg_test2 | 18841
>> dbd_pg_testsequence4 | 18841
>>
>> 上記テーブルは不要で、バックアップさえ取れればDB作り直しも可能なのですが
>> deleteしたらいける可能性ってありますでしょうか?
>>
>> 以上、よろしくお願いします。
>>
>> Itagaki Takahiro さんは書きました:
>>     
>>> 板垣です。
>>>
>>> shin honda <makoto @ fes-total.com> wrote:
>>>
>>>   
>>>       
>>>> postgresql 8.0を利用しているのですが
>>>> pg_dumpを実行すると
>>>> pg_dump: schema with OID 18841 does not exist
>>>> と言われてエラーになってしまいます。
>>>>     
>>>>         
>>> そのエラーだと、データそのものが破損している可能性が高いです。
>>> システムカタログに不整合が生じています。
>>>
>>> 破損でよくあるケースはトランザクションIDの周回ですが、対処はされていますか?
>>> もし、長い間 VACUUM をしていないようであれば、対象のデータベースに
>>> VACUUM を行うと、データを正常な状態に復旧できるかもしれません。
>>>
>>> ------------------------------------------------------------
>>> NTT オープンソース ソフトウェア センタ
>>> 板垣貴裕 <itagaki.takahiro @ oss.ntt.co.jp>
>>>
>>>
>>>
>>>
>>>   
>>>       
>>     
>
>                                                                土山 英俊
>                                                       (有)パワーキット
>                                                  tutiyama @ powerkit.co.jp
>
>
>   




pgsql-jp メーリングリストの案内