MySQL server has gone away问题解决办法

执行一个SQL,但SQL语句过大或者语句中含有BLOB或者longblob字段。比如,图片数据的处理。都容易引起MySQL server has gone away。

今天遇到类似的情景,MySQL只是冷冷的说:MySQL server has gone away。

后来百度查找发现是mysql设置的问题

原因1. MySQL 服务宕了

判断是否属于这个原因的方法很简单,执行以下命令,查看mysql的运行时长

$ mysql -uroot -p -e "show global status like 'uptime';"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Uptime        | 68928 |
+---------------+-------+
1 row in set (0.04 sec)或者查看MySQL的报错日志,看看有没有重启的信息

$ tail /var/log/mysql/error.log
130101 22:22:30 InnoDB: Initializing buffer pool, size = 256.0M
130101 22:22:30 InnoDB: Completed initialization of buffer pool
130101 22:22:30 InnoDB: highest supported file format is Barracuda.
130101 22:22:30 InnoDB: 1.1.8 started; log sequence number 63444325509
130101 22:22:30 [Note] Server hostname (bind-address): '127.0.0.1'; port: 3306
130101 22:22:30 [Note]   - '127.0.0.1' resolves to '127.0.0.1';
130101 22:22:30 [Note] Server socket created on IP: '127.0.0.1'.
130101 22:22:30 [Note] Event Scheduler: Loaded 0 events
130101 22:22:30 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.5.28-cll'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server (GPL)
如果uptime数值很大,表明mysql服务运行了很久了。说明最近服务没有重启过。

如果日志没有相关信息,也表名mysql服务最近没有重启过,可以继续检查下面几项内容。

2. 连接超时

如果程序使用的是长连接,则这种情况的可能性会比较大。

即,某个长连接很久没有新的请求发起,达到了server端的timeout,被server强行关闭。

此后再通过这个connection发起查询的时候,就会报错server has gone away

$ mysql -uroot -p -e "show global variables like '%timeout';"
+----------------------------+----------+
| Variable_name              | Value    |
+----------------------------+----------+
| connect_timeout            | 30       |
| delayed_insert_timeout     | 300      |
| innodb_lock_wait_timeout   | 50       |
| innodb_rollback_on_timeout | OFF      |
| interactive_timeout        | 28800    |
| lock_wait_timeout          | 31536000 |
| net_read_timeout           | 30       |
| net_write_timeout          | 60       |
| slave_net_timeout          | 3600     |
| wait_timeout               | 28800    |
+----------------------------+----------+mysql> SET SESSION wait_timeout=5;

## Wait 10 seconds

mysql> SELECT NOW();
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    132361
Current database: *** NONE ***

+---------------------+
| NOW()               |
+---------------------+
| 2013-01-02 11:31:15 |
+---------------------+
1 row in set (0.00 sec)

3. 进程在server端被主动kill

这种情况和情况2相似,只是发起者是DBA或者其他job。发现有长时间的慢查询执行kill xxx导致。

$ mysql -uroot -p -e "show global status like 'com_kill'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_kill      | 0     |
+---------------+-------+

1、应用程序(比如PHP)长时间的执行批量的MYSQL语句。
最常见的就是采集或者新旧数据转化。

解决方案:

在my.ini文件中添加或者修改以下两个变量:

 代码如下 复制代码

wait_timeout=2880000
interactive_timeout = 2880000

关于两个变量的具体说明可以google或者看官方手册。
如果不能修改my.cnf,则可以在连接数据库的时候设置CLIENT_INTERACTIVE,比如:

 代码如下 复制代码

sql = "set interactive_timeout=24*3600";
mysql_real_query(...)

2、执行一个SQL,但SQL语句过大或者语句中含有BLOB或者longblob字段。
比如,图片数据的处理
解决方案

在my.cnf文件中添加或者修改以下变量:

max_allowed_packet = 10M (也可以设置自己需要的大小)

max_allowed_packet 参数的作用是,用来控制其通信缓冲区的最大长度。

时间: 2024-09-19 09:31:37

MySQL server has gone away问题解决办法的相关文章

几种MySQL server has gone away解决办法

