天天看點

記一次因磁盤塊預設保留政策導緻的資料庫導入失敗問題

近日開發人員要新測試一個功能,需要用到生産環境中的資料庫(生産庫版本:mysql-5.5.38-linux2.6-x86_64),是以需要我協調将生産庫同步到測試庫(測試庫版本:mysql-5.5.38-linux2.6-x86_64)中。由于測試庫中有很多從生産庫同步過來的庫,但這些庫大都已經dirty了,是以不如重新同步一份。

例如舉個實際的例子:

記一次因磁盤塊預設保留政策導緻的資料庫導入失敗問題
記一次因磁盤塊預設保留政策導緻的資料庫導入失敗問題

上圖就是生産庫和測試庫的例子,生産庫的ibdata1檔案已經達到了90gb,測試庫的ibdata1檔案也不甘示弱,達到了71gb。

以下詳細說說此事情的經過。

生産庫的磁盤為ssd磁盤,性能還是不錯的,每日早上4點都有資料庫備份腳本對生産庫備份(mysqldump出sql并壓縮成zip檔案)。是以要将生産庫的庫同步到測試庫的話隻需要将備份檔案用scp指令通過内網位址傳輸到測試庫,将zip檔案解壓出來,通過nohup指令背景導入即可。

記一次因磁盤塊預設保留政策導緻的資料庫導入失敗問題

但随即發現問題不妙。原先監控系統早就報警說磁盤空間不足20%,一直沒在意,後來發現磁盤空間直接使用率100%了。

記一次因磁盤塊預設保留政策導緻的資料庫導入失敗問題

但是發現明明總空間有99gb而使用94gb,而使用率卻是100%,那5gb“不翼而飛”了?經排查,先排除磁盤損壞原因,後來确定為原來是一個預設的系統保護政策。

此政策的英文描述如下:

reserving some number of filesystem blocks for use by  privileged  processes  is done to avoid filesystem fragmentation, and to allow system daemons, such as syslogd(8), to continue to function correctly after non-privileged processes are prevented from writing to the filesystem.  normally, the default percentage of reserved blocks is 5%.

翻譯成中文大體如下:

此政策用于為一些特權程序(這個程序與root使用者發起的程序不同,注意區分)正确執行完來避免造成檔案系統碎片和為了允許系統背景程式如syslogd在非特權程序被阻止寫入檔案系統後能繼續正常的工作,而采取的保留一些檔案系統塊用于專用的政策。預設保留的塊數量是總數量的5%。

這個政策可用于ext2/ext3/ext4等系統。

記一次因磁盤塊預設保留政策導緻的資料庫導入失敗問題

dumpe2fs /dev/xvdb1 |grep -i "block coun"     

awk 'begin{print 1310694 / 26213888}' ,bc工具做浮點數除法時有問題,建議使用awk。      

#0.05 --> 5% reserved block count --> refer to 'man 8 tune2fs' and option '-m'

經圖上計算恰好是5%!既然這是預設政策,不管是預設還是不預設的,都可以調整,然後用tune2fs調整一下,如下圖所示:

記一次因磁盤塊預設保留政策導緻的資料庫導入失敗問題

這樣那5gb空間就可以使用了,然後清除一些應用日志繼續執行程式後發現還是有問題。

記一次因磁盤塊預設保留政策導緻的資料庫導入失敗問題

重新執行mysql導入指令後發現磁盤空間很快又被用盡了,趕緊取消導入指令。

記一次因磁盤塊預設保留政策導緻的資料庫導入失敗問題
記一次因磁盤塊預設保留政策導緻的資料庫導入失敗問題

再提醒一句:mysql的系統表空間永遠不會縮小,是以ibdata1這個檔案會越來越大,要想降低ibdata檔案的大小,決不能采用直接删除的辦法,如果直接删除了,那就比較悲催了,因為innodb引擎的原理會輕則導緻資料庫無法啟動(意思是可以恢複),重則導緻資料庫資料丢失(也能找回來,但未必能100%找回來),唯一降低ibdata檔案的辦法就是重新安裝資料庫,沒錯,是重新安裝資料庫,将原先的資料庫通過mysqldump導出(不要用percona-xtrabackup備份,這個工具并不是導出sql檔案),資料庫重新安裝後,啟用innodb_file_per_table選項,再用備份的sql檔案導入。上述操作顯而易見還是非常麻煩的。

再額外說一些後續。

如果隻有有限的機器做資料庫使用,最好不同業務運作在不同的資料庫伺服器上。即一台機器上運作多個資料庫伺服器,每一個資料庫伺服器隻運作一個資料庫執行個體,這樣做雖然繁瑣,但它的好處也是顯而易見的。例如一個資料庫伺服器損壞不會影響一批業務系統。每一個資料庫執行個體可以很容易的對應一個從庫,更好的實作ha。如果一個資料庫伺服器運作多個資料庫執行個體,那麼配置主從複制時會非常麻煩,因為有多個執行個體需要配置主從時,它的二進制檔案和pos值在利用mysqldump指令逐個備份資料庫時是很難确定的,除非借助percona-xtrabackup或者一些手動的辦法,擷取唯一的二進制檔案和pos值。這種政策的設定正好在mysql的multiserver上很好的得到了展現。

tag:mysql ibdata檔案,mysql innodb_file_per_table,tune2fs,磁盤保護政策,系統保留塊計數

--end--