2

私の仮想専用Linuxサーバーでは、常にいくつかのphpジョブが実行されています。これらのジョブは、さまざまなテーブルにデータを書き込み続けます。設定を変更したので、mysqlサーバーを再起動する必要がある場合はどうなりますか?mysqlサーバーを再起動すると、実行中のすべてのジョブが強制終了されますか?または、サーバーの再起動中にエラーが発生して、しばらく保留になりますか?

ご協力いただきありがとうございます

4

3 に答える 3

3

それらのphpジョブがどれだけうまく書かれているかによります。接続が再確立されるまでデータを保持するか、メールが失敗して「助けを求める」か、トランザクションロジックが使用されなかったために、データが混乱した状態でひどく失敗する可能性があります。

可能な限り最高の結果を得ることができますが、最悪の場合は、それらのphpジョブがどれだけうまく開発されたかに完全に依存します。

于 2012-05-19T18:09:26.250 に答える
1

実際のmysqlphp呼び出しの周りに少しコードを置くと、エラーをキャッチして処理できます。

function mquery( $qry, $lnk ) {
global $dbl;  # your pre-established database link

$result = mysql_query( $qry, $lnk );

if ( $result === false ) {
    $error_msg = mysql_error( $lnk );

    while ( $result === false && @$i < 25 ) {
        $i++;

        $error_no  = mysql_errno( $lnk );

        if      ( $error_no == 1054 ||  # "MySQL Error #1054: Unknown column..."
                     $error_no == 1064 ||  # "You have an error in your SQL syntax" - MAC - May 30, 2012
                     $error_no == 1065 ) { # "Query was empty" 
            break;  # don't loop on errors - it will not succeed
        }
        else if ( $error_no == 1205 ||  # SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction
                     $error_no == 1213 ) { # "Deadlock found when trying to get lock; try restarting transaction" 
            sleep( $i );                 # try sleeping a bit longer to get past the deadlock
        }
        else if ( $error_no == 2003 ||  # SQLSTATE[HY000] [2003] Can't connect to MySQL server
                     $error_no == 2006 ||  # "MySQL server has gone away" -- reconnect 
                     $error_no == 2013 ) { # SQLSTATE[HY000] [2013] Lost connection to MySQL server at 'reading authorization packet', system error: 0
            sleep( $i );
            if      ( $lnk == $dbl )    { # you may have multiple database links...
                get_dbl();   # re-establish your database link
                $lnk = $dbl;
            }
        }
        else {
            sleep( 1 ); # keeps us from sleeping too long on other errors
        }

        $result = mysql_query( $qry, $lnk );
    }
    echo "\n<!-- MySQL Error #$error_no: '$error_msg' (tried $i times) -->\n";
}

return $result;

}//mqueryを終了します

しばらく待つと成功する可能性のある他のエラーがある場合は、それらを追加します。

どれだけ待っても成功しないエラーの場合は、コードの「break」ブロックに追加します。

于 2012-06-08T22:35:13.313 に答える
0

それらがどのように書かれたかによります。

おそらく、PHPで記述されているため、データベースに大量のエラーが発生し、PHP E_WARNINGがトリガーされます。これにより、アプリケーションは完全に無視して出力ファイルにジャンクデータを生成し、無限ループに入ります。または他の完全に役に立たない振る舞い。

彼らは確かに殺されることはありません。ただし、それらは死ぬ可能性があります(再起動して正しいことを実行できる場合は、これは妥当な動作である可能性があります)。

于 2012-05-19T21:44:13.457 に答える