sql >> データベース >  >> RDS >> PostgreSQL

ハングしたクエリを終了します(トランザクションでアイドル状態)

    これは一般的なPostgresの回答であり、herokuに固有のものではありません

    (この質問に対する単純で愚かな答えは... postgresqlを再起動するだけかもしれません。それが望ましくないか、オプションではないと仮定すると...)

    このSQLを実行してPIDを見つけます:

    SELECT pid , query, * from pg_stat_activity
      WHERE state != 'idle' ORDER BY xact_start;
    

    (クエリはpostgresのバージョンに応じて修正する必要があるかもしれません-最終的にはpg_stat_activityから*を選択するだけです)。 pidは最初の(左)列にあり、最初の(上の)行は終了したいクエリである可能性があります。 pidは以下の1234であると仮定します。

    自分のものであるか、スーパーユーザーアクセス権を持っている限り、SQLを介して(つまり、シェルアクセスなしで)クエリをキャンセルできます:

    select pg_cancel_backend(1234);
    

    これは、1234クエリをキャンセルするための「友好的な」リクエストであり、運が良ければしばらくすると消えます。最終的に、これはより効率的です:

    select pg_terminate_backend(1234);
    

    シェルアクセスとrootまたはpostgres権限がある場合は、シェルからも実行できます。 「キャンセル」するには、次のようにします。

    kill -INT 1234
    

    簡単に「終了」するには:

    kill 1234
    

    禁止事項:

    kill -9 1234
    

    ...多くの場合、postgresサーバー全体が炎上します。その後、postgresを再起動することもできます。 Postgresはかなり堅牢なので、データが破損することはありませんが、どのような場合でも「kill-9」を使用しないことをお勧めします:-)

    長期にわたる「トランザクションのアイドル」は、多くの場合、トランザクションが「コミット」または「ロールバック」で終了しなかったことを意味します。つまり、アプリケーションにバグがあるか、トランザクションデータベースで動作するように適切に設計されていません。長期にわたる「トランザクションのアイドル」は、パフォーマンスに大きな問題を引き起こす可能性があるため、避ける必要があります。



    1. phpmyadminを使用してストアドプロシージャを作成する方法と、phpを介して使用する方法は?

    2. クエリを使用して、指定された2つの日付の間の月のリストを取得するにはどうすればよいですか?

    3. SQLServerのVARBINARY列にByte[]を挿入するにはどうすればよいですか

    4. PostgreSQLで利用可能なデータベースダイアグラムツールの概要