經歷4天4夜解決10月1專案上線遇到的一個Mysql大坑,導致專案無法正常訪問
- 一、問題重現
- 二、排查問題
- 三、解決問題
- 四、關于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 cause
java.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=86400
wait_timeout=86400
...省略其他的
修改之后需要重新啟動Mysql服務,
就是永久的了,
至此問題解決了,
四、關于Mysql這兩個引數的作用以及解釋
可以打開Mysql的官方手冊:
https://dev.mysql.com/doc/refman/5.7/en
然后找到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我才知道,他是為了省事,直接安裝的下面這個軟體;所以還是有風險的,還是用官方的安裝比較穩!!!!

關注我微信公眾號第一時間推送給你哦:
回復選單,更有好禮,驚喜在等著你,

快來我粉絲群:每天歡快的玩耍

CSDN認證博客專家
Linux
分布式
Java
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/163378.html
標籤:其他
