龙空技术网

项目上线突发的一个超级大坑,MySQL导致项目无法正常访问

Java技术那些事 436

前言:

此刻你们对“服务器 mysql 服务正常 客户端 无法访问”大体比较关心,各位老铁们都想要剖析一些“服务器 mysql 服务正常 客户端 无法访问”的相关知识。那么小编也在网络上网罗了一些有关“服务器 mysql 服务正常 客户端 无法访问””的相关知识,希望咱们能喜欢,你们一起来了解一下吧!

经历 4 天 4 夜解决 10 月 1 项目上线遇到的一个 Mysql 大坑, 导致项目无法正常访问

标题是不是惊讶到你了,但是确实是一个大坑,特此记录下来,方便他人查阅。 标题虽然夸张了,但是问题确实真真实实的。

由于工作室的几个团队需要发布项目,参加比赛。

正好都挤在了最后 2 天,时间也比较紧张。

由于学弟学妹们对项目在服务器上的部署过程并不是太熟悉,又恰巧我对这方面还略知一二,还因为我有一台比学生机配置稍微高一点的阿里云服务器(几年前阿里云搞活动花了我好几千买的几年的,心痛啊)。

他们都需要提交作品的 url,和演示 PPT、演示视频等材料。

url 是必须要写在 PPT 里的,所以他们就比较着急呀,我的服务器是 Linux 的,我玩的可能比较 6,但是学弟学妹们可能就不太行了。

但是我当时也没办法帮他们部署到服务器,因为我当时还在上班。我就把 Linux 服务器的磁盘给初始化调,然后给他们安装了一个 windows 2008 R2 的服务器。

并且指出来了一个很好的部署方法:

配置的和开发环境一样就行了,直接启动 idea。

这种虽然不是正规的部署方法,但是对于他们是很有效的。

三个项目:

服务器也给他们临时升级了下内存和带宽还有存储:

但是项目每过一段时间就会出现问题,错误如下:

报错的代码提示:

### Cause: java.sql.SQLException: Could not retrieve transation read-only status server; SQL []; Could not retrieve transation read-only status server; nested exception is java.sql.SQLException: Could not retrieve transation read-only status server] with root causejava.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.

网上说配置文件的问题,也有的说是连接 mysql 的时候有问题,各方面都有,综合所述排查起来非常的困难。

代码在本地跑起来是没问题的,在线上就有问题了。

那只能是服务器的问题了。

就这样断断续续的尝试了 4 天 4 夜,,这 4 天 4 夜是在有时间的情况下,哈哈,并不是从天亮到天黑的那种。

网上所说的解决办法都不起作用。

只好亲自手动去一点一点排查了。

1、检查了配置文件,没问题; 2、检查 Mysql 的配置文件。

发现 Mysql 的连接的超时时间和本地的 Mysql 的超时时间是不一致的。只有短短的 120 秒,所以这个地方是存在问题的,无疑了。

可以通过下方这个命令进行查看关于时间的配置信息:

show variables like '%timeout%'

修改配置文件呗;把相关的这两条修改一下。

可以通过 set 命令来暂时修改:

set wait_timeout= 86400;set interactive_timeout= 86400;复制代码

查看是否修改成功:

但是如果重启的话,就会恢复过来默认的。

那么就需要修改配置文件了:

[mysqld]...省略其他的interactive_timeout=86400wait_timeout=86400...省略其他的

修改之后需要重新启动 Mysql 服务。

就是永久的了。

至此问题解决了。

可以打开 Mysql 的官方手册: dev.mysql.com/doc/refman/…

然后找到 Mysql 的系统变量说明:

然后搜索一下,你需要查看的变量:

wait_timeout

官方解释:

The number of seconds the server waits for activity on a noninteractive connection before closing it.

On thread startup, the session wait_timeout value is initialized from the global wait_timeout value or from the global interactive_timeout value, depending on the type of client (as defined by the CLIENT_INTERACTIVE connect option to mysql_real_connect()). See also interactive_timeout.

服务器关闭交互式连接前等待活动的秒数。

交互式客户端定义为在 mysql_real_connect() 中使用 CLIENT_INTERACTIVE 选项的客户端。又见 wait_timeout

interactive_timeout

官方解释:

The number of seconds the server waits for activity on an interactive connection before closing it.

An interactive client is defined as a client that uses the CLIENT_INTERACTIVE option to mysql_real_connect(). See also wait_timeout.

服务器关闭非交互连接之前等待活动的秒数。

在线程启动时,根据全局 wait_timeout 值或全局 interactive_timeout 值初始化会话 wait_timeout 值,取决于客户端类型 (由 mysql_real_connect() 的连接选项 CLIENT_INTERACTIVE 定义),又见 interactive_timeout

其实这就很奇怪的,Mysql 的默认值是 28800,为什么我查询到的默认值是 120 呢?????

通过查看学弟安装的 Mysql 我才知道,他是为了省事,直接安装的下面这个软件;所以还是有风险的,还是用官方的安装比较稳!!!!

标签: #服务器 mysql 服务正常 客户端 无法访问