2014년 4월 9일 수요일

디스크 여유 공간 조사하기

물리적 디스크 공간이 부족하면 어떤일이 벌어질까요?
'PRIMARY' 파일 그룹이 꽉 찼으므로 데이터베이스 'TestDB'의 개체 'dbo.TBL1'에 공간을 할당할 수 없습니다.
필요 없는 파일을 삭제하거나, 파일 그룹의 개체를 삭제하거나, 파일 그룹에 파일을 추가하거나, 파일 그룹의 기존 파일에 대해 자동 증가를 설정하여 디스크 공간을 만드십시오.

데이터베이스 'TestDB'의 트랜잭션 로그가 꽉 찼습니다.
로그의 공간을 다시 사용할 수 없는 이유를 확인하려면 sys.databases의 log_reuse_wait_desc 열을 참조하십시오.
아마 이런 종류의 에러메시지를 보게 될것입니다. 운영중에 이런 일이 벌어지면 어떻게 될까요? 모든 트랜잭션은 실패할 것입니다. 다행히 추가 디스크가 준비되어 있다고 하더라도 서비스의 중단을 막을 수는 없을 겁니다. DBA는 항상 디스크의 남은 용량을 확인하고 용량부족으로 인한 서비스 중단 사태가 일어나지 않도록 대비해야겠죠. 다음 스크립트는 서버의 물리 디스크들의 정보를 가져옵니다. 스크립트가 동작하기 위해서는 Ole Automation Procedures의 사용을 활성화해야 합니다.
SET NOCOUNT ON

DECLARE @HR INTEGER
DECLARE @FSO INTEGER
DECLARE @Drive CHAR(1)
DECLARE @VolumeName NVARCHAR(128)
DECLARE @oDrive INTEGER
DECLARE @TotalSize VARCHAR(20)

DECLARE @Drives TABLE (Drive CHAR(1) PRIMARY KEY
, VolumnName VARCHAR(128)
, TotalSize INTEGER NULL
, FreeSpace INTEGER NULL)

INSERT @Drives(Drive, FreeSpace) EXEC master.dbo.xp_fixeddrives

EXEC @HR=sp_OACreate 'Scripting.FileSystemObject', @FSO OUT

IF @HR <> 0 EXEC sp_OAGetErrorInfo @FSO

DECLARE dCur CURSOR LOCAL FAST_FORWARD FOR
        SELECT Drive from @Drives ORDER by Drive

OPEN dCur

FETCH NEXT FROM dCur INTO @Drive

WHILE @@FETCH_STATUS=0 BEGIN
        EXEC @HR = sp_OAMethod @FSO, 'GetDrive', @oDrive OUT, @Drive
        IF @HR <> 0 EXEC sp_OAGetErrorInfo @FSO
        EXEC @HR = sp_OAMethod @oDrive, 'VolumeName', @VolumeName OUT
        IF @HR <> 0 EXEC sp_OAGetErrorInfo @oDrive
        EXEC @HR = sp_OAGetProperty @oDrive, 'TotalSize', @TotalSize OUT
        IF @HR <> 0 EXEC sp_OAGetErrorInfo @oDrive

        UPDATE @Drives
        SET VolumnName = @VolumeName
                , TotalSize = @TotalSize / (1024.0 * 1024 * 1024)
                , FreeSpace = FreeSpace / 1024
        WHERE Drive = @Drive
        FETCH NEXT FROM dCur INTO @Drive
End

Close dCur
DEALLOCATE dCur

EXEC @HR=sp_OADestroy @FSO

IF @HR <> 0 EXEC sp_OAGetErrorInfo @FSO

 SELECT Drive
        , VolumnName
        , TotalSize
        , UsedSpace = TotalSize - FreeSpace
        , FreeSpace
        , [Free(%)] = CONVERT(NUMERIC(4,2), 1.0 * FreeSpace / TotalSize * 100)
   FROM @Drives
  ORDER BY Drive
스크립트의 실행 결과는 다음과 같습니다.
테이블의 형태로 반환되므로 디스크 용량이 낮아지면 SMS를 보내도록 Agent에 등록하여 사용하면 좋겠습니다.

댓글 없음:

댓글 쓰기