Keep It Real BLOG

ソフトウェアエンジニア。1児の父。 酒、ラーメン、サッカー好き。旅行も好きですが、普段は出不精で大抵たまプラーザ界隈に居ます。

RDSでロックしたPostgreSQLのプロセスを削除する

f:id:naohide_a:20151202194604p:plain

RDSでPostgreSQLを使用しているのですが、table lockが掛かってしまい、insertやupdateが出来ないという自体が起こりました。 今回はロック対処法を書き記しておきたいと思います。

まず、どのプロセスがロックしているかを確認するSQLを打ちます。

SELECT l.pid, db.datname, c.relname, l.locktype, l.mode
FROM pg_locks l
        LEFT JOIN pg_class c ON l.relation=c.relfilenode
        LEFT JOIN pg_database db ON l.database = db.oid
ORDER BY l.pid;

次に、ロックが掛かっているプロセスを削除といきたいのですが、RDSではここでハマりました。

SELECT pg_cancel_backend(PID)

本来であれば、上記で行けるはずらしいのですが、RDSではそうは行きません。 pg_cancel_backendをpg_terminate_backendとしないと駄目なんですね。 いやー、ハマった。。

SELECT pg_terminate_backend(PID)

一応、簡単に全プロセス削除というのもメモっておきます。

SELECT pg_terminate_backend(pid)
  FROM pg_stat_activity
WHERE datname = 'DB_NAME'
   AND pid <> pg_backend_pid()