删除表格出现:MySQL server has gone away 如何解决!!!

bandaoyu 2014-06-14 12:00:47
程序启动之后,连接数mysql服务器,选择数据库,建立表格。

然后在程序某个地方要删除一个表格(DROP TABLE IF EXISTS table_name).。 问题就在此时出现了,删除失败,返回error 2006 MySQL server has gone away ;


((应该上mysql的问题--可能是设置或者上版本的问题? 因为我连上另外一台主机上的mysql 就没有问题))

网上查了资料,涉及到的原因可能如下:(括号部分是对我情况的分析)

产生这个问题的原因可能有以下几种情况:

1:服务器关闭连接后,试图向服务器发送查询,这表明必须修改应用逻辑错误;
(这个应该不可能,因为我的服务器并没有关闭)

2:客户端应用运行不同主机,连接至MySQL的主机没有必要的权限;
(这个不会,我登录的用户,除了GRANT功能之外,其他的操作的权限都是具备的,而且我也用具备所有权限的root登录过,同样出现这样的问题)

3:客户端TCP/IP连接超时,这可能是使用了MySQL选项引起的,这种情况增加超时时间可以帮助解决问题;
(这个应该不是,因为我的程序启动起来从连接数据库到执行删除 那个表格的操作 间隔时间不到2分钟中,但是我的wait_timeout 设置的是28800)

4:服务器端连接超时和客户端自动重连被关闭;
( 同上,超时应该不是。客户端自动重连 没有这样的操作)

5:这种情况的解决方案就是用mysql_ping()连接确认自上次以来是否有长时间查询(MyODBC原理),或者设置wait_timeout参数为很高的值,使连接不可能超时;
(刚才已经说了,从连接数据库到操作删除,不到2分钟,所有不会超时。但是我还是重新设置了一下wait_timeout 使其增大10倍,奇怪的事情发生了,MySQL server has gone away 不发生了,但是接下来的建表操作出现了这个错误:

2012-12-25 11:24 MySQL ERROR:1005 Can't create table (erron:121)

很奇怪,我建表的时候并没有用到外键,怎么会出现这个问题呢? 当然我建表的方式是这样的:

CREATE TABLE table_name SELECT FROM table_name2…… 也就是创建的表的结构和内容是从别的表复制过来的部分记录




请问这是什么原因呢??



继续下一部分的排查:

6:向服务器发送不正确或者太大的查询也会导致这种错误。如果mysqld收到的包太大或者无序,它就认为客户端发生错误而断开连接,如果需要大查询,可以修改max_allowed_packet变量,该变量默认值是1M,在客户端也需要设置最大包的大小;

(这个不可能,因为向别的主机上的mysql操作没有问题,所有不正确查询和无序包可以排除。max_allowed_packet的大小,我改大10倍,结果是:

7:INSERT or REPLACE语句插入大量的行也会引起这种错误,这些语句不考虑插入的行数而发送单一的请求至服务器,因此减少插入的行数可以避免经常发生这种错误;

(我是采用 CREATE TABLE xxxx SELECT * FROM tablexxx ,也就是建表之后,数据之间拷贝另外一张表上的内容,这种算: INSERT or REPLACE语句插入大量的行吗?)

8:如果解析主机名失败也可能看到这种错误,这是因为MySQL依赖于主机系统解析主机名,但无法知道它是否有效,以MySQL观点来看,在任何网络超时中这种情况都是不易察觉的;

(这个情况我不了解上什么情况,但是我认为我的问题不是这个原因)

9:如果应用产生子进程,所有子进程都试图使用同样的连接至MySQL服务器,也同样会出现这种错误,可以把不同的子进程用不同的连接来避免这种问题;
(目前数据库操作都是同一个进程,没有另外的进程操作数据库,所有不是)
10:可以检查mysql服务是否已经死掉,执行重启和检查服务器启动时间。如果客户端连接中断是因为mysqld崩溃和重启,可以集中查找Ping Mysql服务,如果没有连接则重新连接崩溃的原因;

(没有死掉,因为我用电脑上的客户端连接它,还是好好的)

http://haili.me/archives/561.html




请高手出招吧!!!请版主救命~~~
...全文
141 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
bandaoyu 2014-06-19
  • 打赏
  • 举报
回复
引用 2 楼 rucypli 的回复:
看一下mysql的错误日志
日志里面的就是这个的吧:2012-12-25 11:24 MySQL ERROR:1005 Can't create table (erron:121)
rucypli 2014-06-16
  • 打赏
  • 举报
回复
看一下mysql的错误日志
bandaoyu 2014-06-14
  • 打赏
  • 举报
回复
剩下的下面的可能原因我稍后会接着尝试:: 6:向服务器发送不正确或者太大的查询也会导致这种错误。如果mysqld收到的包太大或者无序,它就认为客户端发生错误而断开连接,如果需要大查询,可以修改max_allowed_packet变量,该变量默认值是1M,在客户端也需要设置最大包的大小; 7:INSERT or REPLACE语句插入大量的行也会引起这种错误,这些语句不考虑插入的行数而发送单一的请求至服务器,因此减少插入的行数可以避免经常发生这种错误; 8:如果解析主机名失败也可能看到这种错误,这是因为MySQL依赖于主机系统解析主机名,但无法知道它是否有效,以MySQL观点来看,在任何网络超时中这种情况都是不易察觉的; 9:如果应用产生子进程,所有子进程都试图使用同样的连接至MySQL服务器,也同样会出现这种错误,可以把不同的子进程用不同的连接来避免这种问题; 10:可以检查mysql服务是否已经死掉,执行重启和检查服务器启动时间。如果客户端连接中断是因为mysqld崩溃和重启,可以集中查找Ping Mysql服务,如果没有连接则重新连接崩溃的原因; http://haili.me/archives/561.html

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