pg_locks と pg_blocking_pids の使い方

ロックの待ちを調べる

書き方

SELECT pid, relation::regclass, mode, granted FROM pg_locks WHERE NOT granted;
SELECT pid, pg_blocking_pids(pid) FROM pg_stat_activity WHERE wait_event_type = 'Lock';
SET lock_timeout = '3s';

pg_locks はロックの一覧です。granted が false の行は、取れずに待っているロックです。pg_blocking_pids(pid) は、その接続を待たせている接続の pid の配列を返します。待たせている元(多くは idle in transaction)を見つけて終わらせます。DDL を流すときは lock_timeout を決めておくと、長く待たずにあきらめます。

例

SELECT pid, state, query FROM pg_stat_activity WHERE pid = ANY(pg_blocking_pids(5202));

実際に打って練習する

PostgreSQL DBA コースの Lv46「ロックの待ち pg_locks」で覚えます。ブラウザの中のシミュレーターで、本物と同じように打って確かめられます。

すべてのレベルが、プラチナ以上のプランで遊べます。

PostgreSQL の管理コマンド一覧(DBA)へ戻る