MySQL在低記憶體機器下啟動失敗
記錄一次MySQL啟動失敗,定位問題以及解決問題的過程。
環境 OS:CentOS 7 Memory:512M SSD:20G MySQL version:mysql Ver 8.0.12 for Linux on x86_64 (MySQL Community Server - GPL)
我在這臺低配伺服器上安裝了資料庫以及一個Spring Boot程式,我先啟動資料庫,啟動成功了。再啟動應用,發現應用連線不上資料庫,於是去檢查資料庫。
發現數據庫卻提示啟動失敗。
發現問題第一步是去看日誌,一般日誌都會告訴你一些很有用的資訊,讓你更具體的瞭解到問題所在,而不是一出問題就胡亂複製一段到搜尋引擎找答案。
用指令
cat /var/log/mysqld.log
檢視MySQL日誌,得到如下圖資訊,可以看到,分配InnoDB儲存引擎緩衝池記憶體失敗了,記憶體不足導致。 這裡MySQL預設需要分配的記憶體太大了,我的機器效能不夠,猜想可不可以設定一下,初始化一個比較小的記憶體空間。 搜尋配置檔案
find / -name my.cnf
注意,Windows環境下配置檔案為my.ini
vi /etc/my.cnf
我把這個值改為了4M,資料庫啟動成功了。
但是事情還沒有結束。
一般情況下,記憶體不夠用的時候會發生什麼?一般記憶體演算法會把一些在記憶體裡面很久不活動的檔案暫時存到交換區,(更多關於記憶體、交換區的知識請查閱更多資料)而把馬上就要進行處理的資料放到記憶體空間。
那麼為什麼會出現這種情況呢?
於是檢視一下交換區空間
free -m
Swap: 0 0 0
原來在系統建立的時候,沒有分配交換區空間。
說明一下,這是一臺我租的用於特殊用途的雲伺服器,預算有限所以配置比較低。哎,少花錢的代價就是要更折騰~
這下就知道對於當前環境下,最好的解決方案了: 由於外存是SSD(固態硬碟),所以相對於之前修改配置的方法,最好的辦法是,給作業系統分配一段交換區空間!
分配一個4G大小的交換區空間
當然你可以根據你機器的情況來決定啦!我的記憶體比較小,所以分配大一些,避免再次出現“OutOfMemory” 如果實體記憶體比較大,實際上可以不分配交換區空間也可以,因為可能分配了卻從來都用不上,反而造成資源浪費,這是一個需要琢磨的問題!但是一般最好還是分配一段,現在儲存越來越廉價!
fallocate -l 4G /swapfile
現在已經分配好了一段空間,但是作業系統還不知道這一塊是專門留給他用來做交換區的,所以還要告訴作業系統,但是在這之前,先設定一下這段空間的許可權,設定root使用者有讀寫的許可權,其他使用者沒有任何許可權。
Linux的許可權控制很有意思,chmod是設定許可權的指令,引數“600”,指分配給root使用者讀和寫的許可權,其他使用者沒有許可權。在Linux裡面 4代表讀許可權,2代表寫許可權,1代表執行許可權,加起來就是某個使用者擁有的許可權,比如7就是擁有讀和寫和執行的許可權。這是另一個話題,在這裡不做擴充套件,擴充套件閱讀《鳥哥的Linux私房菜》。
chmod 600 /swapfile
接下來是告訴作業系統,剛分配的這一塊空間是交換區
mkswap /swapfile
至此已經完成,再檢驗一下
可以看到交換區空間已經分配完畢。
但是如上的配置,在系統重啟之後,將不會儲存,因此還需要將配置持久化:
編輯/etc/fstab檔案,再末尾新增如下一行,再儲存即可。
/swapfile swap swap sw 0 0