3

mysql_query() を使用して php で長時間実行される mysql クエリを実行すると (私はそれを使用することになっていないことを知っています)、php プロセスが強制終了され、クエリが mysql サーバーで実行され続けることに気付きました。これは永続的な接続ではありません。接続は次のように行われます。

$db = mysql_connect($host, $login, $pass, false);
$sql = 'SELECT COUNT(*) FROM `huge_table`';
$result = mysql_query($sql, $db);

たとえば、10 億行のテーブルがあり、php プロセスが何らかの理由でこれを行うとします。

SELECT COUNT(*) FROM `huge_table`

そして、タイムアウトになるため (たとえば、request_terminate_timeout=5 で php-fpm を実行しているため)、5 秒後にプロセスを強制終了して、問題が発生しないようにします。

プロセスが強制終了されても、wait_timeout の後でもクエリは mysql で実行されます。

とにかく、何らかの理由でphpプロセスが終了した場合、それが作成した実行中のクエリも強制終了することを確認する方法はありますか?

私はmysql 5.5.38であるtokudb 5.5.38-tokudb-7.1.7-eを使用しています

4

3 に答える 3

3

PHP スクリプトが実行を開始し、MySQL クエリを実行する部分に到達すると、そのクエリは MySQL に渡されます。クエリの制御は、もはや PHP の手に委ねられていません....その時点で PHP は MySQL からの応答を待っているだけで、次に進むことができます。PHP スクリプトを強制終了しても、MySQL クエリには影響しません。なぜなら、クエリは MySQL の仕事だからです。

別の言い方をすれば、PHP はドアに来て、ノックし、品物を渡し、あなたが応答を返すのを待って、彼が向かうことができるようにします。彼を撃っても、ドアの後ろで起こっていることに影響はありません。

次のようなものを実行して、最も長く実行されているプロセスを取得し、それらを強制終了できます。

<?php
    $con=mysqli_connect("example.com","peter","pass","my_db");
// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$result = mysqli_query($con,"SHOW FULL PROCESSLIST");

while($row = mysqli_fetch_array($result)) {
if ($row["Time"] > $max_excution_time ) {
    $sql="KILL ".$row["Id"];
    mysql_query($sql);
    }   

}

mysqli_close($con); ?>
于 2014-07-23T05:18:47.070 に答える
0

使用できますKILL

  • KILL CONNECTION修飾子がない場合と同じKILLです。指定された thread_id に関連付けられた接続を終了します。
  • KILL QUERY接続が現在実行中のステートメントを終了しますが、接続自体はそのまま残します。

シャットダウンKILL QUERYイベントで、mysqli_close().


タイムアウトに関するこの質問から、いくつかの貴重な情報を得ることができます: Client times out, while MySQL query still running?

于 2014-07-23T04:31:08.913 に答える