紙上得來終覺淺,絕知此事多宕機...記錄一下自己很蠢的一次故障處理過程。
上周的時候,一個剛上線的系統又開始反映登不上了,因為最近這個系統也老是出現這個問題,開發也一直在找問題中,所以也沒太在意。于是登上操作系統,mysql -uroot -p登錄數據庫,然后就一直沒反應,登不上...
交代一下,mysql是裝在mysql用戶下的,裝的時候雖然對數據庫參數有進行調優,但是操作系統層面沒做調整,所以mysql用戶的最大文件打開數限制為默認的1024,用ulimit -n可以查詢。然后我在用mysql的root賬號登錄數據庫的時候也是在mysql這個系統用戶下登錄的,然后看了下當時服務器的負載,cpu和內存這些都很正常,但是存在大量應用到數據庫的連接。

到這兒問題應該就很清楚了,系統用戶mysql文件打開數可能達到了最大限制,當然不能打開更多的連接。
然而當時我并沒有想到這一點,我想到的不是換個系統用戶登錄,不是停掉應用,而是重啟數據庫。。。而且這個數據庫跑的不只這一個業務,雖然也都不是什么重要的業務。。。
于是我就準備重啟數據庫,仍然是在mysql用戶下執行mysqladmin -uroot -p shutdown。毫無疑問,這肯定也是沒有反應的,道理跟前面root賬號連不上數據庫是一樣的,ctrl+C后有以下報錯
^Cmysqladmin: connect to server at 'localhost' failed
error: 'Lost connection to MySQL server at 'waiting for initial communication packet', system error: 4'
然后我就做了個更蠢的操作,雖然想著可能會丟數據,殺掉了mysql進程。。。然后重啟mysql,系統也就可用了。是真的很蠢,做完之后馬上就想起有多種更好的處理方法,卻選擇了最蠢的一種。
今天再登上數據庫看的時候,發現有幾個參數跟我配置文件里寫的不一樣,比如max_connections、table_open_cache等,都是設置的默認值,看了下上次啟動日志,確實也有告警
2019-03-15T08:14:03.038750Z 0 [Warning] Changed limits: max_open_files: 1024 (requested 12010)
2019-03-15T08:14:03.038911Z 0 [Warning] Changed limits: max_connections: 214 (requested 2000)
2019-03-15T08:14:03.038916Z 0 [Warning] Changed limits: table_open_cache: 400 (requested 5000)
很明顯,mysql根據參數設置計算了實例需要打開的最大文件數超過了當前系統用戶的最大限制,于是沒有使用該參數而使用了默認值。當然啟動起來數據庫也是可用的,啟起來后也可以手動把設置參數
set global max_connections=2000;
set global table_open_cache=5000;
只不過就很有可能出現我之前出現的問題了,也就是數據庫連接數并沒有達到max_connections的限制,用戶仍然連接不上。需要說明的是,正常情況下就算連接數滿了,mysql仍然會為root用戶保留一個連接,也就是root用戶是可以登錄數據庫查看問題的。
要解決也很簡單,增大操作系統用戶mysql的限制值就行了,在配置文件/etc/security/limits.conf后面加上新的限制值就行了。
mysql soft nofile 32768
mysql hard nofile 65535
以上所述是小編給大家介紹的mysql 系統用戶最大文件打開數限制詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
您可能感興趣的文章:- MySQL數據庫大小寫敏感的問題
- python使用adbapi實現MySQL數據庫的異步存儲
- MySQL可重復讀級別能夠解決幻讀嗎
- MySQL不同表之前的字段復制
- MySQL優化方案參考
- MySQL索引類型Normal、Unique和Full Text的講解
- MySQL分庫分表總結講解
- MySQL數據庫存儲過程和事務的區別講解
- MySQL Limit性能優化及分頁數據性能優化詳解
- Mysql查看最大連接數和修改最大連接數的講解