본문 바로가기

Development/T-SQL 프로그래밍

DBCC SHRINKFILE



DBCC SHRINKFILE

관련 데이터베이스에 대해 지정한 데이터 파일이나 로그 파일의 크기를 축소합니다.

구문

DBCC SHRINKFILE
     ( { file_name | file_id }
         { [ , target_size ]
             | [ , { EMPTYFILE | NOTRUNCATE | TRUNCATEONLY } ]
        }
    )

인수

file_name

축소할 파일의 논리적 이름입니다. 파일 이름은 식별자에 대한 규칙을 따라야 합니다. 자세한 내용은 식별자 사용을 참조하십시오.

file_id

축소할 파일의 ID 번호입니다. 파일 ID를 구하려면 FILE_ID 함수를 사용하거나 현재 데이터베이스에서 sysfiles를 검색합니다.

target_size

정수로 표시된 원하는 파일 크기(단위: MB)입니다. 이 값을 지정하지 않으면 DBCC SHRINKFILE가 파일 크기를 기본 파일 크기로 줄입니다.

target_size를 지정하면 DBCC SHRINKFILE은 파일을 지정한 크기로 축소합니다. 파일의 해제될 부분에서 사용된 페이지는 보유된 부분의 사용 가능한 공간에 재배치됩니다. 예를 들어, 10MB의 데이터 파일이 있을 경우 target_size가 8인 DBCC SHRINKFILE을 실행하면 파일의 마지막 2MB에서 사용된 모든 페이지는 파일의 처음 8MB에서 사용 가능한 슬롯에 다시 할당됩니다. DBCC SHRINKFILE은 파일에 데이터를 저장하는 데 필요한 크기 이하로 파일을 축소하지 않습니다. 예를 들어, 10MB 데이터 파일에서 7MB가 사용된 경우 target_size가 6인 DBCC SHRINKFILE 문은 파일을 6MB가 아니라 7MB까지만 축소합니다.

EMPTYFILE

지정한 파일의 모든 데이터를 동일한 파일 그룹의 다른 파일로 마이그레이션합니다. Microsoft® SQL Server™에서는 EMPTYFILE 옵션을 사용한 파일에 더 이상 데이터를 저장할 수 없습니다. 이 옵션은 ALTER DATABASE 문을 사용하여 해당 파일을 삭제할 수 있도록 허용합니다.

NOTRUNCATE

해제된 파일 공간을 파일에 보유합니다.

target_size와 함께 NOTRUNCATE를 지정하면 해제된 공간이 운영 체제에 반환되지 않습니다. 이런 경우 DBCC SHRINKFILE은 target_size 행보다 위에서 사용된 페이지를 파일 앞부분으로 재배치하는 효과만 있습니다. NOTRUNCATE를 지정하지 않으면 해제된 파일 공간이 모두 운영 체제에 반환됩니다.

TRUNCATEONLY

파일에서 사용되지 않는 공간을 운영 체제에 반환하고 마지막으로 할당된 익스텐트까지 파일을 축소하여 데이터를 이동하지 않고 파일 크기를 줄입니다. 할당되지 않은 페이지에 행을 재배치하려는 시도는 이루어지지 않습니다. TRUNCATEONLY를 사용하면 target_size가 무시됩니다.

비고

DBCC SHRINKFILE은 현재 데이터베이스의 파일에만 적용됩니다. 특정 데이터베이스의 파일을 참조하는 DBCC SHRINKFILE 문을 실행하려면 컨텍스트를 해당 데이터베이스로 변경합니다. 현재 데이터베이스 변경에 대한 자세한 내용은 USE를 참조하십시오.

데이터베이스는 model 데이터베이스보다 작은 크기로 축소할 수 없습니다.

파일 크기를 원래 만들어진 크기보다 작게 줄이려면 DBCC SHRINKFILE을 사용합니다. 이렇게 하면 파일의 최소 크기가 새로 지정한 크기로 재설정됩니다.

파일에 있는 데이터를 모두 제거하려면 ALTER DATABASE를 실행하기 전에 DBCC SHRINKFILE('file_name', EMPTYFILE)을 실행합니다.

축소할 데이터베이스는 단일 사용자 모드가 아니어도 됩니다. 즉, 다른 사용자가 데이터베이스에서 작업 중이라도 파일을 축소할 수 있습니다. 시스템 데이터베이스를 축소하기 위해 SQL Server를 단일 사용자 모드에서 실행하지 않아도 됩니다.

로그 파일의 경우, SQL Server는 target_size를 사용하여 전체 로그의 대상 크기를 계산합니다. 따라서 target_size는 축소 후 로그에 남겨질 여유 공간의 크기입니다. 그런 다음 전체 로그의 대상 크기가 각 로그 파일의 대상 크기로 변환됩니다. DBCC SHRINKFILE은 즉시 각 물리적 로그 파일을 대상 크기로 축소하려고 시도합니다. 가상 로그에 있는 논리 로그 중에서 로그 파일의 대상 크기 이후에 있는 부분이 없는 경우에는 파일이 성공적으로 잘라지며 DBCC SHRINKFILE은 메시지를 표시하지 않고 완료됩니다. 그러나 가상 로그에 대상 크기 이후에 있는 논리 로그 부분이 있는 경우 SQL Server는 가능한 한 많은 공간을 해제하고 정보 메시지를 표시합니다. 이 메시지는 파일 끝의 가상 로그에서 논리 로그를 제거하기 위해 사용자가 수행해야 하는 작업을 알려 줍니다. 이 작업을 수행한 후에는 DBCC SHRINKFILE 명령을 다시 실행하여 나머지 공간을 해제할 수 있습니다. 트랜잭션 로그 축소에 대한 자세한 내용은 트랜잭션 로그 축소를 참조하십시오.

로그 파일은 가상 로그 파일 크기만큼만 축소할 수 있으므로 사용 중이 아닌 로그 파일이라도 가상 로그 파일의 크기보다 작게 축소할 수는 없습니다. 예를 들어, 로그 파일이 1GB인 데이터베이스는 로그 파일을 128MB까지만 축소할 수 있습니다. 잘라내기에 대한 자세한 내용은 트랜잭션 로그 잘라내기를 참조하십시오. 가상 로그 파일 크기를 확인하는 방법에 대해서는 가상 로그 파일을 참조하십시오.

결과 집합

다음 표는 결과 집합의 열을 설명한 것입니다.

  
열 이름 설명
DbId 축소할 파일의 데이터베이스 ID 번호
FileId 축소할 파일의 파일ID 번호
CurrentSize 현재 파일이 차지하고 있는 8KB 페이지의 수
MinimumSize 파일이 최소한으로 차지할 수 있는 8KB 페이지의 수. 이것은 파일의 최소 크기나 원래 만들어진 크기와 일치합니다.
UsedPages 현재 파일에서 사용되는 8KB 페이지의 수
EstimatedPages SQL Server에서 예상하는 파일 축소 가능 크기에 해당하는 8KB 페이지의 수
 

사용 권한

DBCC SHRINKFILE 권한은 sysadmin 고정 서버 역할이나 db_owner 고정 데이터베이스 역할의 구성원에게 기본적으로 부여되며, 양도할 수 없습니다.

예제

다음은 UserDB 사용자 데이터베이스에서 DataFil1이라는 파일의 크기를 7MB로 줄이는 예제입니다.

USE UserDB
GO
DBCC SHRINKFILE (DataFil1, 7)
GO