最近在部署一个项目,试用了一个腾讯云的服务器,正常安装docker和mysql,构建镜像以及启动容器;后面发现只要我隔段时间不去访问项目,就会出现数据库无法查询的情况,项目查不到数据;查看数据库和项目有关的那个数据库直接消失了?!!然后mysql容器也自己停掉了?!
一直在网上寻求解决方式,以为是服务器的问题,因为之前用阿里云服务器并没有这种情况;查看服务器内存也很充足,实在找不到有什么解决方法;
好在是经过一番讨论最后是解决了。
首先去查找原先被迫停掉的mysql容器的日志:
docker logs 容器名
查到的结果是这样的:
可以大概得到的是当前正在停掉mysqld这个服务,也就是服务器在我没有执行操作的情况下自动关闭mysql;查看内存空间充足,不可能因为内存问题被迫停掉mysqld这个进程;所以是什么原因呢?
查阅了超多博客和技术网站,还问了一些大佬,费了老大的劲终于知道了原因
我们在启动mysql后,当mysql在启动状态中连续8小时没有任何外部操作,例如创建数据库,增删改查等,mysql会自己关闭掉,停掉mysql服务;
在mysql中存在两个系统变量,一个是interactive_timeout;interactive_timeout 指定了mysql在交互式客户端空闲了(也就是没有任何操作)多长时间自动关闭, 默认值是28800秒,也就是8小时;交互式客户端指的是能直接对mysql进行交互的客户端,如MySQL shell, Mysql命令行客户端;而wait_timeout指定了mysql在非交互式客户端空闲了多长时间自动关闭,默认值依旧是28800秒,8小时;非交互式客户端指的是那些通过编程方式连接到mysql的应用程序,例如JDBC,ODBC等数据库连接池;
之前项目隔段时间莫名查不到数据的根本原因在于服务器上的mysql空闲时间超过了8小时,也就是我们没有去访问项目超过了8小时,导致服务器上的mysql自动关闭了;mysql自动关闭当然就查不到数据;
如果不修改这两个参数,对于长期上线的web应用程序必然会出现数据无法查询的错误;
知道了是哪两个参数出了问题,接下来修改这两个参数的默认值即可
找到mysql的配置文件my.ini,这个文件通常在C:/ProgramData/ Mysql / Mysql Server X.Y / my.ini 下,前面的 X.Y 指的是mysql的版本号;由于ProgramData文件夹是隐藏文件,如果要访问需要在文件资源管理器中设置显示隐藏文件选项;
然后打开my.ini后在这个文件中添加mysql的属性:
interactive_timeout = 2880000
wait_timeout = 2880000
添加两行代码后,mysql无论与哪种客户端交互的空闲时间都被设置成800小时,也就是在800个小时内没人访问这个项目mysql都不会自动关闭;
找到并编辑mysql的Linux版的配置文件my.cnf :
vim /etc/my.cnf
然后在配置文件中依然添加下列两个属性:
interactive_timeout = 2880000
wait_timeout = 2880000
这两个属性的含义和windows系统相同,在此不做赘述;
修改完属性保存后,以后mysql的空闲自动关闭时长延长到800小时,基本上保证了访问项目能正常查询到数据的情况;
除非你的项目用的人实在太少,那就继续延长自动关闭的时间;
反正我直接设置成了8000小时哈哈哈(虽然也只是我自己用来做练习的项目)。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。