1. 程式人生 > >Mysql,如果幾分鐘不用,再次操作時就會很慢

Mysql,如果幾分鐘不用,再次操作時就會很慢

1 起因

用的是mysql, mysql是直接使用阿里雲伺服器, 不是內網。 如果4分鐘左右不用,再次操作時就會很慢,但只會慢這一次,接下來又正常了,如果繼續一段時間不用,再次操作時又會慢一次。

2 造成影響

  • 2.1 影響開發心情, 隔4分鐘左右, 再次操作, 用客戶端工具會卡主。
  • 2.2 影響開發效率, 資料庫連線池中所有連線都出現No operations allowed after connection closed

3 排查

  • 3.1 排查資料庫, 查詢mysql, wait_timeout:28800, 暫時排除
  • 3.2 排查程式碼, 資料庫相關的一些time設定, 網上推薦的。 暫時排除
  • 3.3 排查網路

4 重點排除網路方面

工具方面 使用是Navicat Dbeaver idea自帶的, 都有問題, 排查工具影響

4.1 防火牆方面, 已經關閉了本地和伺服器的防火牆。

4.2 檢視雙方tcp連線狀態

本地tcp是establish狀態

5分鐘後檢視伺服器tcp狀態, 我的資料庫是3303埠的, 檢視公網ip

檢視tcp狀態

總結: 如果是本地或伺服器tcp狀態是close狀態, 就能確定是哪一方出現問題

4.3 wireshark檢視

出現很多, 一般為5次, tcp retransmission, 系統預設

tcp retransmission是因為沒有收到阿里伺服器的ack確認

4.4 伺服器使用tcpdump 進行抓包

正常執行sql語句,是可以抓到包, 但是5分鐘後, 執行客戶端工具,沒監聽到任何資料。

總結: 到此得出, tcp的包中傳輸過程中丟失了, 基於對網路傳輸方面知識的匱乏, 首先只能排查是否公司網路影響, 讓組員會家裡測試, 自己也回宿舍測試了一下。 還是存在問題, 所以首先排查公司網路的問題。

4.5 暫時解決

考慮到是是本地windows環境, tcpRetransmission預設是5次, 並隨著每次重傳而增加一倍。 tcpRetransmission是為了保證資料傳輸的可靠性,但本著是自己電腦,並且是開發環境所以, 修改了次數。

開啟登錄檔 regedit
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters 右鍵新建DWORD
名稱:TcpMaxDataRetransmissions 值為:1或2

5 問題加深

過幾天,組員發覺資料連線不上, 作為組長, 我必須要解決這個問題。 首先我用其他阿里雲伺服器登陸mysql, 發現登陸正常。 其次我跑的其他小組, 讓他們用電腦試一下, 居然是可以的。 本來想試著mysql, 但是怕重啟就可以了, 重現不了場景。 所以再一次進行排查。 折騰了很久, 最後修改了埠3303, 才能正常連線上。 由於公司有多臺阿里雲, 並且部署在上面的mysql, 在那段時間內, 都連線不上,然後其他組又可以連線的上, 所以認為是公司網路的原因, 但由於折騰了幾個小時, 又能連線的上了, 所以打算下次重現聯絡公司閘道器協助排查。

6 最終解決-Redis又出么蛾子

過幾天Redis又突然連線不上了, 本著是突然連線不上, 然後其他小組又能正常連線。 聯絡公司綜合部, 讓綜合部去找人看看網路,但由於閘道器有事, 暫時來不了, 只能暫時自己折騰。 突然想到, 上次所有部署在阿里上的資料庫, 都不能連線, 只有一個部署在騰訊雲的伺服器可以連線, 會不會是阿里雲限制了, 所以立刻登陸阿里雲, 將本地公網ip加入白名單。 突然就能連上了。

7 總結

將ip加入白名單, 之前資料庫幾分鐘不執行語句就斷開的問題也解決了。 世界都清淨了。 折騰這麼久的問題也解決了。 happy ending 但是還是與疑惑, 首先隔壁小組都是用一樣的網路, 公網ip也是一樣的, 為什麼他們就可以連線。 這是我有疑惑的, 難道是對我們mac地址做了記錄限制了嗎, 其次阿里雲對我們的限制, 為什麼沒有想關的通告。 導致了花費