高見 直輝
takam****@orega*****
2015年 10月 1日 (木) 09:31:29 JST
高見です。
> > 【環境】
> > Windows Server 2008R2
> > postgresql-9.3.8-1
>
> > pgroongaを利用したインデックスのあるテーブルに対してレコードの追加を行って
> > いたところ、ある時を境に以下のデータベースエラーが発生するようになりました。
> > ERROR: 58030: pgroonga: failed to open database: <base/16384/pgrn>: [db][open] invalid keys table's type: 0
>
> 「ある時」にPostgreSQLを終了しないままWinodwsを再起動したり
> しませんでしたか?そういう場合、メモリー上にあるPGroongaのデー
> タがディスクに書き込まれないまま消えてしまうことがあります。
> そうすると↑のようなエラーになります。
確かに、このエラーが発生する前にOSをシャットダウンしているので、これが
原因の可能性が高いです。
> 対策なんですが、明示的にディスクに書き込む指示を出してくださ
> い。指示は次のSQLを実行すると出せます。
>
> SELECT pgroonga.command('io_flush');
>
> これは、Groongaのio_flushというコマンドを実行するのですが、
> このGroongaのコマンドを実行するとディスクに書き込みます。
> http://groonga.org/ja/docs/reference/commands/io_flush.html
了解しました。
ただ、これはエラーの発生を予防する手段だと思うのですが、上記エラーが発生
している環境を、既存データを保持したまま修復する手段は有りませんでしょう
か?
また、コマンド実行時にディスク障害などによってエラーが発生した場合、障害
が解消した後に何らかの処理を実行する必要がありますでしょうか?
例)Create Index文が完了し、io_flushでエラー発生
⇒エラー原因解消後、インデックス再構築が必要
> インデックスの作成後に呼び出すようにすると、このエラーは発生
> しないようになります。
インデックス作成以外で対応が必要なものはありますでしょうか?
以下に必要と思われるものを列挙するので、過不足あればご指摘下さい。
インデックス(テーブル)削除
インデックス再構築
VACUUM
PGROONGAの各種設定内容変更
> > 次に、原因が判明済みのものを。
> > 上記のエラーの調査のため、PGROONGAのログ設定を変更しました。
> > ⇒ALTER DATABASEでpgroonga.log_levelを変更した。
> > その後Postgreサービスを再起動したところ、上記のエラーではなく、コネクション
> > エラーが発生するようになりました。
> > FATAL: 57P03: the database system is in recovery mode
> > これに関しては、pgrnファイルを排他ロックで開いた状態でログレベルの変更を行っ
> > たところ、再現できました。
> > また、pgrnファイルを閉じた状態で再度変更を行ったところ正常に動作するように
> > なったことから、pgrnファイルの内容が不正な状態になったのが原因であると考え
> > られます。
>
> これは、「invalid keys table's type: 0」のエラーがでるときだ
> け発生するものでしょうか?それともそうではないときでも発生す
> るものでしょうか?
そうでない場合でも発生します。
後述の再現手順では、以下のエラーが発生していました。
ERROR: 58030: pgroonga: failed to open database: <base/16384/pgrn>: syscall error 'base/16384/pgrn' (Permission denied)
> もし、そうではないときでも発生するものの場合、
>
> > これに関しては、pgrnファイルを排他ロックで開いた状態でログレベルの変更を行っ
> > たところ、再現できました。
>
> の具体的なSQLを教えてもらえないでしょうか?
> 試してみたいです。
1.pgroongaのインデックスを持つテーブルを作成しておく
2.PostgreSQLのサービスを再起動する(1のテーブルにアクセスしないようにする)
3.pgrnファイルを排他ロックした状態で開き、この状態を維持する
4.1のテーブルにレコード追加を実行する
⇒上記Permission deniedのエラーとなる
5.以下のSQLを実行する(設定内容は任意)
ALTER DATABASE "【データベース名】" SET pgroonga.log_type='postgresql';
ALTER DATABASE "【データベース名】" SET pgroonga.log_level ='warning';
6.PostgreSQLのサービスを再起動する
7.3で開いているのを閉じる
以後、1のテーブルを対象としたSQLを実行すると、必ず57P03のエラーが発生し
ます。
復旧方法については、設定済みの項目に対して
ALTER DATABASE 〜 RESET 〜
を実行し、PostgreSQLのサービスを再起動したら直りました。
※その後、再設定しても問題無し
-----------------------------
高見 直輝 <takam****@orega*****>
株式会社オレガ
TEL:03-3267-0150
FAX:03-3267-0180