DBCC SHRINKFILE(Transact-SQL)DBCC SHRINKFILE (Transact-SQL)

이 항목은 다음에 적용됩니다.예SQL Server(2008부터)예Azure SQL Database아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

현재 데이터베이스에 대해 지정한 데이터 또는 로그 파일의 크기를 축소하거나 지정한 파일의 데이터를 같은 파일 그룹의 다른 파일로 이동하여 파일을 비우고 데이터베이스에서 제거할 수 있도록 합니다.Shrinks the size of the specified data or log file for the current database, or empties a file by moving the data from the specified file to other files in the same filegroup, allowing the file to be removed from the database. 파일을 만들 때 지정한 크기보다 작게 파일을 축소할 수 있습니다.You can shrink a file to a size that is less than the size specified when it was created. 이 작업은 최소 파일 크기를 새 값으로 다시 설정합니다.This resets the minimum file size to the new value.

항목 링크 아이콘 Transact-SQL 구문 규칙Topic link icon Transact-SQL Syntax Conventions

구문Syntax


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

인수Arguments

file_namefile_name
축소할 파일의 논리적 이름입니다.Is the logical name of the file to be shrunk.

file_idfile_id
축소할 파일의 ID 번호입니다.Is the identification (ID) number of the file to be shrunk. 파일 ID를 가져오려면 FILE_IDEX 시스템 함수를 사용하거나 현재 데이터베이스의 sys.database_files 카탈로그 뷰를 쿼리합니다.To obtain a file ID, use the FILE_IDEX system function or query the sys.database_files catalog view in the current database.

target_sizetarget_size
정수로 표시된 파일 크기(MB)입니다.Is the size for the file in megabytes, expressed as an integer. 이 값을 지정하지 않으면 DBCC SHRINKFILE은 파일 크기를 기본 파일 크기로 줄입니다.If not specified, DBCC SHRINKFILE reduces the size to the default file size. 기본 크기는 파일을 만들 때 지정한 크기입니다.The default size is the size specified when the file was created.

참고

DBCC SHRINKFILE target_size를 사용하여 빈 파일의 기본 크기를 줄일 수 있습니다.You can reduce the default size of an empty file by using DBCC SHRINKFILE target_size. 예를 들어 5MB 파일을 만든 다음 파일이 아직 비어 있을 때 파일을 3MB로 줄이면 기본 파일 크기가 3MB로 설정됩니다.For example, if you create a 5-MB file and then shrink the file to 3 MB while the file is still empty, the default file size is set to 3 MB. 이 내용은 데이터가 포함된 적이 없는 빈 파일에만 적용됩니다.This applies only to empty files that have never contained data.

이 옵션은 FILESTREAM 파일 그룹 컨테이너에 대해 지원되지 않습니다.This option is not supported for FILESTREAM filegroup containers.
target_size가 지정되면 DBCC SHRINKFILE은 지정한 크기로 파일을 축소하려고 합니다.If target_size is specified, DBCC SHRINKFILE tries to shrink the file to the specified size. 파일의 해제될 부분에서 사용된 페이지는 보유된 부분의 사용 가능한 공간에 재배치됩니다.Used pages in the part of the file to be freed are relocated to available free space in the part of the file retained. 예를 들어 10MB의 데이터 파일이 있는 경우 target_size가 8인 DBCC SHRINKFILE 작업은 파일의 마지막 2MB에서 사용된 모든 페이지를 파일의 처음 8MB에서 할당되지 않은 페이지에 다시 할당합니다.For example, if there is a 10-MB data file, a DBCC SHRINKFILE operations with a target_size of 8 causes all used pages in the last 2 MB of the file to be reallocated into any unallocated pages in the first 8 MB of the file. DBCC SHRINKFILE은 파일에 데이터를 저장하는 데 필요한 크기 이하로 파일을 축소하지 않습니다.DBCC SHRINKFILE does not shrink a file past the size needed to store the data in the file. 예를 들어 10MB 데이터 파일에서 7MB가 사용되는 경우 target_size가 6인 DBCC SHRINKFILE 문은 파일을 6MB가 아니라 7MB로만 축소합니다.For example, if 7 MB of a 10-MB data file is used, a DBCC SHRINKFILE statement with a target_size of 6 shrinks the file to only 7 MB, not 6 MB.

