磁碟空間滿了之後MySQL會怎樣

来源:http://www.cnblogs.com/zyjj/archive/2017/06/24/7073285.html
-Advertisement-
Play Games

大多數用戶在對於磁碟進行分區的時候都是習慣性的不給系統盤預留很大空間,其實這並不是一個好習慣。因為系統分區並不像我們想象的那樣會僅僅安裝一個操作系統,系統分區多數還是會承載操作系統主要應用軟體安裝任務。那麼當磁碟空間爆滿後,MySQL會發生什麼事呢?又應該怎麼應對? 會發生什麼事 當磁碟空間寫滿了之 ...


     大多數用戶在對於磁碟進行分區的時候都是習慣性的不給系統盤預留很大空間,其實這並不是一個好習慣。因為系統分區並不像我們想象的那樣會僅僅安裝一個操作系統,系統分區多數還是會承載操作系統主要應用軟體安裝任務。那麼當磁碟空間爆滿後,MySQL會發生什麼事呢?又應該怎麼應對?

磁碟空間滿了之後MySQL會怎樣_資料庫_MySQL_數據存儲_課課家教育

  會發生什麼事

  當磁碟空間寫滿了之後,MySQL是無法再寫入任何數據的,包括對錶數據的寫入,以及binlog、binlog-index等文件。

  當然了,因為InnoDB是可以把臟數據先放在記憶體里,所以不會立刻表現出來無法寫入,除非開啟了binlog,寫入請求才會被阻塞。

  當MySQL檢測到磁碟空間滿了,它會怎麼樣呢?下麵我們來看一個具體例子:

  磁碟滿了之後MySQL會做什麼?

  我們看下官方的說法

 磁碟滿了之後MySQL會做什麼?    我們看下官方的說法

  其實MySQL本身並不會做任何操作,如官方文檔說說,只會每分鐘check一次是否有空閑空間,並且10分鐘寫一次錯誤日誌。

  但是再次期間由於磁碟滿了,意味著binlog無法更新,redolog也無法更新,所有bufferpool中的數據無法被flush上,如果不幸的伺服器重啟,或者實例被kill了,那必然會造成數據丟失,這幾乎是一定的。所以,處理磁碟滿的問題最好是先釋放出來一定空間讓dirty數據刷新下來。

  磁碟滿了為什麼會導致操作hang住?

  1、select

  首先經過經驗和實際測試,select操作不會由於磁碟滿導致問題,也就是所有select操作都會正常運行。

  2、insert

  經過不通的測試發現,當磁碟滿了之後,並不是第一個insert就卡住,而是會在n個之後出現卡住的情況。

  通過查看error日誌,發現卡住現象和刷磁碟的操作有關係。

 2、insert    經過不通的測試發現,當磁碟滿了之後,並不是第一個insert就卡住,而是會在n個之後出現卡住的情況。    通過查看error日誌,發現卡住現象和刷磁碟的操作有關係。

  為了驗證推論是否正確,我們將sync_binlog設置為1,在這種情況下,insert第一條就卡住了,並且errorlog中直接報錯提示寫binlog失敗。看來卡住確實和刷磁碟有關係。

  目前已知和刷磁碟有關係的參數有3個,分別是sync_binlog,innodb_flush_log_tr_commit,和duoblewrite。

  3、showslavestatus

  在從庫經過測試,操作會被卡住,這主要是由於執行showslavestatus需要獲得LOCK_active_mi鎖,然後鎖上mi->data_lock,但是由於磁碟滿了無法將io_thread中的數據寫入到relaylog中,導致io_thread持有mi->data_lock鎖,這就導致了死鎖。

  所以,這就導致在磁碟滿的情況下,執行showslavestatus操作會卡住。

  4、showstatus

  測試可以正常操作,但是如果先執行了showslavestatus操作的情況下,showstatus也會被卡住。這是因為執行showstatus需要鎖上LOCK_status,而由於status狀態中包含slavestatus,所以還需要鎖上LOCK_active_mi。如果限制性了showslavestatus,這時候由於mi->data_lock死鎖問題,導致io_thread不會釋放LOCK_active_mi鎖。這時候就導致showstatus和showslavestatus爭搶同一把LOCK_active_mi鎖,也形成了死鎖。

  所以,在磁碟滿的情況下,如果先執行showslavestatus,後執行showstatus,連個操作都會卡住。

  應該怎麼辦

  那麼,當發現磁碟空間滿了之後,我們應該怎麼處理呢,建議:

  每分鐘:檢查空間是否得到釋放,以便寫入新數據。當發現有剩餘空間了,就會繼續寫入數據,一切照舊。

  每十分鐘:如果還是發現沒剩餘空間,則會在日誌中寫入一條記錄,報告磁碟空間滿(這時候只寫入幾個位元組還是夠的)。

  提高監控系統檢測頻率,預防再次發生;

  及時刪除不用的文件,釋放空間;

  若有線程因磁碟滿的問題被阻塞了,可先殺掉,等到下一分鐘重新檢測時它可能又可以正常工作了;

  可能因磁碟滿導致某些線程被阻塞,引發其他線程也被阻塞,可把導致阻塞的線程殺掉,其他被阻塞的線程也就能繼續工作了。

  例外

  有個例外的情況是:

  當執行REPAIRTABLE或者OPTIMIZETABLE操作時,或者執行完LOADDATAINFILE或ALTERTABLE之後批量更新索引時,這些操作會創建臨時文件,當執行這些操作過程中mysqld發現磁碟空間滿了,就會把這個涉及到的表標記為crashed,刪掉臨時文件(除了ALTERTABLE操作,MySQL會放棄正在執行的操作,刪除臨時文件,釋放磁碟空間)。

  備註:當執行這些命令過程中mysqld進程被意外被殺掉的話,其所生成臨時文件不會自動刪除,需要手工刪掉才能釋放磁碟空間。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目錄 RunTime 概述 RunTime消息機制 RunTime交換方法 RunTime消息轉發 RunTime關聯對象 RunTime實現字典與模型互轉 1.RunTime 概述 我們在面試的時候,經常都會被問到這麼個問題:為什麼說OC是一門動態的語言???其實也就是想知道你對runtime的了 ...
  • 問題:E/NotificationService: Not posting notification with icon==0: Notification(pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x0 co ...
  • Android提供NDK開發包來提供Android平臺的C++開發,用來擴展Android SDK的功能。主要包括Android NDK構建系統和JNI實現與原生代碼通信兩部分。 一、Android NDK構建系統 1.1 構建庫 Android NDK的構建系統是基於GNU Make的。Andro ...
  • 本文轉自:[FFmpeg 入門(1):截取視頻幀 | www.samirchen.com][2] 背景 在 Mac OS 上如果要運行教程中的相關代碼需要先安裝 FFmpeg,建議使用 brew 來安裝: 或者你可以參考[在 Mac OS 上編譯 FFmpeg][5]使用源碼編譯和安裝 FFmpeg ...
  • 本文轉自:[AVAudioSession(4):響應音頻中斷事件 | www.samirchen.com][2] 本文內容主要來源於 [Responding to Interruptions][3]。 當一個音頻中斷到來時,會關閉你的 Audio Session,這通常就意味著停止或暫停你的音頻播放 ...
  • 本文轉自:[AVAudioSession(3):定製 Audio Session 的 Category | www.samirchen.com][2] 本文內容主要來源於 [Working with Categories][3]。 對於 Audio Session 來說,與之對應的 Category ...
  • 平時開發系統時偶爾會遇到數據超長導致往資料庫中保存時出錯。 使用下邊的腳本可以方便的找出超長的欄位。 1.通過正式表創建臨時表,修改臨時表中varchar、nvarchar的長度為max 2.數據手動寫入臨時表後,查找超長欄位 3.新建測試表 表截圖如下: 修改表名,運行 1.通過正式表創建臨時表, ...
  • 最近開發中遇到的一個MySQL主從延遲的坑,記錄並總結,避免再次犯同樣的錯誤。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...