MSSQL SHRINK 작업이란? DB 용량 줄이기

SQL Server에서 데이터베이스를 사용하다보면 .mdf, .ldf 파일의 용량이 계속 늘어납니다. 이 데이터 파일은 DB에서 데이터를 DELETE하는 이벤트가 발생해도 디스크에서 차지하는 용량이 다시 줄어들지 않습니다. 이럴 때 SHRINK 작업을 통해 불필요한 용량을 다시 회수할 수 있습니다.

DBCC SHRINK

기본 구문을 아래와 같습니다. ldf, mdf 파일에 대해서 각각 shrink 작업을 할 수도 있고, 두 개 파일의 용량을 동시에 줄일 수도 있습니다. 

 

1. 전체 데이터베이스(ldf, mdf) 크기 축소

USE [YourDatabaseName];
GO
DBCC SHRINKDATABASE(YourDatabaseName, 10); -- 10은 남길 프리 스페이스의 대략적인 백분율입니다.
GO

 

2. 특정 데이터 파일(mdf) 축소

USE [YourDatabaseName];
GO
DBCC SHRINKFILE(YourDataFileName, 100); -- 100은 목표 크기 (MB)입니다.
GO

 

3. 로그 파일(ldf) 크기 축소

USE [YourDatabaseName];
GO
DBCC SHRINKFILE(YourLogFileName, 1); -- 1MB로 로그 파일 크기를 축소하려는 경우
GO
  • YourDatabaseName, YourDataFileName, YourLogFileName은 실제 사용하는 데이터베이스나 파일 이름으로 교체해야 합니다.
  • SHRINK 작업은 서비스 중인 환경에서는 성능 저하를 일으킬 수 있습니다. 되도록 사용자가 거의 없는 시간에 하는 편이 좋습니다.

 

예시) 테이블 DELETE 하지 않고 SHRINK

실습해보면서 어떻게 작동하는지 확인해 보겠습니다. 목표는 상황에 따라 얼마나 용량이 줄어들 수 있는가를 확인하는 것입니다. 이 글에선 동시에 mdf, ldf 파일 모두 축소하는 방법으로 진행합니다. 

 

테스트 환경 구성을 위해 SHRINK_DB_TEST라는 데이터베이스에 SHRINK_TEST_TABLE 테이블 생성합니다. 테이블에는 1GB 정도의 데이터를 저장시키겠습니다.

CREATE DATABASE SHRINK_DB_TEST;
GO

USE SHRINK_DB_TEST;
GO

CREATE TABLE SHRINK_TEST_TABLE (
    ID INT IDENTITY(1,1),
    TestData CHAR(8000) DEFAULT 'A'
);
GO

DECLARE @Counter INT = 0;

-- 1GB 데이터 삽입
WHILE @Counter < 131072  -- 1GB ÷ 8KB/행
BEGIN
    INSERT INTO SHRINK_TEST_TABLE DEFAULT VALUES;
    SET @Counter = @Counter + 1;
END

 

저장된 데이터베이스 파일을 확인해보면 mdf는 대략 1GB, ldf는 400MB 정도 차지한 걸 볼 수 있습니다.

 

db test mdf&#44; ldf

 

 

별도 작업을 하지 않은 채로 바로 SHRINK 작업을 해보겠습니다. 쿼리에 들어가는 숫자 10 옵션은 SHRINK 작업을 수행한 후 남겨질 여유 공간을 데이터베이스 전체 크기의 10%로 유지한다는 의미입니다. 예를 들어, 데이터베이스의 원래 크기가 1GB였고 400MB만 사용되고 있었다면 이 명령어를 실행하면 데이터베이스의 크기는 400MB (실제 사용 중인 데이터) + 100MB (여유 공간) = 500MB로 줄어들게 됩니다.

DBCC SHRINKDATABASE(SHRINK_DB_TEST, 10);
GO

 

shrink db test

 

결과적으로 mdf 파일은 전혀 줄어들지 않았습니다. 데이터 생성 이후 다른 작업을 하지 않았기 때문에 MDF 파일에 더 이상 줄일 수 있는 공간이 없기 때문입니다. ldf 파일은 24MB로 많이 줄었습니다. 

 

용량이 줄지 않은 mdf

 

예시) 테이블 DELETE 이후 SHRINK

이번엔 SHRINK_DB_TEST_2 데이터베이스 및 SHRINK_TEST_TABLE_2 테이블 생성합니다. 동일하게 테이블 용량은 1GB 정도로 차지하도록 데이터를 insert 했습니다.

CREATE DATABASE SHRINK_DB_TEST_2;
GO

USE SHRINK_DB_TEST_2;
GO

CREATE TABLE SHRINK_TEST_TABLE_2 (
    ID INT IDENTITY(1,1),
    TestData CHAR(8000) DEFAULT 'A'
);
GO

DECLARE @Counter INT = 0;

-- 1GB 데이터 삽입
WHILE @Counter < 131072
BEGIN
    INSERT INTO SHRINK_TEST_TABLE_2 DEFAULT VALUES;
    SET @Counter = @Counter + 1;
END

 

테이블의 데이터를 절반 가량 DELETE 하겠습니다.

DELETE FROM SHRINK_TEST_TABLE_2 WHERE ID <= (SELECT MAX(ID)/2 FROM SHRINK_TEST_TABLE_2);
GO

 

이 상태에서 파일 용량을 확인해보면, mdf 용량은 줄지 않았고 오히려 ldf 용량은 delete 쿼리를 돌린 영향으로 늘어난 걸 볼 수 있습니다.

 

용량이 줄어든 ldf

 

이제 SHRINK 작업을 합니다.

DBCC SHRINKDATABASE(SHRINK_DB_TEST_2, 10);
GO

 

mdf 파일 shrink

 

작업 후엔 mdf 용량이 580MB로 절반 가량 줄어든 것이 확인됩니다. ldf 역시 줄었습니다. 

 

반으로 줄어든 mdf 파일 용량

 

https://change-words.tistory.com/entry/MS-SQL-Server-MDF-LDF

 

MS SQL Server MDF, LDF 저장 위치 / 변경 방법

MS SQL Server을 통해 데이터베이스를 관리하면 반드시 .mdf와 .ldf 확장자의 파일이 생성됩니다. 두 파일은 SQL 서버의 핵심 데이터 및 로그 파일입니다. DB와 연결한 응용 프로그램에서 데이터를 많이

change-words.tistory.com

 

반응형

댓글

Designed by JB FACTORY