2014년 4월 15일 화요일

Database 사이즈 정보 한번에 조회하기

Database의 사이즈 계획은 DBA의 중요한 업무중에 하나 입니다.
Database를 자동증가로 설정해 놓으면 파일이 커지는 동안에 생기는 문제 때문에 수동으로 파일크기를 증가시키는 경우도 있는데, 깜박 잊고 크기를 늘려놓지 않았다면 무슨 문제가 생길까요.
여러가지 문제가 생기겠지만 결국 "서비스가 되지 않는다"로 귀결되겠죠.
아마 모든 문제를 해결 했다고 해도 "경위서"를 써야되겠지...

데이터베이스 크기에 관한 정보는 속성을 열면 나와 있지만 그리 친절하진 않습니다.
파일 크기도 mdf와 ldf를 합친 크기를 알려주는가 하면 얼마 남았는지도 친절하게 알려주지 않습니다.
그리고 모든 데이터베이스를 다 열어봐야 하죠. 귀찮게시리...

다음 스크립트는 모든 데이터베이스의 MDF와 LDF의 크기에 관한 정보를 리턴합니다.
DECLARE @SCRIPT VARCHAR(MAX)

SET @SCRIPT = 'SET NOCOUNT ON
DECLARE @FILESTATS TABLE(FileID INTEGER
, FileGroup INTEGER
, TotalExtents INTEGER
, UsedExtents INTEGER
, LogicalFileName VARCHAR(500)
, PhysicalFileName VARCHAR(500))

DECLARE @DBFILE TABLE(DatabaseName VARCHAR(1000)
, DataSize BIGINT
, DataUsed BIGINT)

DECLARE @LOGFILE TABLE(DatabaseName SYSNAME
, LogSize FLOAT
, LogSpaceUsed FLOAT
, Status INT)' + CHAR(10)

SELECT @SCRIPT = @SCRIPT + CHAR(10) + 'INSERT INTO @FILESTATS EXEC (''' + 'USE [' + NAME + '];DBCC SHOWFILESTATS WITH NO_INFOMSGS'')'
       + CHAR(10) + 'INSERT @DBFILE SELECT ''' + NAME + ''', SUM(TotalExtents), SUM(UsedExtents) FROM @FILESTATS'
       + CHAR(10) + 'DELETE @FILESTATS'
FROM SYS.DATABASES

SET @SCRIPT = @SCRIPT + CHAR(10) + 'INSERT INTO @LOGFILE EXEC (''DBCC SQLPERF (LOGSPACE) WITH NO_INFOMSGS'')'

SET @SCRIPT = @SCRIPT + '
SELECT DBID = DB_ID(A.DatabaseName)
       , A.DatabaseName
       , State = C.state_desc
       , AccessMode = C.user_access_desc
       , RecoveryModel = C.recovery_model_desc
       , DataSize = CONVERT(NUMERIC(12,2), A.DataSize * 64.0 / 1024)
       , DataUsed = CONVERT(NUMERIC(12,2), A.DataUsed * 64.0 / 1024)
       , DataFree = CONVERT(NUMERIC(12,2), (A.DataSize - A.DataUsed) * 64.0 / 1024)
       , [DataFree(%)] = CONVERT(NUMERIC(10, 2), (A.DataSize - A.DataUsed) * 100.0 / A.DataSize)
       , LogSize = CONVERT(NUMERIC(12,2), B.LogSize)
       , LogUsed = CONVERT(NUMERIC(12,2), B.LogSize * B.LogSpaceUsed / 100)
       , LogFree = CONVERT(NUMERIC(12,2), B.LogSize * (100.0 - B.LogSpaceUsed) / 100)
       , [LogFree(%)] = CONVERT(NUMERIC(10,2), 100 - B.LogSpaceUsed)
  FROM @DBFILE A
       LEFT OUTER JOIN @LOGFILE B ON A.DatabaseName = B.DatabaseName
       LEFT OUTER JOIN SYS.DATABASES C ON A.DatabaseName = C.name
 ORDER BY 1'

EXECUTE (@SCRIPT)

댓글 없음:

댓글 쓰기