EMPTYFILEEMPTYFILE
지정한 파일의 모든 데이터를 동일한 파일 그룹의 다른 파일로 마이그레이션합니다.Migrates all data from the specified file to other files in the same filegroup. 즉, EmptyFile은 지정된 파일의 데이터를 동일한 파일 그룹의 다른 파일로 마이그레이션합니다.In other words, EmptyFile will migrate the data from the specified file to other files in the same filegroup. EmptyFile은 파일에 읽기 전용이라는 표시가 없더라도 새 데이터가 해당 파일에 추가되지 않도록 합니다. 이 파일은 ALTER DATABASE 문을 사용하여 제거할 수 있습니다.Emptyfile assures you that no new data will be added to the file, despite this file not being marked as read only.The file can be removed by using the ALTER DATABASE statement. ALTER DATABASE 문을 사용하여 파일 크기가 변경되면 읽기 전용 플래그를 다시 설정하고 데이터를 추가할 수 있습니다.If the file size is altered using ALTER DATABASE statement, the read only flag is reset and data can be added.

FILESTREAM 파일 그룹 컨테이너의 경우 ALTER DATABASE를 사용하여 파일을 제거하려면 FILESTREAM 가비지 수집기가 실행되어 EMPTYFILE이 다른 컨테이너에 복사한 필요 없는 파일 그룹 컨테이너 파일을 모두 삭제해야 합니다.For FILESTREAM filegroup containers, the file cannot be removed using ALTER DATABASE until the FILESTREAM Garbage Collector has run and deleted all the unnecessary filegroup container files that EMPTYFILE has copied to another container. 자세한 내용은 sp_filestream_force_garbage_collection(Transact-SQL)을 참조하세요.For more information, see sp_filestream_force_garbage_collection (Transact-SQL)

참고

FILESTREAM 컨테이너를 제거하는 방법에 대한 내용은 ALTER DATABASE 파일 및 파일 그룹 옵션(Transact-SQL)에서 해당 섹션을 참조하세요.For information on removing a FILESTREAM container, see the corresponding section in ALTER DATABASE File and Filegroup Options (Transact-SQL)

NOTRUNCATENOTRUNCATE
target_percent의 지정 여부와 관계없이 데이터 파일의 끝에서 할당된 페이지를 파일 앞의 할당되지 않은 페이지로 이동합니다.Moves allocated pages from the end of a data file to unallocated pages in the front of the file with or without specifying target_percent. 파일 끝의 여유 공간이 운영 체제에 반환되지 않고, 파일의 물리적 크기가 변경되지 않습니다.The free space at the end of the file is not returned to the operating system, and the physical size of the file does not change. 그러므로 NOTRUNCATE를 지정하면 파일이 축소되지 않는 것처럼 보입니다.Therefore, when NOTRUNCATE is specified, the file appears not to shrink. NOTRUNCATE는 데이터 파일에만 적용되며NOTRUNCATE is applicable only to data files. 로그 파일에는 영향을 주지 않습니다.The log files are not affected. 이 옵션은 FILESTREAM 파일 그룹 컨테이너에 대해 지원되지 않습니다.This option is not supported for FILESTREAM filegroup containers.

TRUNCATEONLYTRUNCATEONLY
파일 끝의 모든 여유 공간을 운영 체제로 해제하지만 파일 내에서 페이지 이동을 수행하지 않습니다.Releases all free space at the end of the file to the operating system but does not perform any page movement inside the file. 데이터 파일은 마지막으로 할당된 익스텐트까지만 축소됩니다.The data file is shrunk only to the last allocated extent. TRUNCATEONLY로 지정되면 target_size가 무시됩니다.target_size is ignored if specified with TRUNCATEONLY.
TRUNCATEONLY 옵션은 로그에 있는 정보를 이동시키지 않습니다. 하지만 로그 파일의 끝에서 비활성 상태의 VLF를 제거합니다.The TRUNCATEONLY option does not move information in the log, but does remove inactive VLFs from the end of the log file. 이 옵션은 FILESTREAM 파일 그룹 컨테이너에 대해 지원되지 않습니다.This option is not supported for FILESTREAM filegroup containers.

