たちまち。

即席で役に立つこと。

PostgreSQLで特定のテーブルが応答しない

 

PostgreSQL9.4にて。

特定のテーブルに対するクエリが返ってこない。countすら返ってこない。

pgAdminでテーブルを参照しようとすると、テーブル名をクリックした時点で固まるという始末。

今回のケースではテーブルロックが関与していた。

1. テーブルのロック状況を調べる

select * from pg_stat_activity;

上記のSQLで、実行中のクエリ状況がわかる。右端のquery列でどんなクエリか判別できる。

「waiting」列が「t」になっているものは、待たされているクエリ。まずそれが存在していないかチェック。

加えて、その応答しないテーブルにアクセスしているクエリがないかチェック。query_startに開始時間も書いてあるので照らし合わせながら、長時間残っているような怪しいクエリを探す。見つけたらpidを控え、次のSQLでロック解除する。

2. ロック解除(クエリをキャンセル)する

select pg_cancel_backend(pid);

以上で、応答しなかったテーブルに無事アクセスできるようになった。