資料庫實戰案例—————記一次TempDB暴增的問題排查

来源:http://www.cnblogs.com/double-K/archive/2016/12/05/6135509.html
-Advertisement-
Play Games

前言 很多時候資料庫的TempDB、日誌等文件的暴增可能導致磁碟空間被占滿,如果日常配置不到位,往往會導致資料庫故障,業務被迫中斷。 這種文件暴增很難排查,經驗不足的一些運維人員可能更是無法排查具體原因,導致問題不能徹底解決。 場景描述 客戶系統比較穩定,用了5台機器做了AlwaysOn高可用組,完 ...


前言

  很多時候資料庫的TempDB、日誌等文件的暴增可能導致磁碟空間被占滿,如果日常配置不到位,往往會導致資料庫故障,業務被迫中斷。

  這種文件暴增很難排查,經驗不足的一些運維人員可能更是無法排查具體原因,導致問題不能徹底解決。

場景描述

  客戶系統比較穩定,用了5台機器做了AlwaysOn高可用組,完全實現了讀寫分離。磁碟也做了規劃,主庫日常操作TempDB需求在20G以下,所以TempDB所在的磁碟只配置了100個G的空間。

  本案例是客戶突然接到監控報警,顯示TempDB磁碟空間不足,可用空間不斷減小直到耗盡。

  比較戲劇的是,這個客戶早上剛剛做了巡檢資料庫情況穩定,沒有什麼異常。

  那麼我初步判定,這必然是一次特殊操作或應用配置出錯導致的問題。

深入指標分析

  文件看問題

  TempDB暴增必然伴隨著文件的增長,首先我們看一下TempDB文件的增長情況。

  

 

  可見TempDB的分配空間在14點50幾分的時候開始暴增,細心的朋友會發現這是1個G到6個G的增長,這是因為客戶的TempDB配置了16個數據文件:

  

  

 

  註:為什麼配置這麼多TempDB文件請參見:Expert 診斷優化系列------------------給TempDB 降溫

什麼造成了增長

  造成TempDB暴增原因很多語句使用臨時表、語句排序、CheckDB等,但這些都是可以在語句中反應出來。所以下麵我們分析一下語句。

  註:很多使用過SQL專家雲平臺或工具的朋友可能不會註意裡面一些細節,其實很多細節(如上面的TempDB文件增長趨勢和下麵的語句分配空間)的設計都是解決一些疑難的問題。

  

  首先語句中的其中兩個指標用戶分配空間(MB)和內部對象分配空間(MB)指的就是對TempDB的使用消耗。

  註:用戶分配空間可能是臨時表使用的比較多,內部對象分配空間可能是排序或者hash join等操作(其他使用的消耗可以參見前面給出的鏈接文章)

  

  分配空間越大,也就說明語句越消耗TempDB資源。

  我們有兩種方式找到到底是什麼操作導致的TempDB暴增,可以直接找時間點的語句,也可以在TempDB資源消耗的高到低順序中找!

  為了全面瞭解一下TempDB的問題,這裡我們採用第二種方式。

  那麼我們就分析一下語句對TempDB資源被消耗的情況:

  步驟1:首先我們按照用戶對象分配空間排序:

 

 經過排查,這裡面用戶空間分配比較高的都是CDC的作業,伺服器上確實運行這幾個庫的CDC作業。其他的一些操作的用戶分配空間都比較小,所以這不是造成問題的原因!

 

 步驟2:接著我們按照內部對象分配空間排序:

 

 

 這裡發現最消耗空間的是CheckDB的操作,但時間點是對應不上的,所以這也不是問題的原因。

 繼續排查:

 在消耗排位在第三的這個語句中我們發現了等待資源FGCB_ADD_REMOVE(這個可以簡單理解為有大量的文件自動生長髮生,這裡是16個TempDB文件),並且使用的內部對象空間也很高,並且我們還發現有多個會話同時執行這樣的高消耗操作。

 

 繼續深入:

 

  性能計數器的表象也與之前的種種跡象相吻合。

  

 

