PostgreSQLでテーブルロックせずにインデックスを再構築する方法

PostgreSQLにはreindexコマンドがあるけれど、これはテーブルロックがかかってしまうので運用中のDBに対して使うのは難しい。ただ、PostgreSQLでは別名で全く同じインデックスの作成を行うことができるのでこれを利用して運用中のDBも止めずにインデックスの再構築をすることができる。別名インデックス作成時のロックはCONCURRENTRYオプションをつけることでロックをかけないようにして実施するのが肝。

CREATE INDEX CONCURRENTRY new_idx
ON test(category);
BEGIN;
DROP INDEX test_category_idx;
ALTER INDEX new_idx RENAME TO test_category_idx;
COMMIT;

この方法*1PostgreSQL9 Administration Cookbookに載っていただんだけど、この本すごくいい。どういう問題に対して、どうやるのか、どうやって動くのか、他にもこんなのもあるよといった感じで丁寧にわかりやすく解説されてる。今回はメンテナンス周りについて勉強したくて会社で買ってもらったんだけど、他にも今直面してる問題に対する対策とかたくさん載っててとても役立ちそう。洋書ではあるけどPostgreSQLな人は1冊持っておくといいんじゃないかな。

Postgresql 9 Administration Cookbook

Postgresql 9 Administration Cookbook

  • [20120820]タイトルのtypoを修正、本文と表現を合わせた。

*1:DDLに対してトランザクション効くんだね