mysql啟動錯誤排查 無法申請足夠記憶體

2021-09-25 05:39:08 字數 2886 閱讀 3611

一般情況下mysql的啟動錯誤還是很容易排查的,但是今天我們就來說一下不一般的情況。拿到一台伺服器,安裝完mysql後進行啟動,啟動錯誤如下:

有同學會說,哥們兒你是不是buffer pool設定太大了,設定了96g記憶體。這明顯提示無法分配記憶體嘛。如果真是這樣也就不在這裡進行分享了,哈哈。

我的伺服器記憶體是128g。如下圖:

伺服器記憶體使用情況:

那麼問題來了,既然還剩如此多的記憶體,為什麼提示無法分配記憶體??。各位童鞋怎麼看?

1. 首先想到會不會是有幾條記憶體壞了?於是運維的同學進行了檢查,給我的反饋是硬體一切正常。

2. 把mysql配置引數又檢查了一遍,沒有發現什麼問題,線上一直就是使用這些引數。

3. 又把檔案拷貝到另外一台機器,,另外一台伺服器可以正常啟動(2臺機器硬體配置一致)。

那麼如果排除硬體問題,mysql配置問題,那麼剩下的就只有作業系統的核心引數配置了。於是把兩台伺服器進行了對比,最終發現了乙個核心引數不一致。

vm.overcommit_memory
mysql啟動正常的伺服器改引數的值是0,而mysql啟動錯誤的這台伺服器該值是2。

那麼問題來了,這個引數到底是什麼鬼?竟然會讓mysql分配記憶體失敗,最後導致無法啟動。經過查詢資料知道了vm.overcommit_memory是什麼鬼。

vm.overcommit_memory

預設值為:0

從核心文件裡得知,該引數有三個值,分別是:

0:當使用者空間請求更多的的記憶體時,核心嘗試估算出剩餘可用的記憶體。

1:當設這個引數值為1時,核心允許超量使用記憶體直到用完為止,主要用於科學計算.

2:當設這個引數值為2時,核心會使用乙個決不過量使用記憶體的演算法,即系統整個記憶體位址空間不能超過swap+50%的ram值,50%引數的設定是在overcommit_ratio中設定。

vm.overcommit_ratio

預設值為:50

這個引數值只有在vm.overcommit_memory=2的情況下,這個引數才會生效。

那麼我們來看一下總的記憶體位址不能超過多少。其實是可以直接檢視的。

[root@yayundeng 3306]# cat /proc/meminfo |grep -i commit

commitlimit: 70144396 kb

committed_as: 135196 kb

[root@yayundeng 3306]#

通過檢視可以得知在70g的樣子。那麼這個是如何計算的呢?這個就是上面提到的乙個公式。swap+50%的ram值,50%引數的設定是在overcommit_ratio中設定。

總虛擬記憶體 = 可用物理記憶體 × 百分比 + 交換分割槽

[root@yayundeng 3306]# cat /proc/meminfo | grep memtotal

memtotal: 132096808 kb

[root@yayundeng 3306]#

[root@yayundeng 3306]# free -k

total used free shared buffers cached

mem: 132096808 1583944 130512864 0 10240 133220

-/+ buffers/cache: 1440484 130656324

swap: 4095992 0 4095992

[root@yayundeng 3306]# cat /proc/sys/vm/overcommit_ratio 

50[root@yayundeng 3306]#

總虛擬記憶體=132096808 * 50% + 4095992= 70144396 kb

那麼最後的結果就是buffer pool不能超過70144396 kb - 135196 kb=70009200 kb=66g。實際上經過測試,buffer pool只能設定57g。

最後在看看總虛擬記憶體情況:

commitlimit:最大可用虛擬記憶體

committed_as:已使用虛擬記憶體

[root@yayundeng 3306]# cat /proc/meminfo |grep -i commit

commitlimit: 70144396 kb

committed_as: 65539208 kb

那麼如果把核心引數vm.overcommit_memory恢復為預設值0,那麼將不會受到約束。

windows無法啟動mysql服務錯誤1067

在安裝了mysql服務以後,但是在計算機 服務裡面啟動mysql服務的時候,提示windows無法啟動mysql服務,錯誤1067.解決方法如下 將my.ini中的路徑使用 或 進行分隔,如果是以 分隔將無法找到啟動目錄,所以導致無法啟動 配置檔案如下 mysqld basedir basedir ...

mysql無法啟動服務,錯誤1067

安裝mysql,提示安裝成功後,啟動服務,提示錯誤1067 解決辦法 將my.ini檔案剪下放在program file資料夾下。my.ini檔案的配置如下 以下是複製內容,這行可不複製 client port 3306 default character set utf8 客戶端字元型別,與服務端...

ubuntu mysql 無法啟動 簡單排查

自己的 很久沒有去上了,想開啟發現居然打不開了,所以就找了一系列的原因。vps不行了 dns解析出問題了 網域名稱出問題了 簡單排查之後,我的vps服務商用的是 搬瓦工 bandwagonhost 重啟了一下還是無法訪問,後來我又看了一下我用的網域名稱託管 dnspod 好像也是沒有問題的。最後又查...