
実運用中のテーブルに対し、日次で reindex を実行したところ、時々、デッドロックが発生してしまいます。
どうやら、reindex と update の間でデッドロックが起きているようです。
エラーメッセージを見た感じでは、以下の状態でデッドロックになっているように読めます。
・update がテーブルのインデックスに対するロックを取得し、テーブルに対する RowExclusiveLock を取得しようとしている
・reindex がテーブルに対するロックを取得し、テーブルのインデックスに対する AccessExclusiveLock を取得しようとしている
※ 参考までに、update は select for update してから update しています。
Postgre のバグではないかと思うのですが、デッドロックを回避する方法はありますでしょうか?
(なるだけ、reindex を実行しているプロセスの方に手を入れることで対応できないかと思っています。例えば、reindexの前に事前にロックを取得する、とか・・・)
よろしくお願い致します。
No.1ベストアンサー
- 回答日時:
REINDEXをテーブルごとに行っているならば、以下の手順でデッドロックは回避できます。
BEGIN;
LOCK tbl IN ACCESS EXCLUSIVE MODE;
REINDEX TABLE tbl;
COMMIT;
ただ、REINDEX中は参照も更新も待たされるため、基本的には、オンライン処理と並行しては実行できません。代わりに CREATE INDEX CONCURRENTLY + 古いインデックスを DROP INDEX というような運用を行うことはよくあります。
参考URL:http://www.postgresql.jp/document/current/html/s …
ご回答、有り難うございます。
私も、検証環境で現象を再現した上で、同様の変更(私の場合は EXCLUSIVE MODE を使いました)を試みたところ、デッドロックは出なくなりました。
CREATE INDEX CONCURRENTLY については、別な問題があるようですので、採用していません。
対象のテーブルがバッチ制御用のテーブルで、一時的に参照がブロックされても直接オンライン処理に影響が出ないため、REINDEX を使っています。
なお、質問時に書き忘れたのですが、参考までに環境について記載します。
vl60_cmn=# SELECT version();
version
-----------------------------------------------------------------------------------------------------------
PostgreSQL 8.3.1 on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14)
(1 row)
OSは CentOS 5 を使っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLでUPSERTを一度に複数行やる...
-
テーブルに存在しない列をselec...
-
SELECT 文の NULL列は?
-
PostgreSQLの断片化の状況を確...
-
SQLにて指定日付より前、かつ最...
-
Postgresqlで配列に日付を格納...
-
テーブルにcsvファイルをインポ...
-
VIEWのCOPYってできないんですか?
-
単純なselectが遅くなるのです...
-
「テーブルに座って……」という...
-
AccessのSQL 部分一致したデー...
-
テーブルで一番古いレコードだ...
-
降順で並び替えて昇順で受け取...
-
SQLで複数列のデータを複数行に...
-
外部キーだけのテーブル(主キ...
-
飲み会で、座敷orテーブルどち...
-
会社の飲み会の幹事になり、座...
-
SQLでSUMなどの関数でデータが...
-
ORA-01401が表示され、データが...
-
コンボボックスにレコードセッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT 文の NULL列は?
-
SQLにて指定日付より前、かつ最...
-
テーブルに存在しない列をselec...
-
SQLでUPSERTを一度に複数行やる...
-
PostgreSQLの断片化の状況を確...
-
javaでデータベース上のテーブ...
-
単純なselectが遅くなるのです...
-
2つのテーブルで引き算 postgres
-
PostgreSQL レコードからアイテ...
-
テーブルを作ろうとしたら。
-
デットロック回避策(autocommit...
-
Postgresのデータ領域の拡張に...
-
MS Access から PostgreSQL へ...
-
Postgresqlのレポート機能について
-
reindex と update のデッドロック
-
最新レコードを抽出し外部結合...
-
異なるデータベースでのINSERT...
-
投稿記事と関連付けているテー...
-
テーブルにcsvファイルをインポ...
-
SQLのクエリの書き方を教えて下...
おすすめ情報