- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章解决MySQL server has gone away错误的解决方案由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
PHP中MySQL server has gone away问题 。
。
之前在Codeigniter里面写过类似console命令行的脚本. 脚本里存在sleep语句时间比较久, 导致出现一个现象就是sleep之前的SQL都是操作成功的,但是sleep之后,再执行SQL操作竟然报错: MySQL server has gone away. 也就是mysql的这个连接失效. 后来分析才知道, MySQL中存在2个重要的配置参数
interactive_timeout wait_timeout 。
这2个参数的单位都是秒(s). 默认是8小时(28800). interactive_timeout从单词上看指的是交互超时时间. mysql的连接方式一般分为2种, 一种称之为"交互式", 一种称为"非交互式". 一般常见的使用mysql -u root xxx之类的或者主从复制的连接为"交互式连接", 使用如Java的JDBC、PHP的PDO驱动连接的方式一般是"非交互式连接". 然而interactive_timeout如果未修改的情况下,这个值是一直不会变的,但是wait_timeout在不同连接方式下,值是不一样的. 。
wait_timeout在"交互式连接"下, 其值是interactive_timeout的值. 如果在"非交互式连接"情况下, 则wait_timeout的值是原来mysql.cnf中配置的原始值. 。
最终起作用的只是wait_timeout的值.这配置项限定了处于sleep状态(通过 show processlist查看当前连接数情况)的连接,如果这个连接sleep休眠时间超过wait_timeout的值,则这个连接被断掉或者说被清理掉. 。
。
1.首先查看mysql.conf配置 。
首先我们配置了interactive_timeout=10 wait_timeout=5, 此时通过mysql客户端(交互式连接)查看这2个配置项的值: show variables like ‘%timeout%',
2.交互式连接 。
客户端的结果: wait_timeout竟然不是我们msyql.conf配置的10s, 而是 5s. 。
那我们再来看看PHP连接MySQL(非交互式连接),执行相同的语句,得到什么结构
3.非交互式连接 。
此时wait_timeout是我们原来在mysql.cnf配置的值了. 。
综上所述: wait_timeout这个值,在不同的"连接模式"下面,拿到的值是不一样的. 。
。
结合上面的情况,我们就知道了。 一开始某些SQL执行成功,但是后面的SQL执行失败报错gone away,大部分原因就是这个连接被闲置超过了wait_timeout,mysql服务器单方面断掉了这个连接。但是客户端代码,还是在用这个连接变量,以为连接还是ok的(其实mysql server端已经断开了,只是我们以为这个连接还有效),去执行SQL必然报错. 。
那么我们怎么解决这个情况呢?
1.可以适当调整wait_timeout的值, 调大一点,这样不容易触发这个gone away情况.但是弊端就是,sleep的长连接不被清理,资源白白浪费了. 。
2.通过try-cach如果抛出gone way msyql的连接问题, 先把之前的db调用close().在重新获取db连接open,然后再执行之前的代码. 不过代码看起来感觉很蛋疼.伪代码
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$db
= db();
try
{
fun1
$db
);
// 一开始执行成功
sleep(3600*10)
// 假设sleep了10个小时
fun2(
$db
);
// 10小时之后 由于连接已经被mysql干掉 导致报错 gone away
}
catch
(Exception
$e
) {
// 报错后 我们把无效的连接close 在 open新的连接
$db
->close();
$db
->open();
// 再拿到新的连接执行
// fun2($db)
}
|
3.如果是使用类似swoole或者easyswoole框架, 建议使用mysql pool连接池的形式.并且一般连接池都有关于心跳检查ping、连接存活检测间隔时间设置、最大闲置连接数等等设置, 只要配置一次就好了。 例如可以配置测活连接间隔时间短一点,来保证连接不会被msyql服务器干掉.例如 easyswoole配置
例如之前我设置wait_timeout=10, 但是如果我没修改这个easyswoole的mysql连接池测活间隔时间变小, 同样会出现gone way的情况. 第一次访问接口成功返回SQL执行结果,但是超过10s以后我再次访问接口,报错mysql has gone away。修改setIntervalCheckTime()之后,就不会出现这个问题了. 我们通过mysql的show processlist;查看连接数情况
这些都是easyswoole帮我们维护的连接数. 当sleep超过3秒时, 由于检查时间是3秒存活, 连接池帮我们保活检查, sleep的时间又从0开始计算. 。
。
进入MySQL 。
cmd 。
mysql -u用户名 -p密码 。
在我们使用mysql导入大文件sql时可能会报MySQL server has gone away错误,该问题是max_allowed_packet配置的默认值设置太小,只需要相应调大该项的值之后再次导入便能成功。该项的作用是限制mysql服务端接收到的包的大小,因此如果导入的文件过大则可能会超过该项设置的值从而导致导入不成功!下面我们来看一下如何查看以及设置该项的值.
查看 max_allowed_packet 的值 。
show global variables like 'max_allowed_packet'; +--------------------+---------+ | Variable_name | Value | +--------------------+---------+ | max_allowed_packet | 4194304 | +--------------------+---------+ 。
可以看到默认情况下该项的大小只有4M,接下来将该值设置成150M(1024*1024*150) 。
set global max_allowed_packet=157286400,
此时再查看大小 。
show global variables like 'max_allowed_packet',
通过调大该值,一般来说再次导入数据量大的sql应该就能成功了,如果任然报错,则继续再调大一些就行,请注意通过在命令行中进行设置只对当前有效,重启mysql服务之后则恢复默认值,但可以通过修改配置文件(可以在配置文件my.cnf中添加max_allowed_packet=150M即可)来达到永久有效的目的,可其实我们并不是经常有这种大量数据的导入操作,所以个人觉得通过命令行使得当前配置生效即可,没有必要修改配置文件.
以上就是本次介绍的全部相关知识点内容,希望我整理的内容能够帮助到你.
原文链接:https://www.cnblogs.com/smile502/p/12329578.html 。
最后此篇关于解决MySQL server has gone away错误的解决方案的文章就讲到这里了,如果你想了解更多关于解决MySQL server has gone away错误的解决方案的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用一个 API,不幸的是,调用 get 属性访问器会产生副作用。我如何确保: public void Foo() { var x = obj.TheProp; // is it guarn
我正在 Canvas 上创建一个简单的粒子实验。现在我希望它们在 Canvas 上“逃离”鼠标光标。检测与鼠标的距离不是问题,但如何编码它们的行为? 每个粒子的创建如下: var partic
我正在尝试将 Laravel 4 应用程序的一部分移植到 Lumen,但我无法找出 Laravel 4 的 Redirect::away(...); 函数的等价物流明。 我试过保持不变,但行不通。我也
在 Unity 场景中,想象一下 一个大的滑动物体(可能是“容器”或“沙发”出于某种原因滑动) 途中有数根2m高的轻质木棍轻轻插在地上。 在现实生活中,棍子会站在那里(首先,这在 PhysX 中实际上
我正在尝试将 Laravel 4 应用程序的一部分移植到 Lumen,但我无法找出 Laravel 4 的 Redirect::away(...); 函数的等价物流明。 我试过保持不变,但行不通。我也
我有一个表格 View 单元格,里面有一个 uilabel ,它获取两点之间的距离(用户当前位置和我选择的另一个点)。问题是,当我更改数据库中的点并重新加载表格 View 时,每个单元格中的英里数都会
我有一个我想要的按钮 .animate-show.ng-hide-add, .animate-show.ng-hide-remove {
在我的网站上,我制作了 坚持到顶部,但是当我向下滚动时它只停留几秒钟/像素,然后它被滚动离开,请参阅下面的代码片段并向下滚动。我想要 nav向下滚动时随时停留在顶部, 除外可见。 HTML
我有一个包含大量繁重任务的项目,这些任务基本上正在构建一个功能齐全的 Assets 管道(转换、源映射、缩小、md5 文件名愿景)。大多数任务都是我在 github 上找到的开源任务,但也有一些任务是
我有一个 winform usercontrol,其中包含多个项目(文本框、按钮...)。现在我遇到了现象,尽管在控件设计器文件中(设计器.cs) 文本框、按钮...仍然被定义。也没有编译错误。当
我不断收到以下错误 Error: "Window navigated away" 并且我不知道如何阻止此错误的发生,当它确实发生时它也阻止我离开我当前的网页开始了我对 Jquery 和 Javascr
我正在寻找如何实现这个场景:我有函数内部的逻辑代码,现在我希望能够在单独的线程中执行此功能。现在我拥有的是这个 .. 的原始实现我简单地初始化线程,在它的启动/运行方法中我保留了函数逻辑。我怎样才能让
我正在尝试从 Windows 10 64 位启动 xampp v3.2.4。我收到图像 error page while connecting mysql 中显示的错误 xampp log 我从sql
我在用 php 编写的导入脚本中遇到“mysql 服务器已消失” 这http://dev.mysql.com/doc/refman/5.0/en/gone-away.html页面列出了可能的原因。但是
因此,当我使用无法解决的 PHP PDO 运行脚本时,我遇到了这个问题。我的脚本正在索引来自不同服务器上不同数据库的信息(主要是选择查询)。 当我开发脚本时,所有数据库都在同一台服务器上,一切都运行良
我知道有很多关于 MySQL 的“Server has gone away”错误的话题,但这个似乎是随机发生的,而且是在不利的情况下发生的。 我正在使用 CodeIgniter 3.0。在我所做的研究
假设我有: [obj for (_, obj) in stack] 此代码假定 stack 中的第一个对象是一个元组,并丢弃元组的第一部分。 如果代码不是元组而是单个对象会怎样? 它是否只忽略被丢弃的
我正在尝试编写代码,当用户将鼠标悬停在按钮上时,它会继续移动按钮(因此它永远不会被实际点击) 我正在使用“style.left”来确定新的按钮位置 这是我编写的函数,它不能像我希望的那样工作: doc
因此,在滚动时隐藏导航栏很容易,只需添加一个带有“top: -50px”的类即可。但是,感觉不是很自然。如果导航栏通过实际滚动隐藏起来,这样滚动的速度总是合适的,那就更好了。我不想将其动画化,而是想将
我习惯于结合使用连接和“IS NULL”来删除行,比如 this 示例: A 有第 1 类数字 1。B 有第 2 类数字 2,但也有第 1 类数字 1。 查询: SELECT people.name,
我是一名优秀的程序员,十分优秀!