Ubuntu java php 程序员 google Windows HTML5 wordpress linux Android shell nginx apache mysql Firefox 微软 linux命令 开源 centos Python

重现 MySQL “MySQL server has gone away” 的错误方法

如果想调试“mysql server has gone away”的问题,可以这样重现:

修改配置文件:

sudo vi /etc/mysql/my.cnf

做如下修改:

[mysqld]
wait_timeout = 30 
interactive_timeout = 30

重启服务:

sudo /etc/init.d/mysql restart

编写如下PHP脚本

<?php
$link = mysql_connect('127.0.0.1', 'root', 'root');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';

sleep(31);
$result = mysql_query('show variables;');
if (!$result) {
die('Invalid query: ' . mysql_error());
}
while ($row = mysql_fetch_assoc($result)) {
var_dump($row);
}
mysql_free_result($result);

mysql_close($link); 
?>

执行:

$ php mysql.php
Connected successfully
Invalid query: MySQL server has gone away

或者在命令行下等30秒也可以看到这个错误了:

mysql> select variables like '%timeout';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 40
Current database: *** NONE ***

然后你就可以想干啥干啥了,比如加个mysql_ping让他实现自动重连:

<?php
function get_conn() {
$conn = mysql_connect('127.0.0.1', 'root', 'root');
if (!$conn) {
die('Could not connect: ' . mysql_error() . '\n');
}
return $conn;
}

$conn = get_conn();

sleep(31);
if (!mysql_ping($conn)) {
mysql_close($conn);
$conn = get_conn();
echo 'Reconnect\n';
}

$result = mysql_query('show variables;');
if (!$result) {
die('Invalid query: ' . mysql_error());
}
while ($row = mysql_fetch_assoc($result)) {
var_dump($row);
}
mysql_free_result($result);

mysql_close($conn);
?>

另外,php文档里说mysql_ping可以自动重连,但经实验实际上还是需要用户自行处理重连的问题(也可能我的参数设置不对)。

如果使用的是C/C++,可以在连接建立后使用如下方法让mysql_ping具有自动重连功能:

char mysql_reconnect = 1;
mysql_options(mysql->conn, MYSQL_OPT_RECONNECT, (char *)&mysql_reconnect);

延伸阅读

评论