実運用中のテーブルに対し、日次で 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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLでUPSERTを一度に複数行やる...
-
SELECT 文の NULL列は?
-
テーブルに存在しない列をselec...
-
javaでデータベース上のテーブ...
-
2つのテーブルで引き算 postgres
-
Postgresのデータ領域の拡張に...
-
UPDATE文の更新順序について
-
単純なselectが遅くなるのです...
-
SQLにて指定日付より前、かつ最...
-
MS Access から PostgreSQL へ...
-
重複を許すキーの構文がわかり...
-
PostgreSQLの断片化の状況を確...
-
テーブルを作ろうとしたら。
-
テーブル名を*で検索できますか?
-
デットロック回避策(autocommit...
-
SQL、2つのテーブルで条件一致...
-
Accessでデータシートに同じデ...
-
「テーブルに座って……」という...
-
L2SWはARPテーブルを持っている?
-
テーブル名をカラムとして取得...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT 文の NULL列は?
-
テーブルに存在しない列をselec...
-
SQLでUPSERTを一度に複数行やる...
-
単純なselectが遅くなるのです...
-
SQLにて指定日付より前、かつ最...
-
PostgreSQLの断片化の状況を確...
-
Postgresqlのレポート機能について
-
2つのテーブルで引き算 postgres
-
テーブルを作ろうとしたら。
-
Postgresのデータ領域の拡張に...
-
javaでデータベース上のテーブ...
-
postgres FILLFACTOR 確認方法
-
テーブルにcsvファイルをインポ...
-
VIEWのCOPYってできないんですか?
-
トリガープロシージャのNEW変数...
-
MS Access から PostgreSQL へ...
-
同一カラムに複数条件指定
-
難しいSQL
-
レコードを1件のみ取得した後...
-
COPYコマンドによるTEXT取り込...
おすすめ情報