排查結論

  綜合各項現象指標,可以分析出系統在下午14點57分左後開始執行TempDB高消耗操作,語句本身是一個近千行涉及大量表連接排序等操作的複雜存儲過程,對TempDB造成暴增的問題負主要責任,而且雪上加霜的是從會話的標識可以看出,這不是一個語句只一次的執行,而是在特定的時間存在比較大的併發操作導致。

  與相關業務人員溝通,發現這是一個集團的類似報表的大消耗操作,因為對功能進行的調整,而程式人員的一次誤操作而錯誤的指向了集群中的主庫,而導致的問題。

 

--------------博客地址-----------------------------------------------------------------------------

原文地址: http://www.cnblogs.com/double-K/

如有轉載請保留原文地址! 

 

 ----------------------------------------------------------------------------------------------------

 總結

  問題的結果往往比較簡單,也相對容易解決,但綜合各項指標深入分析問題原因是值得和每一個技術人員探討的,這也是為什麼用一篇長案例來分析一個小點的原因。

  

  再思考:本案例中伺服器的架構設計是比較完善的,已經做了讀寫分離可以輕鬆的把這樣的大操作指向輔助伺服器,並且可以做到負載均衡,那麼如果你的單機伺服器也有類似這樣一個報表操作,你會怎麼辦呢?

 ----------------------------------------------------------------------------------------------------

註:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文鏈接!
若您覺得這篇文章還不錯請點擊下右下角的推薦,非常感謝!

  


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

-Advertisement-
Play Games
更多相關文章
  • Linux下命令行安裝weblogic10.3.6 一、安裝前準備工作: 1、創建用戶useradd weblogic;創建用戶成功linux系統會自動創建一個和用戶名相同的分組,並將該用戶分到改組中。並會在/home路徑下創建一個和用戶名相同的路徑,比如我們創建的weblogic。 註:當然,你也 ...
  • 微軟發佈了SQLServer for Linux,但是安裝竟然需要3.5GB記憶體,這讓大部分雲主機用戶都沒辦法嘗試這個新東西 這篇我將講解如何破解這個記憶體限制 要看關鍵的可以直接跳到第6步,只需要替換4個位元組就可以破解這個限制 1. 首先按照微軟的給出的步驟安裝和配置 https://docs.mi ...
  • 一、ORACLE的啟動和關閉 1、在單機環境下 要想啟動或關閉ORACLE系統必須首先切換到ORACLE用戶,如下 su - oracle a、啟動ORACLE系統 oracle>svrmgrl SVRMGR>connect internal SVRMGR>startup SVRMGR>quit b ...
  • -- 帶參輸出的存儲過程 --測試方法:--declare @return int--exec 測試用勿刪 1, @return out--print @return-- Create PROCEDURE [dbo].[測試用勿刪]@userid int, @return int outASbegi ...
  • 網上一直說的是先安裝SQL Server 2014,再安裝VS2015,軟體就不會出現問題。我這次在什麼都沒準備的情況下安裝了VS2015,安裝之後發覺VS2015自帶的SQL2014只有連接伺服器和管理資料庫的功能,能有操作資料庫的功能,不能進入到SQL Server 2014 Managemen ...
  • 從0開始搭建SQL Server AlwaysOn 第四篇(配置異地機房節點) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www.cnblogs.com/lyhabc/p/4682028.html第三篇http://www.cn ...
  • 安裝Oracle時出現環境變數Path的值大於1023的解決辦法 ...
  • 建庫 CREATE DATABASE 資料庫名 ON[PRIMARY] --預設屬於PRIMARY主文件組,可省略 ( NAME='', --主數據文件的邏輯名 名稱 FILEAME='', --主數據文件的物理名 路徑 .mdf 次資料庫為.ndf SIZE=5mb, --主數據文件初始大小 MA ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...