MS SQL Server에서는 비교적 데이터베이스 파일 용량을 줄이기 쉬운 편이다. 서버 재기동이 필요하지 않고 데이터 파일을 직접 건드리지 않아도 된다.
그냥 SHRINK라는 작업을 해주면 되는데 mssql은 대부분 SSMS(SQL Server Management Studio)를 사용하는 환경이기 때문에 GUI로도 작업할 수 있다.
간단하게 예제 데이터베이스와 테이블을 만들어서 진행해 볼텐데 미리 말하면 이 내용은 MsSQL Server_Shrink(쉬링크) / ①SHRINKDATABASE 블로그 글을 참고해서 작성했다.
이 글만 보고도 이해가 되면 좋겠지만 읽어봤는데도 뭔소리야 싶으면 바로 저 링크로 가면 된다.
MSSQL SHRINK
shrink 라는 단어는 축소 시킨다는 뜻이다. 의미 그대로 mssql에서 shrink 명령어는 데이터베이스 용량을 줄이는 기능을 한다.
DBCC SHRINKDATABASE(데이터베이스명)
이런 식으로 쓰는데 GUI도 지원한다.
실습을 위해 SHRINKDB라는 데이터베이스와 그 안에 text라는 테이블을 만들었다. 이렇게 데이터베이스를 만들면 저장 경로에 SHRINKDB.mdf와 SHRINKDB_log.ldf 파일이 생긴다. 최초 용량은 8MB로 확인된다.
- 관련 글 : MSSQL 데이터베이스 저장 경로 확인 방법
RDBMS 데이터베이스 파일 용량은 증가하기만 한다
일단 간단한 개념하나를 알고 넘어가야 하는데 이건 mssql 뿐만 아니라 다른 rdbms에서도 마찬가지인 부분이다. rdbms 에서 생성하는 파일은 기본적으로 용량이 증가하기만 할뿐 감소하지 않는다.
예를 들면 SHRINKDB.mdf 용량이 100GB까지 쌓였다면 SHRINKDB에 있는 테이블 데이터를 아무리 지워도 SHRINKDB.mdf 용량은 그대로 100GB다.
대신 데이터를 지운 만큼의 여유공간은 그대로 두고 새로운 데이터가 저장됐을 때 그 공간을 사용한다. 때문에 주기적으로 데이터를 delete 해주면서 일정 수준의 용량으로 계속 쓰는 방법도 있다.
하지만 용량이 너무 커져서 덜어내야 하는 순간이 올 수도 있는데 그럴 때 사용하는 게 shrink다.
다시 예시로 돌아와서 파일의 용량을 늘리기 위해 아래의 쿼리를 수행해본다. 필드에 A라는 문자열이 1024개 들어가도록하여 총 1024*5 개의 레코드가 삽입되도록 하는 내용이다.
DECLARE @I INT = 0
WHILE @I < 1024 * 15
BEGIN
INSERT INTO TEST VALUES (REPLICATE('A',1024))
SET @I += 1
END
같은 방법으로 B, C도 추가했다.
DECLARE @I INT = 0
WHILE @I < 1024 * 15
BEGIN
INSERT INTO TEST VALUES (REPLICATE('B',1024))
SET @I += 1
END
SET @I = 0
WHILE @I < 1024 * 15
BEGIN
INSERT INTO TEST VALUES (REPLICATE('C',1024))
SET @I += 1
END
SSMS 왼쪽의 데이터베이스 항목에서 SHRINKDB 데이터베이스명을 우클릭 > 태스크 > 축소 > 데이터베이스 로 진입한다.
여기서 현재 할당된 공간이 디스크에서 차지하고 있는 파일 용량을 의미한다. 사용 가능한 공간은 디스크를 차지하고는 있지만 놀고 있는 여유 공간이다. shrink(축소)라는 건 이 여유 공간을 디스크에서 회수하는 개념이다.
확인을 눌러 축소해본다.
mdf, ldf 파일의 용량이 줄어들었다.
이번엔 B 관련 데이터를 모두 delete 해보고 다시 확인해보면
사용 가능한 공간이 다시 늘어난 걸 볼 수 있다.
그러나 동시에 SHRINKDB_log.ldf 용량은 증가했다. 왜냐하면 ldf 파일은 모든 트랜잭션과 변경사항을 저장하여 복구 기능을 수행하는 파일이기 때문에 delete 쿼리 수행 이력이 추가되며 용량이 늘어난 것이다.
다시 같은 방법으로 축소하면 디스크 용량이 줄어든다.