postgresqlデッドロック処理

1669 ワード

縁起
奇妙な現象が発生したら、selectとdelete表は正常に実行されますが、truncateとdrop表はずっと運行されています。
原因
「drop table」と「truncate table」は、「ACCESS EXCLUSIVE」を申請する必要があります。このコマンドを実行すると、このテーブルにはまだ照会などの操作が行われています。このクエリ操作が完了するのを待つだけで、「drop table」または「truncate table」またはフィールドを追加するSQLは、このテーブルの「ACCLASCECECECECESS」を取得することができます。操作が進められます。
解けます
1.デッドロックプロセスのIDを検索します。
select oid,relname from pg_class where relname='cdb_all_iu_data';
検索したフィールドの中に【wating】があります。 】フィールド、データがtの場合は、デッドロックのプロセスです。対応する【procpid】を見つけます。 】列の値
2.プロセスを殺す。
SELECT pgucancel ubackend('デッドロックデータのprocpid値) ');
結果:運行が終わったら、再度この表を更新して、sqlは順調に実行します。
 
pgustatual ctivityに記録がない場合は、pgulocksにこのオブジェクトのロックがあるかどうかを調べます。
 
select locktype、pid、relation、mode、granted、*from where relation='上で検索されたoid'
殺しプロセス
プロジェクト pgcancel('プロセスID')
また、pggaterminate関数は、プロセスを殺すこともできます。
締め括りをつける
select oid,relname from pg_class where relname='cdb_all_iu_data';
select locktype,database,pid,relation ,mode from pg_locks where relation=  oid;
select * from pg_stat_activity where pid =   pid
select pg_terminate_backend(  pid);