WITH NO_INFOMSGSWITH NO_INFOMSGS
모든 정보 메시지를 표시하지 않습니다.Suppresses all informational messages.

결과 집합Result Sets

다음 표에서는 결과 집합의 열을 설명합니다.The following table describes the columns in the result set.

열 이름Column name 설명Description
DbIdDbId 데이터베이스 엔진Database Engine에서 축소하려고 시도한 파일의 데이터베이스 ID입니다.Database identification number of the file the 데이터베이스 엔진Database Engine tried to shrink.
FileIdFileId 데이터베이스 엔진Database Engine에서 축소하려고 시도한 파일의 파일 ID입니다.The file identification number of the file the 데이터베이스 엔진Database Engine tried to shrink.
CurrentSizeCurrentSize 현재 파일이 차지하고 있는 8KB 페이지의 수입니다.Number of 8-KB pages the file currently occupies.
MinimumSizeMinimumSize 파일이 최소한으로 차지할 수 있는 8KB 페이지의 수입니다.Number of 8-KB pages the file could occupy, at minimum. 이 값은 파일의 최소 크기나 원래 만들어졌을 때의 크기와 일치합니다.This corresponds to the minimum size or originally created size of a file.
UsedPagesUsedPages 현재 파일에서 사용되는 8KB 페이지의 수입니다.Number of 8-KB pages currently used by the file.
EstimatedPagesEstimatedPages 데이터베이스 엔진Database Engine에서 예상하는 파일 축소 가능 크기에 해당하는 8KB 페이지의 수입니다.Number of 8-KB pages that the 데이터베이스 엔진Database Engine estimates the file could be shrunk down to.

RemarksRemarks

DBCC SHRINKFILE은 현재 데이터베이스의 파일에만 적용됩니다.DBCC SHRINKFILE applies to the files in the current database. 현재 데이터베이스를 변경하는 방법에 대한 자세한 내용은 USE(Transact-SQL)를 참조하세요.For more information about how to change the current database, see USE (Transact-SQL).

DBCC SHRINKFILE 작업은 진행 도중에 언제든지 중지될 수 있으며 완료된 작업은 모두 그대로 보존됩니다.DBCC SHRINKFILE operations can be stopped at any point in the process, and any completed work is retained. 파일에 EMPTYFILE 매개 변수가 사용되고 작업이 취소되는 경우 다른 데이터가 추가되지 않도록 파일이 표시되지 않습니다.If the EMPTYFILE parameter is used on a file and the operation is cancelled, the file will not be marked to prevent additional data from being added.

DBCC SHRINKFILE 작업이 실패하면 오류가 발생합니다.When a DBCC SHRINKFILE operation fails, an error is raised.

축소할 데이터베이스는 단일 사용자 모드가 아니어도 됩니다. 즉, 다른 사용자가 데이터베이스에서 작업 중이라도 파일을 축소할 수 있습니다.The database being shrunk does not have to be in single-user mode; other users can be working in the database when the file is shrunk. 시스템 데이터베이스를 축소하기 위해 SQL ServerSQL Server 인스턴스를 단일 사용자 모드에서 실행하지 않아도 됩니다.You do not have to run the instance of SQL ServerSQL Server in single-user mode to shrink the system databases.

로그 파일 축소Shrinking a Log File

