RDSのプロセス削除コマンドはterminateを使う
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();
ネット上で調べてると、pg_cancel_backendと出ているのが殆どでハマってしまいました。pg_terminate_backend覚えておきたいところです。