当前位置:Gxlcms > 数据库问题 > MySQL server has gone away 问题的解决方法

MySQL server has gone away 问题的解决方法

时间:2021-07-01 10:21:17 帮助过:22人阅读

wait_timeout=2880000 2 interactive_timeout = 2880000

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

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

2、执行一个SQL,但SQL语句过大或者语句中含有BLOB或者longblob字段。比如,图片数据的处理
解决方案:
在my.cnf文件中添加或者修改以下变量:

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

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


最近在做一个项目,需要程序24小时开着,而中间会有很多闲置时间,于是每天早上过来第一次操作数据库时,就出现了“MySQL server has gone away”这样的错误提示,而这个问题的原因是由于数据库连接由于长时间没有操作而会被自动关闭。解决这个问题,我的经验有以下两点,或许对大家有用处:
第 一种方法:
当然是增加你的 wait-timeout值,这个参数是在my.cnf(在Windows下台下面是my.ini)中设置,我的数据库负荷稍微大一点,所以,我设置的值 为10,(这个值的单位是秒,意思是当一个数据库连接在10秒钟内没有任何操作的话,就会强行关闭,我使用的不是永久链接 (mysql_pconnect),用的是mysql_connect,关于这个wait-timeout的效果你可以在MySQL的进程列表中看到 (show processlist) ),你可以把这个wait-timeout设置成更大,比如300秒,呵呵,一般来讲300秒足够用了,其实你也可以不用设置,MySQL默认是8个小 时。情况由你的服务器和站点来定。
第二种方法:
这也是我个人认为最好的方法,即检查 MySQL的链接状态,使其重新链接。 (用mysql_ping())
可能大家都知道有mysql_ping这么一个函数,在很多资料中都说这个mysql_ping的 API会检查数据库是否链接,如果是断开的话会尝试重新连接,但在我的测试过程中发现事实并不是这样子的,是有条件的,必须要通过 mysql_options这个C API传递相关参数,让MYSQL有断开自动链接的选项(MySQL默认为不自动连接),但我测试中发现PHP的MySQL的API中并不带这个函数,你重新编辑MySQL吧,呵呵。但mysql_ping这个函数还是终于能用得上的,只是要在其中有一个小小的操作技巧: 

 1 //使用mysql_ping来自动检查重连。用到两个函数,一个是mysql_ping,另外一个是mysql_options。具体使用方法是在mysql_real_connect之前,mysql_init之后,使用mysql_options。用法如下:
 2  char value = 1;
 3 (void) mysql_init (&mysql);
 4  mysql_options(&mysql, MYSQL_OPT_RECONNECT, (char *)&value);   //设置自动连接
 5 //然后在以后mysql_query之前首先使用mysql_ping进行判断,如果连接已经断开,会自动重连。 
 6 mysql_ping(&mysql);
 7 //ping()这个函数先检测数据连接是否正常,如果被关闭,整个把当前脚本的MYSQL实例关闭,再重新连接。 
 8 //经过这样处理后,可以非常有效的解决MySQL server has gone away这样的问题,而且不会对系统造成额外的开销。 
 9 //mysql_ping会改变mysql_affected_rows的返回值。所以最好是给该MYSQL句柄再加一个mutex(最好是读写锁)。当其它线程准备执行query的时候,就获取锁,执行完就释放。而这个执行mysql_ping的线程在执行ping之间先尝试获取锁,如果获取失败,
10 //则继续sleep,放弃这一轮的ping。

 

附录:

mysqli_options() 

定义和语法

mysqli_options() 函数设置额外的连接选项,用于影响连接行为。

mysqli_options() 函数可以被调用若干次来设置若干个选项。

注释:mysqli_options() 函数可以在 mysqli_init() 之后和 mysqli_real_connect() 之前被调用。

语法:

1 mysqli_options(connection,option,value);

connection:必需。规定要使用的 MySQL 连接。

option:必需。规定要设置的选项。可以是下列值中的一个:

  • MYSQLI_OPT_CONNECT_TIMEOUT - 以秒为单位的连接超时时间
  • MYSQLI_OPT_LOCAL_INFILE - 启用/禁用 LOAD LOCAL INFILE
  • MYSQLI_INIT_COMMAND - 在连接到 MySQL 服务器之后的执行命令
  • MYSQLI_READ_DEFAULT_FILE - 从已命名的文件而不是 my.cnf 中读取选项
  • MYSQLI_READ_DEFAULT_GROUP - 从 my.cnf 或者 MYSQLI_READ_DEFAULT_FILE 中指定的文件中的已命名组中读取选项
  • MYSQLI_SERVER_PUBLIC_KEY - 基于 SHA-256 认证的 RSA 公共密钥文件

value:必需。规定 option 的值。

mysql_ping()

mysql_ping指:本函数可用于空闲很久的脚本来检查服务器是否关闭了连接。

定义和语法

nt STDCALL mysql_ping(MYSQL *mysql); 描述: 检查与服务端的连接是否正常。连接断开时,如果自动重新连接功能未被禁用,则尝试重新连接服务器。该函数可被客户端用来检测闲置许久以后,与服务端的连接是否关闭,如有需要,则重新连接。 返回值:
  连接正常,返回0;如有错误发生,则返回非0值。返回非0值并不意味着服务器本身关闭掉,也有可能是网络原因导致网络不通。 错误码:
CR_COMMANDS_OUT_OF_SYNC 命令以不正确的顺序执行 CR_SERVER_GONE_ERROR 服务器连接断开

。。。

语法

mysql_ping(connection)

connection:可选。规定 MySQL 连接。如果未规定,则使用上一个连接。

MySQL server has gone away 问题的解决方法

标签:php   取数   select   proc   stat   查询   option   最大   错误提示   

人气教程排行