mysql服务器如何重启会影响当前正在运行的作业

时间:2012-05-19 18:05:14

标签: php mysql linux

在我的虚拟专用linux服务器上,总有一些php作业正在运行。这些作业不断将数据写入不同的表中。我想知道,如果我需要重启我的mysql服务器会发生什么,因为我已经进行了一些配置更改?如果我重新启动我的mysql服务器,是否会杀死所有正在运行的作业?或者它们会暂停一段时间,在服务器重启时抛出错误?

感谢您的帮助

3 个答案:

答案 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,应用程序将完全忽略它并在其输出文件中生成垃圾数据,输入无限循环,或其他一些完全无用的行为。

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