SQL Server 디스크 공간 가 져 오기 사용 현황

11798 단어 sql디스크공간.
DBA 에 대해 말하자면 디스크 사용 상황 을 감시 하 는 것 은 필요 한 작업 이다.그리고 디스크 공간 사용률 정 보 를 얻 을 수 있 는 비교적 간단 한 방법 이 없다.다음은 최근 몇 년 동안 모 은 스 크 립 트 를 요약 한다.
디스크 의 남 은 공간 을 가장 많이 볼 수 있 습 니 다.이것 은 DBA 입문 에 필수 적 인 것 입 니 다.

--         
EXEC master.dbo.xp_fixeddrives
xp_fixed drives 방식 은 시스템 자체 테이프 로 직접 사용 할 수 있 습 니 다.디스크 의 총 크기 를 볼 수 없고 SQL Server 가 사용 하지 않 은 디스크 정 보 를 볼 수 없 는 것 이 단점 입 니 다.
sys.dm 사용os_volume_stats 함수

--======================================================================
--                  
WITH T1 AS (
SELECT DISTINCT
REPLACE(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_GB
FROM  sys.master_files AS f
CROSS APPLY sys.dm_os_volume_stats(f.database_id, f.file_id) AS vs
)
SELECT
Drive_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_Percent
FROM T1
조회 효과:

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 ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:    GGA
-- Create date:  2016-2-1
-- Description:            
-- =============================================
CREATE PROCEDURE [dbo].[usp_get_disk_free_size]
AS
BEGIN
  SET NOCOUNT ON;
  SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

--==========================================
--     

IF OBJECT_ID('server_disk_usage') IS NULL
BEGIN
  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 @disk
EXEC xp_fixeddrives

--             
UPDATE M
SET M.[free_siez_mb]=D.[free_siez_mb]
FROM [dbo].[server_disk_usage] AS M
INNER JOIN @disk AS D
ON 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 D
WHERE NOT EXISTS(
  SELECT 1
  FROM [dbo].[server_disk_usage] AS M 
  WHERE M.[disk_num]=D.[disk_num] )

END

GO

/****** Object: StoredProcedure [dbo].[usp_get_disk_total_size]  Script Date: 2016/5/25 18:21:11 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:    GGA
-- Create date:  2016-2-1
-- Description:           
-- =============================================
CREATE PROCEDURE [dbo].[usp_get_disk_total_size]
AS
BEGIN
  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

--==========================================
--  CMDShell
EXEC 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)
)
--============================================
--             #checkDisks
SELECT 
ROW_NUMBER()OVER(ORDER BY [disk_num]) AS RID,
[disk_num]
INTO #checkDisks
FROM [dbo].[server_disk_usage] 
WHERE [total_size_mb] = 0;

--============================================
--     #checkDisks         

DECLARE @disk_num NVARCHAR(20)
DECLARE @total_size_mb INT
DECLARE @sql NVARCHAR(200)
DECLARE @max INT
DECLARE @min INT
SELECT @max=MAX(RID),@min=MIN(RID) FROM #checkDisks

WHILE(@min<=@max)
BEGIN
SELECT @disk_num=[disk_num] 
FROM #checkDisks WHERE RID=@min

SET @sql = N'EXEC sys.xp_cmdshell ''fsutil volume diskfree '+@disk_num+':'+''''
PRINT @sql

INSERT INTO #tempDisks
EXEC sys.sp_executesql @sql

SELECT @total_size_mb=CAST((RIGHT(DiskSpace,LEN(DiskSpace)
  -CHARINDEX(': ',DiskSpace)-1)) AS BIGINT)/1024/1024
FROM #tempDisks WHERE id = 2

SELECT @total_size_mb,@disk_num

UPDATE [dbo].[server_disk_usage]
SET [total_size_mb]=@total_size_mb
WHERE [disk_num]=@disk_num

--SELECT * FROM #tempDisks

TRUNCATE TABLE #tempDisks

SET @min=@min+1

END

--==========================================
--CMDShell

EXEC sp_configure 'xp_cmdshell',0;

EXEC sp_configure 'show advanced options',1;

RECONFIGURE WITH OVERRIDE;

END

GO

/****** Object: StoredProcedure [dbo].[usp_get_disk_usage]  Script Date: 2016/5/25 18:21:11 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:    GGA
-- Create date:  2016-2-1
-- Description:           
-- =============================================
CREATE PROCEDURE [dbo].[usp_get_disk_usage]
AS
BEGIN
  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]
END
GO
--==================================
--        
EXEC [dbo].[usp_get_disk_usage]
효과 표시:

디스크 정 보 를 처음 수집 하거나 새 디스크 정 보 를 처음 수집 할 때 만 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 에서 사무 소 포 를 사용 하 는 것 과 유사 합 니 다 spconfigure 구문,예:

BEGIN TRAN
EXEC 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 문 구 를 호출 할 수 없 습 니까?
물론 아 닙 니 다.구 글 의 다음 오 류 는 다음 과 같 습 니 다.관심 있 는 것 은 참고 하 시기 바 랍 니 다.
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       。
잘못 보 고 했 지만,xpcmdshell 의 값 이 1 로 설정 되 었 습 니 다.즉,스 크 립 트 실행 이 유효 합 니 다!
이 코드 를 코드 에 이식 한 후 TRY CATCH 를 통 해 이상 을 포착 하고 버 리 면 xp 를 즐겁게 호출 할 수 있 습 니 다.cmdshell 이 요.
xp 사용cmdshell 이 시작 되 었 습 니 다.물론 관련 정 보 는 유사 한 방식 으로 얻 을 수 있 습 니 다!
예 를 들 어 디스크 의 섹 터 정보 가 져 오기:

--====================================
--  xp_cmdshell   CMD  
--        
EXEC sp_configure 'show advanced options',1 
GO
RECONFIGURE
GO
sp_configure 'xp_cmdshell',1 
GO
RECONFIGURE
GO
EXEC xp_cmdshell 'fsutil fsinfo ntfsinfo D: | find "  "';
GO
sp_configure 'xp_cmdshell',0 
GO
RECONFIGURE
GO
sp_configure 'show advanced options', 0 
GO
RECONFIGURE
GO
실행 효과:

물론 fsutil fsinfo ntfsinfo D:를 사용 하여 전체 정 보 를 얻 을 수 있 지만 더욱 주목 할 만 한 것 은 위 에 있 는 몇 줄 입 니 다.
소감:
몇 년 동안 SQL Server DBA 를 하면 서 지금 은 제대로 된 SQL SERVER DBA 를 찾 는 일이 쉽 지 않 습 니 다.한편 으로 는 현재 시장 추세 로 인해 발생 한 것 이 고 다른 한편 으로 는 우리 DBA 가 스스로'죽음'으로 인해 발생 한 것 입 니 다.많은 동업자 들 이 저 를 포함 하여'화전'시대 에 처 해 있 는 것 을 보 았 습 니 다.문제 가 있 으 면 인터페이스 에서 점 을 찍 었 습 니 다.외부 에'SQL Server 는 쉽게 운영 된다'는 허상 을 주 고 MySQL DBA 를 살 펴 보면'소스 코드 를 연구 하 는 척'하 는 척 하면 바로 사람들 에 게'강 한'발 길 을 재촉 할 수 있다.연봉 350 만 원 은 더 이상 꿈 이 아니다!
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

좋은 웹페이지 즐겨찾기