로그 파일의 경우 데이터베이스 엔진Database Engine에서는 target_size를 사용하여 전체 로그의 대상 크기를 계산합니다. 따라서 target_size는 축소 작업 후 로그에서 사용 가능한 공간의 크기입니다.For log files, the 데이터베이스 엔진Database Engine uses target_size to calculate the target size for the whole log; therefore, target_size is the amount of free space in the log after the shrink operation. 그런 다음 전체 로그의 대상 크기가 각 로그 파일의 대상 크기로 변환됩니다.Target size for the whole log is then translated to target size for each log file. DBCC SHRINKFILE은 즉시 각 물리적 로그 파일을 대상 크기로 축소하려고 시도합니다.DBCC SHRINKFILE tries to shrink each physical log file to its target size immediately. 그러나 가상 로그에 대상 크기보다 큰 논리 로그 부분이 있는 경우 데이터베이스 엔진Database Engine은 가능한 한 많은 공간을 해제하고 정보용 메시지를 표시합니다.However, if part of the logical log resides in the virtual logs beyond the target size, the 데이터베이스 엔진Database Engine frees as much space as possible, and then issues an informational message. 이 메시지는 파일 끝의 가상 로그에서 논리 로그를 이동하기 위해 수행해야 하는 동작을 설명합니다.The message describes what actions are required to move the logical log out of the virtual logs at the end of the file. 동작이 수행되고 나면 DBCC SHRINKFILE을 사용하여 나머지 공간을 확보할 수 있습니다.After the actions are performed, DBCC SHRINKFILE can be used to free the remaining space.

로그 파일은 가상 로그 파일 크기만큼만 축소할 수 있으므로 사용 중이 아닌 로그 파일이라도 가상 로그 파일의 크기보다 작게 축소할 수는 없습니다.Because a log file can only be shrunk to a virtual log file boundary, shrinking a log file to a size smaller than the size of a virtual log file might not be possible, even if it is not being used. 로그 파일이 생성되거나 확장될 때 데이터베이스 엔진Database Engine에서 동적으로 가상 로그 파일의 크기가 선택됩니다.The size of the virtual log file is chosen dynamically by the 데이터베이스 엔진Database Engine when log files are created or extended.

최선의 구현 방법Best Practices

파일을 축소할 때는 다음 정보를 고려하십시오.Consider the following information when you plan to shrink a file:

  • 축소 작업은 테이블 잘라내기 또는 테이블 삭제 작업과 같이 사용되지 않는 공간이 많이 생기는 작업을 수행한 후에 가장 효과적입니다.A shrink operation is most effective after an operation that creates lots of unused space, such as a truncate table or a drop table operation.
  • 대부분의 데이터베이스에는 정기적인 일상 작업에 사용 가능한 일정 여유 공간이 필요합니다.Most databases require some free space to be available for regular day-to-day operations. 데이터베이스를 반복해서 축소했지만 데이터베이스 크기가 다시 늘어나는 경우 일반 작업을 위해 축소된 공간이 필요한 것입니다.If you shrink a database repeatedly and notice that the database size grows again, this indicates that the space that was shrunk is required for regular operations. 이러한 경우 데이터베이스를 반복해서 축소하는 것은 불필요한 작업입니다.In these cases, repeatedly shrinking the database is a wasted operation.
  • 축소 작업은 데이터베이스 인덱스의 조각화 상태를 보존하지 않으며 일반적으로 조각화 정도를 어느 정도까지 늘리기도 합니다.A shrink operation does not preserve the fragmentation state of indexes in the database, and generally increases fragmentation to a degree. 이것은 데이터베이스를 반복해서 축소하지 않아야 하는 또 다른 이유입니다.This is another reason not to repeatedly shrink the database.
  • 동일한 데이터베이스의 여러 파일을 동시에 축소하지 않고 순차적으로 축소합니다.Shrink multiple files in the same database sequentially instead of concurrently. 시스템 테이블에 대한 경합으로 인해 차단 때문에 지연될 수 있습니다.Contention on system tables can cause delays due to blocking.

문제 해결Troubleshooting

이 섹션에서는 DBCC SHRINKFILE 명령을 실행할 때 발생할 수 있는 문제를 진단하고 해결하는 방법에 대해 설명합니다.This section describes how to diagnose and correct issues that can occur when running the DBCC SHRINKFILE command.

파일이 축소되지 않음The File Does Not Shrink

축소 작업이 오류 없이 실행되지만 파일 크기가 변경되지 않은 것처럼 보이면 다음 작업 중 하나를 수행하여 파일에 제거할 여유 공간이 있는지 확인합니다.If the shrink operation runs without error, but the file does not appear to have changed in size, verify that the file has adequate free space to remove by performing one of the following operations:

  • 다음 쿼리를 실행합니다.Run the following query.
