在我的虚拟专用 linux 服务器上,总是有一些 php 作业正在运行。这些作业不断在不同的表中写入数据。我想知道,如果我在进行了一些配置更改后需要重新启动我的 mysql 服务器会发生什么?如果我重新启动我的 mysql 服务器,所有正在运行的作业会被终止吗?还是他们会暂停一段时间,在服务器重新启动时抛出错误?
谢谢你的帮助
取决于这些 php 作业的编写情况。他们可能会保留数据直到重新建立连接,他们会发送邮件失败并“寻求帮助”,或者他们可能会失败,因为未使用事务逻辑而导致数据处于混乱状态。
您可能会得到最好的结果,或者最坏的结果完全取决于这些 php 作业的开发情况。
如果您在实际的 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
如果您发现您有其他错误可能会在您等待一会儿后成功,然后添加它们。
对于无论等待多长时间都不会成功的错误,请将它们添加到“中断”代码块中。
取决于他们是怎么写的。
很可能,由于它们是用 PHP 编写的,它们会在数据库中出现大量错误,这将触发 PHP E_WARNINGs,应用程序将完全忽略它并在其输出文件中生成垃圾数据,进入无限循环,或其他一些完全无用的行为。
他们肯定不会被杀。但是,它们可能会死掉(这可能是合理的行为,前提是它们可以重新启动并做正确的事情)。