Error: 2006: MySQL server has gone away,该怎么解决
Error: 2006: MySQL server has gone away
我的MySQL安装的是5.6.13版,是源码安装。
我在程序里会把用户上网过程中的流表建一张表存入数据库,但是程序跑一段时间后就出现这个问题。
配置文件里设置 :
wait_timeout=2880000
interactive_timeout=2880000
max_allowed_packet=10M
这是什么原因造成的?
------解决思路----------------------
原因是长时间没有操作数据库,数据库连接自动断了。我去年也遇到过这个问题,方法是在连接数据库的时候启用MYSQL_OPT_RECONNECT,然后每次执行出错的时候ping一下server,我这里有部分代码:
我的MySQL安装的是5.6.13版,是源码安装。
我在程序里会把用户上网过程中的流表建一张表存入数据库,但是程序跑一段时间后就出现这个问题。
配置文件里设置 :
wait_timeout=2880000
interactive_timeout=2880000
max_allowed_packet=10M
int init_mysql()
{
char sql_str[64] = {0};
if(!MyParm.is_connect_mysql)
{
return FALSE;
}
sprintf(mysql_server, "%s", inet_htoa(gn_htonl(MyParm.mysql_servIp)));
mysql = mysql_init(NULL);
if(mysql == NULL)
{
printf("Error: %u: %s\n", mysql_errno(mysql), mysql_error(mysql));
return FALSE;
}
if(mysql_real_connect(mysql, mysql_server, MyParm.mysql_uname, MyParm.mysql_passwd, "test", 0, NULL, CLIENT_MULTI_STATEMENTS) == NULL)
{
printf("Error: %u: %s\n", mysql_errno(mysql), mysql_error(mysql));
return FALSE;
}
//smart6pool数据库不存在,创建
if(mysql_select_db(mysql, DATABASE))
{
sprintf(sql_str, "CREATE DATABASE %s", DATABASE);
if(mysql_query(mysql, sql_str))
{
printf("Error: %u: %s\n", mysql_errno(mysql), mysql_error(mysql));
return FALSE;
}
}
printf("\n*****connect mysql success!\n");
return TRUE;
}
这是什么原因造成的?
------解决思路----------------------
原因是长时间没有操作数据库,数据库连接自动断了。我去年也遇到过这个问题,方法是在连接数据库的时候启用MYSQL_OPT_RECONNECT,然后每次执行出错的时候ping一下server,我这里有部分代码:
int Mysql::insertRecord(std::string const &ip,
std::string const &path,
std::string const &operation,
char const *before,
char const *after)
{
/**/
if (!connected_)
return -2;
/**/
std::string path2 = _convertText(path.c_str());
std::string before2 = _convertText(before);
std::string after2 = _convertText(after);
std::string sql =
"INSERT INTO ZooOp(ip,path,operation,`before`,`after`) VALUES(";
/* 1) ip */
sql += "'"; sql += ip; sql += "'";
/* 2) path */
sql += ",'"; sql += path2; sql += "'";
/* 3) operation */
sql += ",'"; sql += operation; sql += "'";
/* 4) before */
sql += ",'"; sql += before2; sql += "'";
/* 5) after */
sql += ",'"; sql += after2; sql += "')";
return _apply(sql);
/*
printf("[%s]\n", sql.c_str());
return 0;
*/
}
int Mysql::_error_handler(std::string const &sql)
{
do {
/* 1) ping */
int ping_ret = mysql_ping(&mysql_);
if (0 == ping_ret)
break;
/* 2) reconnect */
connect();
if (connected_)
break;
return -1;
} while (0);
mysql_query(&mysql_, "set names utf8");
if (0 != mysql_query(&mysql_, sql.c_str())) {
printf("mysql: %s\n", mysql_error(&mysql_));
return -2;
}
return 0;
}
int Mysql::_apply(std::string const &sql)
{
if (0 != mysql_query(&mysql_, sql.c_str()))
return _error_handler(sql);
return 0;
}
int Mysql::connect()
{
if (connected_) {
mysql_close(&mysql_);
connected_ = false;
}
int retval;
MYSQL *conn;
conn = mysql_init(&mysql_);
if (NULL == conn)
return -1;
do {
conn = mysql_real_connect(&mysql_,
host_.c_str(), username_.c_str(), password_.c_str(),
database_.c_str(), port_, NULL, 0);
if (NULL == conn)
break;
char value = 1;
retval = mysql_options(&mysql_, MYSQL_OPT_RECONNECT, &value);
} while (0);
if (NULL == conn
------解决思路----------------------
0 != retval)
mysql_close(&mysql_);
else
connected_ = true;
mysql_query(&mysql_, "set names utf8");
return connected_ ? 0 : -2;
}
int Mysql::disconn()
{
if (connected_) {
mysql_close(&mysql_);
connected_ = false;
}
return 0;
}