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