亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQL Server獲取磁盤空間使用情況

2024-08-31 01:04:47
字體:
來源:轉載
供稿:網友

對于DBA來說,監控磁盤使用情況是必要的工作,然后沒有比較簡單的方法能獲取到磁盤空間使用率信息,下面總結下這些年攢下的腳本

最常用的查看磁盤剩余空間,這個屬于DBA入門必記的東西:

sql;">-- 查看磁盤可用空間EXEC master.dbo.xp_fixeddrives

xp_fixeddrives方式有點是系統自帶,可直接使用,缺點是不能查看磁盤總大小和不能查看SQL Server未使用到的磁盤信息

使用sys.dm_os_volume_stats函數

--======================================================================--查看數據庫文件使用的磁盤空間使用情況WITH T1 AS (SELECT DISTINCTREPLACE(vs.volume_mount_point,':/','') AS Drive_Name ,CAST(vs.total_bytes / 1024.0 / 1024 / 1024 AS NUMERIC(18,2)) AS Total_Space_GB ,CAST(vs.available_bytes / 1024.0 / 1024 / 1024 AS NUMERIC(18,2)) AS Free_Space_GBFROM  sys.master_files AS fCROSS APPLY sys.dm_os_volume_stats(f.database_id, f.file_id) AS vs)SELECTDrive_Name,Total_Space_GB,Total_Space_GB-Free_Space_GB AS Used_Space_GB,Free_Space_GB,CAST(Free_Space_GB*100/Total_Space_GB AS NUMERIC(18,2)) AS Free_Space_PercentFROM T1

查詢效果:

sql,server,磁盤空間,獲取磁盤空間

sys.dm_os_volume_stats函數很好用,能直接查詢到總空間和空閑空間,可惜只支持SQL Server 2008 R2 SP1即更高版本,另外無法查到數據庫文件未使用到的磁盤

為兼容低版本,可采用xp_fixeddrives+xp_cmdshell方式來獲取,我寫了幾個存儲過程來獲取磁盤信息:

