
実運用中のテーブルに対し、日次で 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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT 文の NULL列は?
-
SQLでUPSERTを一度に複数行やる...
-
テーブルに存在しない列をselec...
-
SQLにて指定日付より前、かつ最...
-
ワークテーブル(ローカル)か...
-
テーブル定義書作成時のIndex付...
-
テーブルにcsvファイルをインポ...
-
Postgresのデータ領域の拡張に...
-
PostgreSQL レコードからアイテ...
-
バキューム処理の実行時間の目安
-
XREAサーバでテーブル作成方法
-
2つのテーブルで引き算 postgres
-
DBFluteについて質問です。 環...
-
PostgresSQLでテーブル定義の抽...
-
LASTVAL()の使い方
-
【HTML】テーブルの中にテーブ...
-
テーブルを作ろうとしたら。
-
PostgreSQLの断片化の状況を確...
-
DISTINCTとGROUP BYの違い
-
会社の飲み会の幹事になり、座...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT 文の NULL列は?
-
テーブルに存在しない列をselec...
-
SQLにて指定日付より前、かつ最...
-
SQLでUPSERTを一度に複数行やる...
-
PostgreSQLの断片化の状況を確...
-
単純なselectが遅くなるのです...
-
MS Access から PostgreSQL へ...
-
javaでデータベース上のテーブ...
-
2つのテーブルで引き算 postgres
-
Postgresqlのレポート機能について
-
reindex と update のデッドロック
-
Postgresのデータ領域の拡張に...
-
デットロック回避策(autocommit...
-
テーブルにcsvファイルをインポ...
-
PostgreSQL 8.0.2 の ERROR: r...
-
PostgreSQL レコードからアイテ...
-
同一カラムに複数条件指定
-
備品管理のデータベースについて
-
PostgresSQLでテーブル定義の抽...
-
DISTINCTとGROUP BYの違い
おすすめ情報