해당 포스트는 총 2편으로 작성되어있고 스토리가 이어져있다.
[MSSQL] DBCC SHIRINGFILE - DB 데이터/로그 파일 축소하기 - 1편
SQL Server의 데이터베이스는 파일 그룹으로 이루어져 있다. 파일 그룹은 데이터 파일들이 저장될 그룹을 의미하는데 이 그룹은 또 데이터 파일(MDF or NDF) + 로그 파일(LDF)을 의미한다. 해당 포스트
developjuns.tistory.com
1편 포스트에서는 아래를 확인하였다.
- 파일그룹, 파일, 테이블을 생성하고, 초기 사이즈를 확인하였다. 실제로 아무 데이터가 없어도 파일을 초기사이즈만큼 운영체제에게 할당받았다.
- 파일이 초기 5MB크기에서 92MB로 증가하였으나, 테이블 데이터를 모두 지워도 NDF 파일의 용량은 할당받은 크기를 유지하고 있었다.
2편 해당 포스트에서는 데이터 파일을 축소시키는 방법 DBCC SHRINGFILE에 대해 알아본다.
DBCC SHRINKFILE
DBCC SHRINKFILE 명령어는 DBCC에서 제공하는 명령어이고 구문 문법은 아래와 같이 정의한다.
DBCC SHRINKFILE
(
{ file_name | file_id }
{ [ , EMPTYFILE ]
| [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ]
}
)
[ WITH NO_INFOMSGS ]
- file_name : 축소할 파일의 논리적 이름.
- file_id : 축소할 파일의 ID
- target_size : 축소하고자 하는 파일의 사이즈 (MB). 이 값을 지정하지 않거나 0으로 지정하면 DBCC SHIRINKFILE은 파일 초기 사이즈로 축소시킨다.
- EMPTYFILE : 다른 파일로 데이터를 옮긴다. 단, 같은 파일그룹내 파일이 여야 한다. (해당 포스트에서는 다루지 않는다.)
- NOTRUNCATE : target_percent, size의 지정 여부와 관계없이 데이터 파일의 끝에서 할당된 데이터를 파일 앞의 할당되지 않은 공간으로 이동만 한다. ( 파일이 축소되지 않은 것처럼 보인다. )
- TRUNCATEONLY : 파일 끝의 모든 사용 가능한 공간을 운영체제로 해제 (반납)한다. 단, 데이터의 이동은 없다.
사용 방법 케이스
SHRINKFILE 명령어는 아래 3가지 방법으로 사용할 수 있다.
- 데이터 파일의 맨 뒤의 빈 공간을 잘라낸다
- 데이터 파일의 맨 뒤에서 target_size를 제외한 데이터를 파일 앞의 빈 공간으로 이동한다. (조각 모음)
- 2번, 1번을 차례대로 수행한다.
1번의 방법을 TRUNCATEONLY라고 하며 무조건 잘라내는 것을 의미한다.
2번의 방법을 NOTRUNCATE라고 하며 데이터를 이동만 할 뿐 파일의 크기는 잘라내지 않는다.
TRUNCATEONLY
파일 끝의 모든 사용 가능한 공간을 운영 체제로 해제하지만 파일 내에서 페이지 이동을 수행하지 않는다.
사용법은 간단하다.
DBCC SHIRINKFILE ('FILE_SIZE_TEST.ndf',90, TRUNCATEONLY)
어떤 파일을 수정할 것인지 TRUNCATEONLY 방법으로 축소할 것인지 나열해주면 된다.
주의할 점은 무조건 파일의 끝에서 사용하지 않는 공간만 잘라낸다.
단순히 맨 뒤에 안 쓰는 공간을 운영체제에게 반납한다고 생각하면 된다.
target_size만큼 뒤에서부터 공간을 잘라내다가 데이터가 발견되면 발견된 위치의 사이즈까지만 잘라낸다!
위 그림에서 target_size를 80으로 해도 결과는 똑같다.
NOTRUNCATE
파일의 맨 뒤에서부터 파일 사이즈 - target_size의 공간의 데이터를 target_size 공간에 할당 가능한 위치로 데이터를 옮긴다. ( 파일의 사이즈는 줄어들지 않는다. 파일 조각 모음과 같은 결과 )
사용법은 간단하다.
DBCC SHRINKFILE ('FILE_SIZE_TEST.ndf',130, NOTRUNCATE)
그림 2와 같이 기존 165MB에서 NOTRUNCATE로 130MB의 크기로 축소시킨다면,
맨 뒤 35MB의 공간의 데이터를 앞에 빈 공간으로 데이터를 이동만 시킨다.
데이터 파일의 크기는 운영체제에게 해제하지 않는다.!
NOTRUNCATE + TRUNCATEONLY
그렇다면 실제 맨 뒤 데이터를 앞 빈 공간으로 옮기고 맨 뒤에 빈 공간을 잘라내면 데이터 파일의 축소가 완벽하게 된다.
NOTRUNCATE, TRUNCATEONLY를 같이 쓰는 방법은 명시하지 않는 것이다.
사용방법은 간단하다.
DBCC SHRINKFILE ( N'FILE_SIZE_TEST’, 130)
NOTRUNCATE, TRUNCATEONLY를 명시해주지 않는 것이다 그럼 아래 그림 3과 같이 진행된다.
130 target_size 밖의 공간에서 존재하는 데이터를 앞 공간 비어있는 공간에 데이터를 옮긴 후( NOTRUNCATE)
맨 뒤의 공간을 운영체제에게 해제(반납 = TRUNCATEONLY) 한다.
'DataBase > MSSQL' 카테고리의 다른 글
[MSSQL] DBCC SHRINKFILE - DB 데이터/로그 파일 축소하기 - 1편 (0) | 2022.05.03 |
---|---|
[MSSQL] 파일 그룹별로 디스크 할당량, 사용량, 할당 가능량 조회 쿼리 (0) | 2022.05.02 |
[MSSQL] 제약조건(CONSTRAINT)이란 ? (0) | 2022.04.20 |
[MSSQL] 테이블 컬럼 추가, 수정, 삭제 ALTER TABLE (0) | 2022.04.15 |
[MSSQL] 데이터베이스 파일그룹 정리 (0) | 2022.02.18 |