SQL Server 디스크 공간 가 져 오기 사용 현황
디스크 의 남 은 공간 을 가장 많이 볼 수 있 습 니 다.이것 은 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 만 원 은 더 이상 꿈 이 아니다!
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
깊이 중첩된 객체를 정확히 일치 검색 - PostgreSQL목차 * 🚀 * 🎯 * 🏁 * 🙏 JSON 객체 예시 따라서 우리의 현재 목표는 "고용주"사용자가 입력한 검색어(이 경우에는 '요리')를 얻고 이 용어와 정확히 일치하는 모든 사용자 프로필을 찾는 것입니다. 즐거운 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.