解决mysql服务器在无操作超时主动断开连接的情况_Mysql

来源:脚本之家  责任编辑:小易  

www.zgxue.com防采集请勿采集本网。

我们在使用mysql服务的时候,正常情况下,mysql的设置的timeout是8个小时(28800秒),也就是说,如果一个连接8个小时都没有操作,那么mysql会主动的断开连接,当这个连接再次尝试查询的时候就会报个”MySQL server has gone away”的误,但是有时候,由于mysql服务器那边做了一些设置,很多情况下会缩短这个连接timeout时长以保证更多的连接可用。有时候设置得比较变态,很短,30秒,这样就需要客户端这边做一些操作来保证不要让mysql主动来断开。

为了保证MySQL服务器知道到哪里查找my.ini文件,和下面内容类似的参数将会被作为服务安装的一部分 传递给MySQL服务器:-defaults-file=\"C:\\Program Files\\MySQL\\MySQL Server 5.5\\my.ini C:\\Program Files

查看mysql的timeout

你需要在你的jsp项目中找到配置数据库的文件他后面说的是挂到自己机器上,是指你需要自己安装个数据库 简单的说,你需要做两步,1在自己电脑上安装mysql,2把jsp项目中的数据库配置改成你自己本地的mysql

使用客户端工具或者Mysql命令行工具输入show global variables like '%timeout%';就会显示与timeout相关的属性,这里我用docker模拟了一个测试环境。

phpmyadmin登陆后看下哪个表损坏了修复下

mysql> show variables like '%timeout%'; +-----------------------------+----------+| Variable_name | Value |+-----------------------------+----------+| connect_timeout | 10 || delayed_insert_timeout | 300 || have_statement_timeout | YES || innodb_flush_log_at_timeout | 1 || innodb_lock_wait_timeout | 50 || innodb_rollback_on_timeout | OFF || interactive_timeout | 30 || lock_wait_timeout | 31536000 || net_read_timeout | 30 || net_write_timeout | 60 || rpl_stop_slave_timeout | 31536000 || slave_net_timeout | 60 || wait_timeout | 30 |+-----------------------------+----------+13 rows in set

interactive_timeout 这个是客户端和服务器端握手的超时时间,如果你执行一个大操作的话,握手的时间就要长一点。太久也不好,有时会出现死循环的操作,握手就会一直握下去,直到系统资源耗完。参数默认值

wait_timeout:服务器关闭非交互连接之前等待活动的秒数,就是你在你的项目中进行程序调用

MySQL提供跳过访问控制的命令行参数,通过在命令行以此命令启动MySQL服务器: safe_mysqld-skip-grant-tables& 即可跳过MySQL的访问控制,任何人都可以在控制台以管理员的身份进入MySQL数据库。需要注意的

interactive_timeout: 服务器关闭交互式连接前等待活动的秒数,就是你在你的本机上打开mysql的客户端,cmd的那种

使用pymysql进行查询

我在数据库里随便创建了一个表,插入两条数据

mysql> select * from person;+----+------+-----+| id | name | age |+----+------+-----+| 1 | yang | 18 || 2 | fan | 16 |+----+------+-----+2 rows in set

我使用pymysql这个库对其进行查询操作,很简单

#coding:utf-8import pymysqldef mytest(): connection = pymysql.connect( host='localhost', port=3306, user='root', password='123456', db='mytest', charset='utf8') cursor = connection.cursor() cursor.execute("select * from person") data = cursor.fetchall() cursor.close() for i in data: print(i) cursor.close() connection.close()if __name__ == '__main__': mytest()

可以正确的得到结果

(1, 'yang', 18)

(2, 'fan', 16)

连接超时以后的查询

上面可以正常得到结果是由于当创建好一个链接以后,就立刻进行了查询,此时还没有超过它的超时时间,如果我sleep一段时间,看看什么效果。

#coding:utf-8import pymysqlimport timedef mytest(): connection = pymysql.connect( host='localhost', port=3306, user='root', password='123456', db='mytest', charset='utf8') cursor = connection.cursor() cursor.execute("select * from person") data = cursor.fetchall() for i in data: print(i) cursor.close() time.sleep(31) cursor = connection.cursor() cursor.execute("select * from person") data2 = cursor.fetchall() for i in data2: print(i) cursor.close() connection.close()if __name__ == '__main__': mytest()

这里进行了两次查询,因为我把mysql的wait_timeout设置了30秒,所以我在第一次查询之后停了31秒,目的让mysql服务主动的和我刚才创建的连接断开,得到的结果是

(1, 'yang', 18)(2, 'fan', 16)Traceback (most recent call last): File "F:/python/python3Test/mysqltest.py", line 29, in <module> mytest() File "F:/python/python3Test/mysqltest.py", line 22, in mytest cursor.execute("select * from person") ... ... File "C:\Python35\lib\site-packages\pymysql\connections.py", line 702, in _read_bytes CR.CR_SERVER_LOST, "Lost connection to MySQL server during query")pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query')Process finished with exit code 1

