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