2

在我的虚拟专用 linux 服务器上,总是有一些 php 作业正在运行。这些作业不断在不同的表中写入数据。我想知道,如果我在进行了一些配置更改后需要重新启动我的 mysql 服务器会发生什么?如果我重新启动我的 mysql 服务器,所有正在运行的作业会被终止吗?还是他们会暂停一段时间,在服务器重新启动时抛出错误?

谢谢你的帮助

4

3 回答 3

3

取决于这些 php 作业的编写情况。他们可能会保留数据直到重新建立连接,他们会发送邮件失败并“寻求帮助”,或者他们可能会失败,因为未使用事务逻辑而导致数据处于混乱状态。

您可能会得到最好的结果,或者最坏的结果完全取决于这些 php 作业的开发情况。

于 2012-05-19T18:09:26.250 回答
1

如果您在实际的 mysql php 调用周围添加一些代码,您可以捕获错误并处理它们。

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

如果您发现您有其他错误可能会在您等待一会儿后成功,然后添加它们。

对于无论等待多长时间都不会成功的错误,请将它们添加到“中断”代码块中。

于 2012-06-08T22:35:13.313 回答
0

取决于他们是怎么写的。

很可能,由于它们是用 PHP 编写的,它们会在数据库中出现大量错误,这将触发 PHP E_WARNINGs,应用程序将完全忽略它并在其输出文件中生成垃圾数据,进入无限循环,或其他一些完全无用的行为。

他们肯定不会被杀。但是,它们可能会死掉(这可能是合理的行为,前提是它们可以重新启动并做正确的事情)。

于 2012-05-19T21:44:13.457 回答