背景平时和开发者交流,或者在论坛上回答问题的时候,发现这个问题被问的非常频繁,比如:Whatistheerror"MySQLserverhasgoneaway"reported在程序中?这是什么意思?如何避免?所以,感觉有必要总结一下为什么会出现这个问题。正好看到一篇外文博客总结的比较好,于是翻译出来分享给大家。原因一:MySQL服务宕机。判断是否是这个原因的方法很简单。执行以下命令查看mysql的运行时间:$mysql-uroot-p-e"showglobalstatuslike'uptime';"+-------------+--------+|Variable_name|Value|+----------------+--------+|Uptime|68928|+----------------+--------+1rowinset(0.04sec)或者查看MySQL错误日志,看是否有重启信息:$tail/var/log/mysql/error.log13010122:22:30InnoDB:Initializingbufferpool,size=256.0M13010122:22:30InnoDB:Completedinitializationofbufferpool13010122:22:30InnoDB:highestsupportedfileformatisBarracuda.13010122:22:30InnoDB:1.1.8started;logsequencenumber6344432550913010122:22:30[Note]Serverhostname(bind-address):'127.0.0.1';port:330613010122:22:30[注意]-'127.0.0.1'解析为'127.0.0.1';13010122:22:30[注意]ServersocketcreatedonIP:'127.0.0.1'.13010122:22:30[注意]EventScheduler:Loaded0events13010122:22:30[注意]/usr/sbin/mysqld:readyforconnections.Version:'5.5.28-cll'socket:'/var/lib/mysql/mysql。sock'port:3306MySQLCommunityServer(GPL)如果uptime值很大,说明MySQL服务已经运行了很长时间,说明最近没有重启服务。如果日志中没有相关信息,说明近期没有重启MySQL服务,可以继续查看以下几项。原因二:连接超时。如果程序使用长连接,出现这种情况的可能性会比较高。即一个长连接长时间没有发起新的请求,到达服务器端超时,被服务器强行关闭。之后通过该客户端发起查询时,会报错serverhasgoneaway。$mysql-uroot-p-e"showglobalvariableslike'%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|0||wait_timeout|28800|+------------------------+----------+mysql>SETSESSIONwait_timeout=5;#Wait10secondsmysql>SELECTNOW();ERROR2006(HY000):MySQLserverhasgoneawayNoconnection.Tryingtoreconnect...Connectionid:132361Currentdatabase:***NONE***+--------------------+|NOW()|+--------------------+|2013-01-0211:31:15|+-------------------+1rowinset(0.00sec)原因三:服务器端主动杀进程。这个原因和第二个原因类似,只是发起者是DBA,或者其他的job,发现有killxxx导致的长期慢查询执行。$mysql-uroot-p-e"showglobalstatuslike'com_kill'"+--------------+------+|Variable_name|Value|+-------------+--------+|Com_kill|0|+----------------+--------+原因4:你的SQL语句太大当查询的结果集超过max_allowed_pa??cket时,也会出现这样的错误。定位方法是把错误相关的语句打出来。使用select*intooutfile导出到一个文件,检查文件大小是否超过max_allowed_pa??cket。如果超过,则需要调整参数或优化语句。mysql>showglobalvariableslike'max_allowed_pa??cket';+----------------+--------+|Variable_name|Value|+--------------------+--------+|max_allowed_pa??cket|1048576|+------------------+--------+1rowinset(0.00sec)#修改参数:mysql>setglobalmax_allowed_pa??cket=1024*1024*16;mysql>showglobalvariableslike'max_allowed_pa??cket';+--------------------+----------+|Variable_name|Value|+----------------+---------+|max_allowed_pa??cket|16777216|+----------------+--------+1rowinset(0.00秒)
