項目上線突發的一個超級大坑,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 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 的官方手冊: 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 我才知道,他是爲了省事,直接安裝的下面這個軟件;所以還是有風險的,還是用官方的安裝比較穩!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章