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」で覚えます。ブラウザの中のシミュレーターで、本物と同じように打って確かめられます。
すべてのレベルが、プラチナ以上のプランで遊べます。