これはPGroonga 2.X and 3.X用のドキュメントです。古いPGroongaを使っているならPGroonga 1.xのドキュメントを見てください。
pgroonga_wal_set_applied_position
関数3.1.5で追加。
pgroonga_wal_set_applied_position
関数はすでに適用済みのWALの位置を設定します。通常、この関数を使う必要はありません。なぜなら適用済みのWALの位置が不正な値にならないからです。
この関数の構文は次の通りです。
bool pgroonga_wal_set_applied_position()
bool pgroonga_wal_set_applied_position(pgroonga_index_name)
bool pgroonga_wal_set_applied_position(block, offset)
bool pgroonga_wal_set_applied_position(pgroonga_index_name, block, offset)
pgroonga_index_name
はtext
型の値です。適用済みのWALの位置を設定するPGroongaのインデックス名を指定します。省略するとすべてのPGroongaのインデックスが対象になります。
block
とoffset
はbigint
型の値です。これらは位置を指定します。block
が対象のブロック番号で、offset
がそのブロック内での位置です。省略すると最後のブロックとオフセットを設定します。最後のブロックとオフセットを設定するということはすべてのWALを適用済みとすることになります。通常、これらを省略します。なぜなら妥当なブロックとオフセットを指定することは難しいからです。
なお、pgroonga_wal_status
関数を使うと現在のWALの位置を確認できます。
成功時はtrue
を返し、失敗時はfalse
を返します。しかし、false
が返されることはないでしょう。なぜなら失敗時はエラーが発生するからです。
サンプルスキーマとデータは次の通りです。
SET pgroonga.enable_wal = yes;
CREATE TABLE memos (
content text
);
CREATE INDEX pgroonga_memos_index
ON memos
USING pgroonga (content);
INSERT INTO memos VALUES ('PGroonga (PostgreSQL+Groonga) is great!');
PGroongaのインデックスが削除されたがWALは生きている状況を再現します。
SELECT pgroonga_command('table_remove',
ARRAY[
'name', 'Lexicon' ||
'pgroonga_memos_index'::regclass::oid ||
'_0'
])::json->>1;
-- ?column?
-- ----------
-- true
-- (1 row)
SELECT pgroonga_command('table_remove',
ARRAY[
'name', pgroonga_table_name('pgroonga_memos_index')
])::json->>1;
-- ?column?
-- ----------
-- true
-- (1 row)
この状況では、このPGroongaのインデックスを使うSELECT
がエラーを発生させます。
SET enable_seqscan = no;
SELECT * FROM memos WHERE content &@~ 'PGroonga';
--- ERROR: pgroonga: object isn't found: <Sources17853>
この削除されたインデックスは既存のWALを再適用することで再作成できます。これをするためには、適用済みのWALの位置を先頭(block
とoffset
が0
)に設定します。
SELECT pgroonga_wal_set_applied_position('pgroonga_memos_index', 0, 0);
-- pgroonga_wal_set_applied_position
-- -----------------------------------
-- t
-- (1 row)
このPGroongaのインデックスを使うと自動で未適用のWALが適用されます
SELECT * FROM memos WHERE content &@~ 'PGroonga';
-- content
-- -----------------------------------------
-- PGroonga (PostgreSQL+Groonga) is great!
-- (1 row)