可以看到在停了31秒钟以后,再次使用该连接进行查询将抛出2013, 'Lost connection to MySQL server during query'错误。

解决办法

解决的方法有两种,既然这里的超时是由于在规定时间内没有任何操作导致mysql主动的将链接关闭,pymysql的connection对象有一个ping()方法,可以检查连接是否有效,在每次执行查询操作之前先执行一下ping()方法,该方法默认的有个reconnect参数,默认是True,如果失去连接了会重连。

#coding:utf-8import pymysqlimport timedef mytest(): connection = pymysql.connect( host='localhost', port=3306, user='root', password='123456', db='mytest', charset='utf8') connection.ping() cursor = connection.cursor() cursor.execute("select * from person") data = cursor.fetchall() for i in data: print(i) cursor.close() time.sleep(31) connection.ping() cursor = connection.cursor() cursor.execute("select * from person") data2 = cursor.fetchall() for i in data2: print(i) cursor.close() connection.close()if __name__ == '__main__': mytest()

我曾尝试使用另外一个线程不停来执行ping()操作,但是当我这样做以后连接就会丢失,之后的操作就不能进行了。这个问题我再研究研究。

#coding:utf-8import pymysqlimport timeimport threadingimport tracebackdef ping(conn): while True: try: conn.ping() except: print(traceback.format_exc()) finally: time.sleep(1)def mytest(): connection = pymysql.connect( host='localhost', port=3306, user='root', password='123456', db='mytest', charset='utf8') cursor = connection.cursor() # 放在此处不行,必须等待cursor的一个execute之后再运行才可以 # th = threading.Thread(target=ping, args=(connection,)) # th.setDaemon(True) # th.start() cursor.execute("select * from person") data = cursor.fetchall() for i in data: print(i) cursor.close() # 线程放在此处启动可以 th = threading.Thread(target=ping, args=(connection,)) th.setDaemon(True) th.start() time.sleep(31) cursor = connection.cursor() cursor.execute("select * from person") data2 = cursor.fetchall() for i in data2: print(i) cursor.close() connection.close()if __name__ == '__main__': mytest()

还有一种方法是使用连接池,连接池中保持着指定数量的可用连接,每次重新获取一个有效的连接进行查询操作,pymysql本身不具有连接池功能,需要借住DBUtils

#coding:utf-8import pymysqlimport timefrom DBUtils.PooledDB import PooledDB, SharedDBConnectiondef mytest(): pool = PooledDB( creator=pymysql, # 初始化时,连接池至少创建的空闲连接,0表示不创建 maxconnections=3, # 连接池中空闲的最多连接数,0和None表示没有限制 mincached=2, # 连接池中最多共享的连接数量,0和None表示全部共享(其实没什么卵用) maxcached=5, maxshared=3, host='localhost', port=3306, user='root', password='123456', db='mytest', charset='utf8' ) connection = pool.connection() cursor = connection.cursor() cursor.execute("select * from person") data = cursor.fetchall() for i in data: print(i) time.sleep(40) cursor.execute("select * from person") data2 = cursor.fetchall() for i in data2: print(i) cursor.close() connection.close()if __name__ == '__main__': mytest()

这种方式虽然可以正确的获取结果,但是实际的项目中并不会这么使用,而是在执行完查询语句以后要将connection关闭,注意这里的关闭并不是真正的关闭,而只是将连接返回给连接池让其它人使用.

#coding:utf-8import pymysqlimport timefrom DBUtils.PooledDB import PooledDB, SharedDBConnectiondef mytest(): pool = PooledDB( creator=pymysql, maxconnections=3, # 初始化时,连接池至少创建的空闲连接,0表示不创建 mincached=2, # 连接池中空闲的最多连接数,0和None表示没有限制 maxcached=5, # 连接池中最多共享的连接数量,0和None表示全部共享(其实没什么卵用) maxshared=3, host='localhost', port=3306, user='root', password='123456', db='mytest', charset='utf8' ) connection = pool.connection() cursor = connection.cursor() cursor.execute("select * from person") data = cursor.fetchall() for i in data: print(i) cursor.close() # 关闭连接,其实并没有真正关闭,只是将连接返回给连接池 connection.close() time.sleep(40) connection = pool.connection() cursor = connection.cursor() cursor.execute("select * from person") data2 = cursor.fetchall() for i in data2: print(i) cursor.close() connection.close()if __name__ == '__main__': mytest()

以上这篇解决mysql服务器在无操作超时主动断开连接的情况就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持真格学网。