SELECT name ,size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB
FROM sys.database_files;
  • DBCC SQLPERF 명령을 실행하여 트랜잭션 로그에 사용된 공간을 반환합니다.Run the DBCC SQLPERF command to return the space used in the transaction log.
    사용 가능한 여유 공간이 충분하지 않으면 축소 작업에서 파일 크기를 더 이상 줄일 수 없습니다.If insufficient free space is available, the shrink operation cannot reduce the file size any further.

일반적으로 축소되지 않는 것처럼 보이는 파일은 로그 파일입니다.Typically it is the log file that appears not to shrink. 이는 로그 파일이 잘리지 않았기 때문입니다.This is usually the result of a log file that has not been truncated. 데이터베이스 복구 모델을 SIMPLE로 설정하거나 로그를 백업한 다음 DBCC SHRINKFILE 작업을 다시 실행하여 로그를 자를 수 있습니다.You can truncate the log by setting the database recovery model to SIMPLE, or by backing up the log and then running the DBCC SHRINKFILE operation again.

축소 작업이 차단됨The Shrink Operation Is Blocked

행 버전 관리 기반 격리 수준에서 실행 중인 트랜잭션에 의해 축소 작업이 차단될 수 있습니다.It is possible for shrink operations to be blocked by a transaction that is running under a row versioning-based isolation level. 예를 들어 DBCC SHRINK DATABASE 작업을 실행할 때 행 버전 관리 기반 격리 수준에서 실행 중인 대규모 삭제 작업이 진행되고 있으면 축소 작업은 파일을 축소하기 전에 삭제 작업이 완료될 때까지 기다립니다.For example, if a large delete operation running under a row versioning-based isolation level is in progress when a DBCC SHRINK DATABASE operation is executed, the shrink operation will wait for the delete operation to complete before shrinking the files. 이러한 경우 DBCC SHRINKFILE과 DBCC SHRINKDATABASE 작업은 처음 한 시간 동안에는 5분마다 그리고 그 다음부터는 한 시간마다 SQL Server 오류 로그에 정보 메시지(SHRINKDATABASE의 경우 5202, SHRINKFILE의 경우 5203)를 인쇄합니다.When this happens, DBCC SHRINKFILE and DBCC SHRINKDATABASE operations print out an informational message (5202 for SHRINKDATABASE and 5203 for SHRINKFILE) to the SQL Server error log every five minutes in the first hour and then every hour after that. 예를 들어 오류 로그에 다음 오류 메시지가 포함된 경우 다음과 같은 오류가 발생합니다.For example, if the error log contains the following error message then the following error will occur:

DBCC SHRINKFILE for file ID 1 is waiting for the snapshot   
transaction with timestamp 15 and other snapshot transactions linked to   
timestamp 15 or with timestamps older than 109 to finish.  

이는 축소 작업이 완료된 마지막 트랜잭션인 109보다 오래된 타임스탬프가 있는 스냅숏 트랜잭션에 의해 축소 작업이 차단됨을 의미합니다.This means that the shrink operation is blocked by snapshot transactions that have timestamps older than 109, which is the last transaction that the shrink operation completed. 또한 sys.dm_tran_active_snapshot_database_transactions 동적 관리 뷰의 transaction_sequence_num 또는 first_snapshot_sequence_num 열에 15인 값이 포함되어 있음을 나타냅니다.It also indicates that the transaction_sequence_num, or first_snapshot_sequence_num columns in the sys.dm_tran_active_snapshot_database_transactions dynamic management view contains a value of 15. 뷰의 transaction_sequence_num 또는 first_snapshot_sequence_num 열에 포함된 숫자가 축소 작업이 완료된 마지막 트랜잭션(109)보다 작으면 축소 작업은 해당 트랜잭션이 완료될 때까지 대기합니다.If either the transaction_sequence_num, or first_snapshot_sequence_num columns in the view contains a number that is less than the last transaction completed by a shrink operation (109), the shrink operation will wait for those transactions to finish.