USE [monitor]GO/****** Object: StoredProcedure [dbo].[usp_get_disk_free_size]  script Date: 2016/5/25 18:21:11 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:    GGA-- Create date:  2016-2-1-- Description:  收集磁盤剩余空間信息-- =============================================CREATE PROCEDURE [dbo].[usp_get_disk_free_size]ASBEGIN  SET NOCOUNT ON;  SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;--==========================================--創建相關表IF OBJECT_ID('server_disk_usage') IS NULLBEGIN  CREATE TABLE [dbo].[server_disk_usage](    [disk_num] [nvarchar](10) NOT NULL,    [total_size_mb] [bigint] NOT NULL CONSTRAINT [DF_server_disk_usage_total_size_mb] DEFAULT ((0)),    [free_siez_mb] [bigint] NOT NULL CONSTRAINT [DF_server_disk_usage_free_siez_mb] DEFAULT ((0)),    [disk_info] [nvarchar](400) NOT NULL CONSTRAINT [DF_server_disk_usage_disk_info] DEFAULT (''),    [check_time] [datetime] NOT NULL CONSTRAINT [DF_server_disk_usage_check_time] DEFAULT (getdate()),     CONSTRAINT [PK_server_disk_usage] PRIMARY KEY CLUSTERED     (      [disk_num] ASC    )  ) ON [PRIMARY]END--==========================================--查看所有數據庫使用到的磁盤剩余空間DECLARE @disk TABLE(    [disk_num] VARCHAR(50),    [free_siez_mb] INT)INSERT INTO @diskEXEC xp_fixeddrives--更新當前磁盤的剩余空間信息UPDATE MSET M.[free_siez_mb]=D.[free_siez_mb]FROM [dbo].[server_disk_usage] AS MINNER JOIN @disk AS DON M.[disk_num]=D.[disk_num]--插入新增磁盤的剩余空間信息INSERT INTO [dbo].[server_disk_usage](  [disk_num],  [free_siez_mb])SELECT [disk_num],[free_siez_mb]FROM @disk AS DWHERE NOT EXISTS(  SELECT 1  FROM [dbo].[server_disk_usage] AS M   WHERE M.[disk_num]=D.[disk_num] )ENDGO/****** Object: StoredProcedure [dbo].[usp_get_disk_total_size]  script Date: 2016/5/25 18:21:11 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:    GGA-- Create date:  2016-2-1-- Description:  收集磁盤總空間信息-- =============================================CREATE PROCEDURE [dbo].[usp_get_disk_total_size]ASBEGIN  SET NOCOUNT ON;  SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;IF NOT EXISTS(SELECT * FROM [dbo].[server_disk_usage]    WHERE [total_size_mb] = 0)BEGIN  RETURN;END--==========================================--開啟CMDShellEXEC sp_configure 'show advanced options',1;RECONFIGURE WITH OVERRIDE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE WITH OVERRIDE--========================================--創建臨時表用來存放每個盤符的數據CREATE TABLE #tempDisks(  ID INT IDENTITY(1,1),  DiskSpace NVARCHAR(200))--============================================--將需要檢查的磁盤放入臨時表#checkDisksSELECT ROW_NUMBER()OVER(ORDER BY [disk_num]) AS RID,[disk_num]INTO #checkDisksFROM [dbo].[server_disk_usage] WHERE [total_size_mb] = 0;--============================================--循環臨時表#checkDisks檢查每個磁盤的總量DECLARE @disk_num NVARCHAR(20)DECLARE @total_size_mb INTDECLARE @sql NVARCHAR(200)DECLARE @max INTDECLARE @min INTSELECT @max=MAX(RID),@min=MIN(RID) FROM #checkDisksWHILE(@min<=@max)BEGINSELECT @disk_num=[disk_num] FROM #checkDisks WHERE RID=@minSET @sql = N'EXEC sys.xp_cmdshell ''fsutil volume diskfree '+@disk_num+':'+''''PRINT @sqlINSERT INTO #tempDisksEXEC sys.sp_executesql @sqlSELECT @total_size_mb=CAST((RIGHT(DiskSpace,LEN(DiskSpace)  -CHARINDEX(': ',DiskSpace)-1)) AS BIGINT)/1024/1024FROM #tempDisks WHERE id = 2SELECT @total_size_mb,@disk_numUPDATE [dbo].[server_disk_usage]SET [total_size_mb]=@total_size_mbWHERE [disk_num]=@disk_num--SELECT * FROM #tempDisksTRUNCATE TABLE #tempDisksSET @min=@min+1END--==========================================--CMDShellEXEC sp_configure 'xp_cmdshell',0;EXEC sp_configure 'show advanced options',1;RECONFIGURE WITH OVERRIDE;ENDGO/****** Object: StoredProcedure [dbo].[usp_get_disk_usage]  script Date: 2016/5/25 18:21:11 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:    GGA-- Create date:  2016-2-1-- Description:  收集磁盤總空間信息-- =============================================CREATE PROCEDURE [dbo].[usp_get_disk_usage]ASBEGIN  SET NOCOUNT ON;  SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;  EXEC [dbo].[usp_get_disk_free_size]  EXEC [dbo].[usp_get_disk_total_size]  SELECT   [disk_num] AS Drive_Name  ,CAST([total_size_mb]/1024.0 AS NUMERIC(18,2)) AS Total_Space_GB  ,CAST(([total_size_mb]-[free_siez_mb])/1024.0 AS NUMERIC(18,2)) AS Used_Space_GB  ,CAST([free_siez_mb]/1024.0 AS NUMERIC(18,2)) AS Free_Space_GB  ,CAST([free_siez_mb]*100/[total_size_mb] AS NUMERIC(18,2)) AS Free_Space_Percent  ,[disk_info]  ,[check_time]  FROM [monitor].[dbo].[server_disk_usage]ENDGO--==================================--查看磁盤空間使用EXEC [dbo].[usp_get_disk_usage]

效果顯示:

sql,server,磁盤空間,獲取磁盤空間

只有第一次收集磁盤信息或第一次收集新磁盤信息時,才會調用xp_cmdshell來獲取磁盤的總大小,盡量減少xp_cmdshell開啟帶來的風險,可配合SQL Server Agent Job來使用,定期調用存儲過程刷新磁盤信息,監控程序直接訪問數據表來或許最后一次刷新時的磁盤信息。

此方式有一缺點是開啟xp_cmdshell后獲取磁盤總大小期間,其他進程可能關閉xp_cmdshell,造成存儲過程執行失敗,雖然發生概率較低,但畢竟存在。

如果想跳過存儲過程+SQL Server Agent Job方式,直接通過程序來調用xp_cmdshell,當程序使用“RECONFIGURE WITH OVERRIDE”來配置時,會報如下錯誤:

CONFIG statement cannot be used inside a user transaction.DB-Lib error message 574

錯誤類似于我們在SSMS中使用事務包裹sp_configure語句,如:

BEGIN TRANEXEC sp_configure 'show advanced options',1;RECONFIGURE WITH OVERRIDE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE WITH OVERRIDE;COMMIT

錯誤消息為:

配置選項 'show advanced options' 已從 0 更改為 1。請運行 RECONFIGURE 語句進行安裝。消息 574,級別 16,狀態 0,第 3 行在用戶事務內不能使用 CONFIG 語句。配置選項 'xp_cmdshell' 已從 0 更改為 1。請運行 RECONFIGURE 語句進行安裝。消息 574,級別 16,狀態 0,第 5 行在用戶事務內不能使用 CONFIG 語句。

難道不能通過程序調用RECONFIGURE WITH OVERRIDE語句?

當然不是,google下相關錯誤,僅發現下面一個相關,有興趣的可以參考下:

https://www.sqlservercentral.com/Forums/Topic1349778-146-1.aspx

粗略看了下,使用存儲過程套存儲過程的方式來繞過報錯,本人沒有具體測試,感覺太繁瑣,于是采用簡單粗暴的方式,既然報“在用戶事務內不能使用 CONFIG 語句”,哪我是否可以先COMMIT下干掉“用戶事務”呢?

基于此思路,最終測試獲得下面方式:

DECLARE @sql VARCHAR(2000)SET @sql ='COMMIT;EXEC sp_configure ''show advanced options'',1;RECONFIGURE WITH OVERRIDE;EXEC sp_configure ''xp_cmdshell'',1;RECONFIGURE WITH OVERRIDE;'EXEC(@sql)

仔細的朋友發現我先執行了COMMIT, 您沒看錯,這樣的打開方式雖然怪異但的確是一種打開方式,在SSMS中執行結果為:

消息 3902,級別 16,狀態 1,第 2 行COMMIT TRANSACTION 請求沒有對應的 BEGIN TRANSACTION。配置選項 'show advanced options' 已從 1 更改為 1。請運行 RECONFIGURE 語句進行安裝。配置選項 'xp_cmdshell' 已從 1 更改為 1。請運行 RECONFIGURE 語句進行安裝。

雖然報錯,但是的但是,xp_cmdshell的值已經被設置為1,即腳本執行生效啦!

將此代碼移植到代碼中,然后通過TRY CATCH將異常捕獲并丟棄,你就可以愉快地調用xp_cmdshell啦。

使用xp_cmdshell開了頭,當然相關信息也可以使用類似方式來獲取啦!

比如獲取磁盤的扇區信息:

--====================================--使用xp_cmdshell來執行CMD命令--獲取磁盤扇區信息EXEC sp_configure 'show advanced options',1 GORECONFIGUREGOsp_configure 'xp_cmdshell',1 GORECONFIGUREGOEXEC xp_cmdshell 'fsutil fsinfo ntfsinfo D: | find "每個"';GOsp_configure 'xp_cmdshell',0 GORECONFIGUREGOsp_configure 'show advanced options', 0 GORECONFIGUREGO

運行效果為:

sql,server,磁盤空間,獲取磁盤空間

當然你可以使用fsutil fsinfo ntfsinfo D:來獲取完整信息,但是更值得您關注的就是上面這幾行。

感言:

當了這么多年的SQL Server DBA,現在找份像樣的SQL SERVER DBA的工作真不容易,一方面是當前市場趨勢導致,另一方面也是咱DBA自己“作死”造成的,看到很多同行包括我自己都還處在“刀耕火種”時代,有問題就在界面上點來點去,給外界一種“SQL Server很容易運維”的假象,而再看看MySQL DBA,只要你能假裝“研究下源碼”,立馬給人一種“很牛逼”的趕腳,于是乎年薪三五十萬不再是夢想!

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持VeVb武林網!


注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲综合中文字幕在线| 精品电影在线观看| 欧美成人精品一区| 欧美刺激性大交免费视频| 成人免费观看网址| 国产精品美女午夜av| 亚洲japanese制服美女| 欧美日韩亚洲激情| 日产日韩在线亚洲欧美| 亚洲成色777777在线观看影院| 国内精品久久影院| 亚洲美女在线观看| 欧美日韩视频免费播放| 国产69久久精品成人| 成人免费直播live| 久久精品国产亚洲| 波霸ol色综合久久| 国产91在线播放| 中文字幕日韩在线观看| 日本中文字幕不卡免费| 中文亚洲视频在线| 高潮白浆女日韩av免费看| 久久中国妇女中文字幕| 91精品国产91| 成年人精品视频| 性欧美暴力猛交69hd| 最近中文字幕mv在线一区二区三区四区| 国内精品伊人久久| 日韩精品视频免费| 亚洲第一网站免费视频| 国自产精品手机在线观看视频| 91精品国产精品| 91精品国产综合久久香蕉| 日韩hd视频在线观看| 国产一区香蕉久久| 亚洲精品国精品久久99热| 亚洲男人的天堂在线播放| 亚洲久久久久久久久久久| 亚洲一区二区三区xxx视频| 亚洲第一视频在线观看| 国产日韩精品综合网站| 久久久精品久久久| 国产精品欧美在线| 亚洲一区www| 91精品国产777在线观看| 国产精品久久久久av免费| 91在线无精精品一区二区| 欧美专区在线播放| 国内精品久久久久影院 日本资源| 精品久久中文字幕| 欧美午夜精品久久久久久人妖| 国产精品视频地址| 成人精品久久久| 俺去了亚洲欧美日韩| 在线成人激情黄色| 26uuu另类亚洲欧美日本老年| 4444欧美成人kkkk| 亚洲精品福利免费在线观看| 国产精品一久久香蕉国产线看观看| 国产日韩欧美成人| 亚洲精品91美女久久久久久久| 亚洲天堂av电影| 亚洲精品一区久久久久久| 国产成人精品久久久| 久久精品亚洲一区| 久久精品国产亚洲精品2020| 九九热这里只有精品6| 国产精品国产福利国产秒拍| 日韩三级成人av网| 亚洲国产精品va在线观看黑人| 久久综合久久88| 欧美大胆在线视频| 欧美大全免费观看电视剧大泉洋| 麻豆精品精华液| 精品丝袜一区二区三区| 亚洲精品视频二区| 8090成年在线看片午夜| 国产精品久久久久久久av电影| 欧美成人中文字幕在线| 精品久久久中文| 午夜精品久久久久久久99热| 国产精品三级美女白浆呻吟| 91超碰中文字幕久久精品| 亚洲高清久久网| 亚洲成色777777女色窝| 国产自摸综合网| 欧美一区二区三区图| 精品一区二区三区四区| 欧美成人三级视频网站| 国产精品流白浆视频| 久久精品国产亚洲7777| 狠狠色狠狠色综合日日五| 欧美限制级电影在线观看| 欧美乱人伦中文字幕在线| 国产精品视频久久| 久久久成人精品视频| 国产精品国产自产拍高清av水多| 国产91精品不卡视频| 在线看日韩欧美| 国产精品女主播| 欧美极品xxxx| 亚洲欧美日韩国产中文专区| 久久91亚洲精品中文字幕| 日韩免费中文字幕| 亚洲男人天堂网| 国产精品丝袜高跟| 日本一欧美一欧美一亚洲视频| 欧美野外猛男的大粗鳮| 亚洲国产天堂久久综合| 日韩国产高清污视频在线观看| 高跟丝袜一区二区三区| 亚洲va欧美va在线观看| 4388成人网| 成人福利免费观看| 国产精品第七十二页| 国产成人精品免高潮费视频| 精品美女国产在线| 国产精品极品在线| 国产免费久久av| 亚洲国产精品电影| 中文字幕日本精品| 久久中文字幕一区| 国产精品极品在线| 亚洲最大福利网| 尤物精品国产第一福利三区| 欧美精品福利在线| 日韩欧美高清在线视频| 成人动漫网站在线观看| 国产精品国内视频| 欧美体内谢she精2性欧美| 亚洲另类图片色| 在线观看精品国产视频| 亚洲激情免费观看| 欧美又大粗又爽又黄大片视频| 日韩性生活视频| 中文字幕久精品免费视频| 亚洲奶大毛多的老太婆| 国产精品久久久久久久久免费看| 亚洲第一区第二区| 黄色精品在线看| 日韩免费电影在线观看| 亚洲xxx自由成熟| 亚洲一区二区黄| 日韩在线观看成人| 热久久这里只有精品| 一个人看的www欧美| 91精品国产沙发| 亚洲毛片在线看| 欧美在线日韩在线| 在线观看国产欧美| 欧美做受高潮电影o| 国产日韩视频在线观看| 亚洲综合精品一区二区| 国产精品免费久久久久久| 欧美在线影院在线视频| 日韩在线视频网| 4444欧美成人kkkk| 日韩av毛片网| 中文字幕免费精品一区高清| 91av视频在线| 日韩欧中文字幕| 国产69精品久久久久99| 91麻豆桃色免费看| 亚洲色图国产精品|