これはPGroonga 2.X and 3.X用のドキュメントです。古いPGroongaを使っているならPGroonga 1.xのドキュメントを見てください。
pgroonga_set_writable
関数pgroonga_set_writable
関数はPGroongaのデータを変更できるかどうか設定します。通常、この設定をする必要はありません。
この関数を使うことでオンラインバックアップを実現できます。この使い方をする場合は以下の条件を満たす必要があります。
データを変更したあとは同一セッション内で必ずSELECT pgroonga_command('io_flush', ARRAY['only_opened', 'yes'])
を実行します。
PGroongaのインデックスを使っているテーブルはオートバキュームを無効にします。該当テーブルだけオートバキュームを無効にするためにCREATE TABLE
のautovacuum_enabled
ストレージパラメーターを使えます。オートバキュームを無効にした場合は手動でVACUUM
を実行しなければいけないことに注意してください。
PGroongaのWALを有効にします。
この関数の構文は次の通りです。
bool pgroonga_set_writable(new_writable)
new_writable
はbool
型の値です。true
は変更可能で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_writable
関数にfalse
を渡した後はPGroongaのインデックスを変更できません。
SELECT pgroonga_set_writable(false);
-- pgroonga_set_writable
-- -----------------------
-- t
-- (1 row)
INSERT INTO memos VALUES ('Groonga is great!');
-- ERROR: pgroonga: can't insert a record while pgroonga.writable is false
SELECT pgroonga_set_writable(true);
-- pgroonga_set_writable
-- -----------------------
-- f
-- (1 row)
INSERT INTO memos VALUES ('Groonga is great!');
-- INSERT 0 1
この関数を使うことでオンラインバックアップを実現できます。この使い方をする場合は以下の条件を満たす必要があります。
データを変更したあとは同一セッション内で必ずSELECT pgroonga_command('io_flush', ARRAY['only_opened', 'yes'])
を実行します。
PGroongaのインデックスを使っているテーブルはオートバキュームを無効にします。該当テーブルだけオートバキュームを無効にするためにCREATE TABLE
のautovacuum_enabled
ストレージパラメーターを使えます。オートバキュームを向こうにした場合は手動でVACUUM
を実行しなければいけないことに注意してください。
PGroongaのWALを有効にします。
次の設定をpostgresql.conf
に追加します。
pgroonga.enable_wal = yes
オートバキュームを無効にします。
CREATE TABLE memos (
content text
) WITH (autovacuum_enabled = false);
CREATE INDEX pgroonga_memos_index
ON memos
USING pgroonga (content);
データを変更した後は同一セッション内でSELECT pgroonga_command('io_flush', ARRAY['only_opened', 'yes'])
を呼びます。
INSERT INTO memos VALUES ('PGroonga (PostgreSQL+Groonga) is great!');
SELECT pgroonga_command('io_flush', ARRAY['only_opened', 'yes']);
バックアップ作成前に手動でVACUUM
を実行することを推奨します。
VACUUM ANALYZE memos;
SELECT pgroonga_command('io_flush', ARRAY['only_opened', 'yes']);
バックアップ作成前にPGroongaのデータを変更できないようにします。
SELECT pgroonga_set_writable(false);
SELECT pgroonga_command('io_flush', ARRAY['only_opened', 'yes']);
これでPostgreSQLを止めずにバックアップを作成できます。
db_name="YOUR_DB_NAME"
# Detect database information
db_oid=$(psql \
--dbname ${db_name} \
--no-psqlrc \
--no-align \
--tuples-only \
-c "SELECT datid FROM pg_stat_database WHERE datname = '${db_name}'")
data_dir=$(psql \
--dbname ${db_name} \
--no-psqlrc \
--no-align \
--tuples-only \
-c "SHOW data_directory")
# Define directories
db_dir=${data_dir}/base/${db_oid}
backup_dir=${data_dir}/../../backup
# Create backup directory
mkdir -p ${backup_dir}
# Create backup
rsync -a --include '/pgrn*' --exclude '*' --delete ${db_dir}/ ${backup_dir}/
PGroongaのWALを削除することを推奨します。pgroonga_wal_truncate
関数は変更不可のときでも実行できます。
SELECT pgroonga_wal_truncate();
SELECT pgroonga_command('io_flush', ARRAY['only_opened', 'yes']);
If you truncate PGroonga's WAL, you must create backup again with the above shell script. The process will be fast because rsync
copies only different data.
PGroongaのデータを変更可能に戻します。
SELECT pgroonga_set_writable(true);
SELECT pgroonga_command('io_flush', ARRAY['only_opened', 'yes']);