문제를 해결하려면 다음 태스크 중 하나를 수행하십시오.To resolve the issue, you can do one of the following tasks:

  • 축소 작업을 차단하는 트랜잭션을 종료합니다.Terminate the transaction that is blocking the shrink operation.
  • 축소 작업을 종료합니다.Terminate the shrink operation. 축소 작업을 종료해도 완료된 작업은 모두 보존됩니다.If the shrink operation is terminated, any completed work is retained.
  • 아무 작업도 하지 않고 차단하는 트랜잭션이 완료될 때까지 축소 작업이 대기할 수 있게 합니다.Do nothing and allow the shrink operation to wait until the blocking transaction completes.

PermissionsPermissions

sysadmin 고정 서버 역할의 멤버 또는 db_owner 고정 데이터베이스 역할의 멤버여야 합니다.Requires membership in the sysadmin fixed server role or the db_owner fixed database role.

Examples

1.A. 데이터 파일을 지정한 대상 크기로 축소Shrinking a data file to a specified target size

다음 예제에서는 UserDB 사용자 데이터베이스의 DataFile1이라는 데이터 파일의 크기를 7MB로 축소합니다.The following example shrinks the size of a data file named DataFile1 in the UserDB user database to 7 MB.

USE UserDB;  
GO  
DBCC SHRINKFILE (DataFile1, 7);  
GO  

2.B. 로그 파일을 지정한 대상 크기로 축소Shrinking a log file to a specified target size

다음 예에서는 AdventureWorks 데이터베이스에 있는 로그 파일을 1MB로 축소합니다.The following example shrinks the log file in the AdventureWorks database to 1 MB. DBCC SHRINKFILE 명령이 파일을 축소할 수 있도록 먼저 데이터베이스 복구 모델을 SIMPLE로 설정하여 파일을 자릅니다.To allow the DBCC SHRINKFILE command to shrink the file, the file is first truncated by setting the database recovery model to SIMPLE.

USE AdventureWorks2012;  
GO  
-- Truncate the log by changing the database recovery model to SIMPLE.  
ALTER DATABASE AdventureWorks2012  
SET RECOVERY SIMPLE;  
GO  
-- Shrink the truncated log file to 1 MB.  
DBCC SHRINKFILE (AdventureWorks2012_Log, 1);  
GO  
-- Reset the database recovery model.  
ALTER DATABASE AdventureWorks2012  
SET RECOVERY FULL;  
GO  

3.C. 데이터 파일 자름Truncating a data file

다음 예에서는 AdventureWorks 데이터베이스의 주 데이터 파일을 자릅니다.The following example truncates the primary data file in the AdventureWorks database. sys.database_files 카탈로그 뷰를 쿼리하여 데이터 파일의 file_id를 가져옵니다.The sys.database_files catalog view is queried to obtain the file_id of the data file.

USE AdventureWorks2012;  
GO  
SELECT file_id, name  
FROM sys.database_files;  
GO  
DBCC SHRINKFILE (1, TRUNCATEONLY);  

4.D. 파일 비우기Emptying a file

다음 예에서는 데이터베이스에서 제거할 수 있도록 파일을 비우는 프로시저를 보여 줍니다.The following example demonstrates the procedure for emptying a file so that it can be removed from the database. 이 예의 목적을 위해 데이터 파일이 먼저 생성되고 파일에 데이터가 있다고 가정합니다.For the purposes of this example, a data file is first created and it is assumed that the file contains data.

USE AdventureWorks2012;  
GO  
-- Create a data file and assume it contains data.  
ALTER DATABASE AdventureWorks2012   
ADD FILE (  
    NAME = Test1data,  
    FILENAME = 'C:\t1data.ndf',  
    SIZE = 5MB  
    );  
GO  
-- Empty the data file.  
DBCC SHRINKFILE (Test1data, EMPTYFILE);  
GO  
-- Remove the data file from the database.  
ALTER DATABASE AdventureWorks2012  
REMOVE FILE Test1data;  
GO  

참고 항목See Also

ALTER DATABASE(Transact-SQL)ALTER DATABASE (Transact-SQL)
DBCC(Transact-SQL)DBCC (Transact-SQL)
DBCC SHRINKDATABASE(Transact-SQL)DBCC SHRINKDATABASE (Transact-SQL)
FILE_ID(Transact-SQL)FILE_ID (Transact-SQL)
sys.database_files(Transact-SQL)sys.database_files (Transact-SQL)
파일 축소Shrink a File