これはPGroonga 2.X and 3.X用のドキュメントです。古いPGroongaを使っているならPGroonga 1.xのドキュメントを見てください。

pgroonga_database_remove関数

2.1.8で追加。

概要

pgroonga_database_remove関数はPostgreSQLのデータベースディレクトリー内のPGroonga関連のすべてのファイル(pgrn*ファイル)を削除します。

この関数を使うにはpgroonga_databaseモジュールをインストールする必要があります。

この関数は危険な関数です。この関数が必要になるまでこの関数を有効にしないでください。

通常、PGroonga関連のファイルを削除する必要はありません。もしPGroongaのインデックスが破損した場合は、REINDEXで復旧できます。しかし、PGroonga内部のデータベースが壊れたときはREINDEXでは復旧できません。

PGroongaの内部データベースが壊れたときに復旧する手順は次の通りです。

  1. PostgreSQLへの接続をすべて切断する

  2. PostgreSQLのデータディレクトリーにあるすべてのpgrn*ファイルを削除する

    もし、テーブルスペースを使っているならテーブルスペースのディレクトリー内にあるpgrn*ファイルも削除します。

    PostgreSQLが動いているホストにログインする必要があります。

  3. PostgreSQLに接続する

  4. すべてのPGroongaのインデックスに対してREINDEXを実行する

    これでPGroongaの内部データベースが作られ、PostgreSQL内のデータを使ってすべてのPGroongaのインデックスが再作成されます。

pgroonga_database_remove関数はすべてのpgrn*ファイルを削除します。この関数はテーブルスペースにも対応しています。

pgroonga_database_remove関数を使うとPostgreSQLが動いているホストにログインする必要はありません。pgroonga_database_remove関数を使った復旧手順は次の通りです。

  1. PostgreSQLへの接続をすべて切断する

  2. PostgreSQLに接続する

  3. SELECT pgroonga_database_remove()を実行する

  4. すべてのPGroongaのインデックスに対してREINDEXを実行する

    これでPGroongaの内部データベースが作られ、PostgreSQL内のデータを使ってすべてのPGroongaのインデックスが再作成されます。

構文

この関数の構文は次の通りです。

bool pgroonga_database_remove()

この関数は常にtrueを返します。なぜなら、もし問題があった場合はfalseを返すのではなくエラーにするからです。

使い方

壊れたPGroongaの内部データベースを復旧する手順は次の通りです。

最初にすべての接続を切断します。PGroongaの内部データベースを使っている接続が残っているとそれらの接続はクラッシュするかもしれません。

次にPostgreSQLに再度接続し、pgroonga_database_remove()関数を実行します。

SELECT pgroonga_database_remove();

次にこの接続を切断します。

この接続ではpgroonga_databaseモジュールが提供する機能以外はPGroongaのどの機能も使ってはいけません。もしPGroongaの機能を使うとこの接続でPGroongaの内部データベースを開こうとします。そうするとクラッシュするかもしれません。

次にPostgreSQLに再接続してすべてのPGroongaのインデックスを再作成します。

REINDEX INDEX pgroonga_index1;
REINDEX INDEX pgroonga_index2;
-- ...

これで復旧完了です。PostgreSQLが動いているホストにログインする必要はありません。

参考