mysql错误码:2006-MySQL server has gone away详解

mysql错误码:2006-MySQL server has gone away详解

1.背景

代码测试过程中发现程序运行一段时间之后mysql数据库就报2006的错误码,程序重启之后恢复正常。

2.产生原因与解决方案一(mysql长连接)

2.1.mysql_ping与mysql长连接(此方案适用于解决代码开发中遇到的mysql错误码:2006—治标又治本)

重点参考有"//20190730 changlq add 修复mysql长连接长时间没有操作会被自动关闭的bug,错误信息:2006:MySQL server has gone away"的两块代码

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include<mysql/mysql.h>
void free_conn(MYSQL *mysql){
	mysql_close(mysql);
	free(mysql);
}
int main(){
  /* gcc -o mysql_eg mysql_eg.c -L /usr/lib64/mysql -lmysqlclient */
  MYSQL *my_con=(MYSQL *)malloc(sizeof(MYSQL));
  my_con=mysql_init(my_con);
  if(!my_con){
    printf("mysql_init error\n");
    return -1;
  }
  my_con=mysql_real_connect(my_con,"db_ip","db_name","db_pass","db_name",3306,NULL,0);
  if(my_con){
    printf("connect success!\n");
    
    //20190730 changlq add 修复mysql长连接长时间没有操作会被自动关闭的bug,错误信息:2006:MySQL server has gone away
    char value = 1;
    int mo_flag=mysql_options(my_con, MYSQL_OPT_RECONNECT, &value);
    if(mo_flag!=0){
    	printf("mysql_options set fail\n");
    }
    
  }else{
  	printf("connect fail![errno:%d][error:%s][sqlstat:%s]\n",mysql_errno(my_con),mysql_error(my_con),mysql_sqlstate(my_con));
  }
  
  int i=0;
  char *alo_sql_str=(char *)malloc(2048);
  while(i++<10){
  	//20190730 changlq add 修复mysql长连接长时间没有操作会被自动关闭的bug,错误信息:2006:MySQL server has gone away
  	//20190730 changlq add 每次循环都监听一次数据库连接
	int mp_local_flag=mysql_ping(my_con);
	if(mp_local_flag!=0){
      printf("mysql_ping local operation fail");
    }
    
    /* 一次执行多条语句+读完整个resault集 */
    memset(alo_sql_str,0x00,2048);
    sprintf(alo_sql_str,"LOCK TABLES test_table WRITE;INSERT INTO test_table VALUES(10);UNLOCK TABLES");
    // 执行多条语句:功能打开-多语句执行-功能关闭
    mysql_set_server_option(my_con,MYSQL_OPTION_MULTI_STATEMENTS_ON);
    int res=mysql_query(my_con,alo_sql_str);
    mysql_set_server_option(my_con,MYSQL_OPTION_MULTI_STATEMENTS_OFF);
    if(res != 0){
      printf("insert fail,msg:[%s]", alo_sql_str );
      free(alo_sql_str);
      free_conn(my_con);
      return -1;
    }
    // 当使用执行多语句功能后,一定要读完整个resault集,否则会出现错误:erron:2014 error:Commands out of sync; you can't run this command now 
    MYSQL_RES    *my_res; //查询结果
    do
    {
        my_res = mysql_store_result( my_con );
        if(my_res) mysql_free_result(my_res);
    }while( !mysql_next_result(my_con) );  /* more my_con? -1 = no, >0 = error, 0 = yes (keep looping) */
  }
  free(alo_sql_str);
  free_conn(my_con);
  return 0;
}
2.2.调整数据库相关参数阈值(此方案适用于临时解决错误码:2006—治标不治本)

2.2.1 找到mysql配置文件/etc/my.cnf,加入以下代码
wait_timeout=288000 # 参数含义:服务器关闭交互式连接前等待活动的秒数。
interactive_timeout = 288000 # 参数含义:服务器关闭非交互连接之前等待活动的秒数。
相关参数详解
2.2.2 重启MySQL数据库
service mysql restart

3.产生原因与解决方案二(数据库max_allowed_packet参数限制)

3.1调整数据库参数max_allowed_packet阈值

3.1.1 临时调整max_allowed_packet阈值

mysql> show global variables like 'max_allowed_packet';
+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+
1 row in set (0.00 sec)
mysql> set global max_allowed_packet=1024*1024*16;

3.1.2 永久调整max_allowed_packet阈值
a. 查看现有阈值

[root@localhost:/root]#cat /etc/my.cnf | grep "max_allowed_packet"
max_allowed_packet = 1M

b. 修改阈值

[root@localhost:/root]#sed -i 's/max_allowed_packet = 1M/max_allowed_packet = 16M/g' /etc/my.cnf
[root@localhost:/root]#cat /etc/my.cnf | grep "max_allowed_packet"
max_allowed_packet = 16M

c. 重启MySQL数据库
service mysql restart

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"ERROR 2006 (HY000): MySQL server has gone away" 是MySQL数据库中常见的错误之一。这个错误通常意味着您的SQL语句执行失败,因为失去了与数据库的连接。错误消息中提到的"MySQL server has gone away"意味着MySQL服务器已经断开连接或关闭。这可能是由于以下几种原因造成的: 1. 连接超时:如果MySQL服务器在指定的时间内没有收到来自客户端的任何请求,它可能会断开连接。这可能是由于网络问题、服务器负载过高或连接闲置时间过长等原因引起的。 2. 数据库服务器重启或崩溃:如果MySQL服务器重新启动或发生崩溃,客户端的连接将被中断。 3. 数据库连接过多:如果MySQL服务器同时处理的连接数超过其配置限制,它可能会关闭一些连接以释放资源。 要解决这个问题,您可以尝试以下方法: 1. 检查网络连接:确保您的网络连接稳定,没有任何中断或故障。 2. 检查连接超时设置:您可以检查MySQL服务器的连接超时设置,并根据需要进行适当的调整。您可以通过修改MySQL配置文件(my.cnf)中的"wait_timeout"参数来增加连接超时时间。 3. 检查服务器负载:如果服务器负载过高,可以尝试减少并发连接数或优化查询以减少服务器负载。 4. 检查数据库连接数限制:您可以通过修改MySQL配置文件(my.cnf)中的"max_connections"参数来增加允许的最大连接数。 5. 检查错误日志:查看MySQL的错误日志,以获取更多关于服务器断开连接的详细信息。错误日志通常位于MySQL的数据目录下。 总之,"ERROR 2006 (HY000): MySQL server has gone away" 错误意味着您的SQL语句执行失败,因为与数据库的连接丢失。您可以通过检查网络连接、连接超时设置、服务器负载、数据库连接数限制以及MySQL的错误日志来解决这个问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [MySQL错误“ERROR 2006 (HY000):MySQL server has gone away”](https://blog.csdn.net/m0_67402013/article/details/124007166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [解决MySQL报错:ERROR 2006 (HY000): MySQL server has gone away No connection(图文并茂)](https://blog.csdn.net/qq_45261963/article/details/121751845)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值