服务器mysql数据库老自动2113停止是因5261为在设置时出现了问题,解决4102方法为:1、首先登陆1653服务器。2、登陆MySQL数据库;命令如下:mysql -u root -p pwd。3、查询MySQL数据库是否允许远程ip访问。4、开启远程访问操作。命令如下:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '111qqqpwd' WITH GRANT OPTION;FLUSH PRIVILEGES。5、打开navicate客户端,新建mysql链接。6、输入远程MySQL数据库链接信息,点击测试链接。数据库链接成功。注意事项:MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库,分析原因一:Mysql的自动备份2113功能可能5261导致数据库在备份的时候先4102关闭服务,而在此启动的1653时候服务器不响应,开始-运行-services.msc,打开windows服务找到mysql的服务并双击,点击恢复选项卡,第一次失败:默认是“不操作”,改成”重新启动服务”。在下方的“重新启动服务:分钟后”添上“0”表示如果服务意外终止则立即重启动。点击确定使设置生效。这时候你在任务管理器里结束mysql-nt进程,会发现结束不掉,不过要注意,这样mysql.exe是停不了的,如果要停必须把刚才修改的改回来.)分析原因二,可能是mysql连接问题修改mysql的最大连接数, 使用内存变量修改法修改mysql的最大连接数步骤如下(同时适用windows和linux平台):a、客户端登录mysql,输入用户名和密码’b、在mysql命令提示符下设置新的最大连接数为500:mysql> set global max_connections=500c、显示当前运行的query:mysql> show processlistd、显示当前mysql 系统参数状态:mysql> show status# k;e、退出客户端:mysql> exit’查看当前最大连接数只需要通过在mysqladmin所在目录下执行以下命令:mysqladmin -username -password variables |find “max_con” 即可看到。也可以使用php教程myadmin里头的mysql参数列表查看最大连接数。缺点:重启计算机或者mysql后最大连接数又会复位成初始值,需要重新设定。2、修改my.ini或my.cnf文件法(需要重启mysql),可参考同目录下mysql的配置模板(小内存、大内存、超大内存). e  windows系统下打开my.ini文件找到set-variable =max_connections=100这一行,改成需要设定的最大连接数,然后重启即可。linux控制台下:1、打开my.cnf文件:vi /etc/my.cnf2 在[mysqld]段下修改max_connections的值为设定值。注意:可能大家安装的mysql来源和版本不同(windows下mysql+iis和php+apache+mysql套件最终安装结果几乎都不相同),my.ini文件的路径可能有些不同,my.ini可能还会保留一份在c:windows目录下需要同时修改本回答被网友采纳,这个要看具体错误日志才知道哟内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • mysql服务器连接,断开及cmd使用操作
  • 完美解决mysql通过localhost无法连接数据库的问题
  • mysql 查询速度慢与性能差的原因与解决方法
  • python mysql断开重连的实现方法
  • mysql中判断记录是否存在方法比较
  • 微信公众平台开发 数据库操作
  • linux下安装mysql多实例作为数据备份服务器实现多主到一从多实例
  • mysql的sql语句特殊处理语句总结(必看)
  • mysql 5.7.21解压版安装配置方法图文教程(win10)
  • 批量清除128组节点db上面过期的binlog释放磁盘空间实现思路
  • mysql event scheduler: failed to open table mysql.event
  • 使用mysqldump实现mysql备份
  • innodb系统表空间维护方法
  • mac 装5.6版本mysql 设置密码的简易方法
  • 服务器mysql数据库老自动停止,请问怎么回事
  • 云MySQL和云服务器上装MySQL的区别
  • Can not connect to MySQL server详细解决方法
  • 为什么提示我“请在WEB服务器上操作!”?怎么解决啊?
  • mysql-server安装失败
  • 怎样把写好的一个数据库挂到自己机器的服务器的MySQL上?
  • MySQL 服务器CPU负载超高,怎么分析
  • 如何彻底解决 mysql server has gone away
  • MySql登陆密码忘记了 怎么办?
  • MySQL 列别名 无法操作,请问如何解决
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页mysql服务器连接,断开及cmd使用操作完美解决mysql通过localhost无法连接数据库的问题mysql 查询速度慢与性能差的原因与解决方法python mysql断开重连的实现方法mysql中判断记录是否存在方法比较微信公众平台开发 数据库操作linux下安装mysql多实例作为数据备份服务器实现多主到一从多实例mysql的sql语句特殊处理语句总结(必看)mysql 5.7.21解压版安装配置方法图文教程(win10)批量清除128组节点db上面过期的binlog释放磁盘空间实现思路mysql event scheduler: failed to open table mysql.event使用mysqldump实现mysql备份innodb系统表空间维护方法mac 装5.6版本mysql 设置密码的简易方法mysql安装图解 mysql图文安装教程can""""t connect to mysql servwindows下mysql5.6版本安装及配置mysql字符串截取函数substring的mysql创建用户与授权方法mysql提示:the server quit withmysql日期数据类型、时间类型使用mysql——修改root密码的4种方法mysql update语句的用法详解mysql 的case when 语句使用说明mysql中general_log日志知识点介绍mysql自连接查询实例详解mysql中insert语句的使用与优化教程关于mysql基础知识的介绍mac下修改mysql默认字符集为utf8的方法mysql存储emoji表情报错的处理方法【更改linux下安装mysql-5.6.4 的图文教程mysql修改数据库编码为utf8避免造成乱码问mysql如何使用授权命令grantmysql 5.7.22 二进制包安装及免安装版win
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved