MSSQL SHRINK 작업이란? DB 용량 줄이기
- Database
- 2023. 8. 28.
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 정도 차지한 걸 볼 수 있습니다.
별도 작업을 하지 않은 채로 바로 SHRINK 작업을 해보겠습니다. 쿼리에 들어가는 숫자 10 옵션은 SHRINK 작업을 수행한 후 남겨질 여유 공간을 데이터베이스 전체 크기의 10%로 유지한다는 의미입니다. 예를 들어, 데이터베이스의 원래 크기가 1GB였고 400MB만 사용되고 있었다면 이 명령어를 실행하면 데이터베이스의 크기는 400MB (실제 사용 중인 데이터) + 100MB (여유 공간) = 500MB로 줄어들게 됩니다.
DBCC SHRINKDATABASE(SHRINK_DB_TEST, 10);
GO
결과적으로 mdf 파일은 전혀 줄어들지 않았습니다. 데이터 생성 이후 다른 작업을 하지 않았기 때문에 MDF 파일에 더 이상 줄일 수 있는 공간이 없기 때문입니다. ldf 파일은 24MB로 많이 줄었습니다.
예시) 테이블 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 쿼리를 돌린 영향으로 늘어난 걸 볼 수 있습니다.
이제 SHRINK 작업을 합니다.
DBCC SHRINKDATABASE(SHRINK_DB_TEST_2, 10);
GO
작업 후엔 mdf 용량이 580MB로 절반 가량 줄어든 것이 확인됩니다. ldf 역시 줄었습니다.
https://change-words.tistory.com/entry/MS-SQL-Server-MDF-LDF
'Database' 카테고리의 다른 글
PostgreSQL 최대 사용 메모리 수정하는 방법 (0) | 2023.08.29 |
---|---|
MSSQL 테이블 백업하는 방법 (SELECT * INTO) (0) | 2023.08.28 |
MYSQL 리눅스에서 .sql 파일 일괄 실행하는 방법 (0) | 2023.08.25 |
오라클 SID란? Service Name과 차이 (0) | 2023.08.08 |
DB View 테이블이란? 만드는 방법 (0) | 2023.07.31 |