最简单的办法 1.应用程序(比如PHP)长时间的执行批量的MYSQL语句.最常见的就是采集或者新旧数据转化. 解决方案: 在my.cnf文件中添加或者修改以下两个变量:  代码如下 复制代码 wait_timeout=2880000 interactive_timeout = 2880000 关于两个变量的具体说明可以google或者看官方手册.如果不能修改my.cnf,则可以在连接数据库的时候设置CLIENT_INTERACTIVE,比如:  代码如下 复制代码 sql = "set inte

Linux开启mysql远程连接方法与问题解决办法

Linux开启mysql远程连接方法 1.GRANT命令创建远程连接mysql授权用户root mysql -u root -p mysql>GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY '123456' WITH GRANT OPTION; 增加root用户授权通过本地机(localhost)访问,密码 "123456". mysql>GRANT ALL PRIVILEGES ON *.* TO r

Can't connect to MySQL server on 'localhost' (10048)问题解决方法_Mysql

解决Can't connect to MySQL server on 'localhost' (10048), 一般见于使用mysql的windows 2003服务器. 错误的出现的原因: 应用程序需要快速释放和创建新连接, 但是由于 TIME_WAIT 中存在的连接超过默认值,导致较低吞吐量. 解决方案: 和本错误密切相关的两个windows的注册表项:TcpTimedWaitDelay和MaxUserPort的值. TcpTimedWaitDelay 确定 TCP/IP 可释放已关闭连接并重

MySQL server has gone away解决办法

先要确认是不是你的空间商出问题,如果你是虚拟空间的话就先如下操作 1.虚拟主机用户请联系空间商确认 MySQL 服务器是否正常,或者你的程序在运行过程中消耗了太多的服务器资源,请联系空间商进行确认: 2.独立主机用户请优化你的 MySQL 的配置,检查 MySQL 的运行情况,适当的时候增加服务器的配置. 3.因为执行动作过多,造成 MySQL 连接超时,如果是独立主机请修改 MySQL  的配置文件中的 wait_timeout 这个值设置大一点. 如果你是自己的服务器可以如下操作 1.应用程

Can’t connect to MySQL server on ‘localhost’ (10061)解决办法

服务器的CPU.内存都正常.连续刷新网页会时有时无出现: Can't connect to MySQL server on 'localhost' (10061) 解决方法: 该现象属于微软9月10日发布的"TCP/IP"补丁带来的问题. 在"控制面板"的"添加或删除程序"(注意勾选"显示更新"复选框)中删除编号为KB967723的补丁即可    

mysql [Warning] max_join_size报错问题解决办法

100716 06:32:45  mysqld started 100716  6:32:45 [Warning] option 'max_join_size': unsigned value 18446744073709551615 adjusted to 4294967295 100716  6:32:45 [Warning] option 'max_join_size': unsigned value 18446744073709551615 adjusted to 4294967295

mysql导入数据提示的MySQL server has gone away解决办法

问题原因 max_allowed_packet太小导致的.将max_allowed_packet改大 解决办法 在my.cnf文件中修改 max_allowed_packet 改大一些再导入即可解决.

mysql数据库 slave复制异常问题解决办法

以下是两种slave复制异常的情况.导致的原因都是由于跨机房同步,slave的机房突然掉电导致的.    案例一.    这个错误大原因是Read_Master_Log_Pos: 1028687822的pos号在主库上是没有的.    处理方法:获取这个pos号的前一个pos号,从新开启同步,这里注意如果是row模式的话就没有问题.如果是mix的或者statement的话,就需要去分析binlog,确认具体执行到哪个pos号了,不然可能会导致数据不一致.    (andy:db:)[(none)

MYSQL导入存储过程无法执行问题解决办法

通过mysql导入的数据库,当里面有存储过程的时候,导入后存储过程是无法用程序使用了,找了很久原因,最后发现是权限问题. 1.我们要用查看数据库里面的存储过程:在mysql里面输入 mysql> show function status; 运行后的结果如图所示: 2.修改对应存储过程的Definer和Security_type这两个字段的值 加入我们程序链接数据库的帐户是leiming,链接数据库的地址是127.0.0.1 我们需要输入 mysql> update mysql.proc set