다음을 통해 공유


tempdb 데이터베이스 축소

적용 대상: SQL Server Azure SQL Managed Instance

이 문서에서는 SQL Server에서 tempdb 데이터베이스를 축소 하는 데 사용할 수 있는 다양한 방법을 설명합니다.

tempdb의 크기를 변경하기 위해 다음 중에서 원하는 방법을 사용할 수 있습니다. 이 문서에서는 처음 세 가지 옵션에 대해 설명합니다. SQL Server Management Studio(SSMS)를 사용하려면 데이터베이스 축소 지침을 따릅니다.

메서드 다시 시작이 필요합니까? 자세한 정보
ALTER DATABASE 기본 tempdb 파일(tempdevtemplog)의 크기를 완벽하게 제어할 수 있습니다.
DBCC SHRINKDATABASE 아니요 데이터베이스 수준에서 작동합니다.
DBCC SHRINKFILE 아니요 개별 파일을 축소할 수 있습니다.
SQL Server Management Studio 아니요 그래픽 사용자 인터페이스를 통해 데이터베이스 파일을 축소합니다.

설명

기본적으로 tempdb 데이터베이스는 필요에 따라 자동 증가하도록 구성됩니다. 따라서 이 데이터베이스는 시간이 지나면 원하는 크기보다 큰 크기로 예기치 않게 증가할 수 있습니다. tempdb 데이터베이스 크기가 더 커져도 SQL Server의 성능에 부정적인 영향을 주지 않습니다.

SQL Server가 시작되면 tempdb 데이터베이스의 복사본을 사용하여 model이(가) 다시 만들어지고 tempdb이(가) 마지막으로 구성된 크기로 다시 설정됩니다. 구성된 크기는 ALTER DATABASE 옵션 또는 DBCC SHRINKFILE이나 DBCC SHRINKDATABASE 문을 사용하는 MODIFY FILE과(와) 같이 파일 크기 변경 작업을 사용하여 설정한 마지막 명시적 크기입니다. 따라서 다른 값을 사용하거나 큰 tempdb 데이터베이스에 대한 즉각적인 해결을 얻을 필요가 없는 한 SQL Server 서비스의 다음 다시 시작이 크기가 감소할 때까지 기다릴 수 있습니다.

tempdb 활동이 진행되는 동안 tempdb을(를) 축소할 수 있습니다. 그러나 차단, 교착 상태 등과 같은 다른 오류가 발생할 수 있으므로 축소가 완료되지 않도록 방지할 수 있습니다. 따라서 tempdb 축소가 성공하도록 하려면 서버가 단일 사용자 모드이거나 모든 tempdb 활동을 중지한 경우 이 작업을 수행하는 것이 좋습니다.

SQL Server는 tempdb 트랜잭션 로그에 트랜잭션을 롤백하기에 충분한 정보만 기록하지만 데이터베이스 복구 중에는 트랜잭션을 다시 실행하지 않습니다. 이 기능은 INSERT에서 tempdb문의 성능을 향상시킵니다. 또한 SQL Server를 다시 시작할 때마다 tempdb이(가) 다시 생성되므로 트랜잭션을 다시 실행하기 위해 정보를 기록할 필요가 없습니다. 따라서 롤아웃하거나 롤백할 트랜잭션이 없습니다.

tempdb 관리 및 모니터링에 대한 자세한 내용은 용량 계획tempdb 사용 모니터링을 참조하세요.

ALTER DATABASE 명령 사용

참고 항목

이 명령은 기본 tempdb 논리 파일 tempdevtemplog에서만 작동합니다. 추가 파일이 tempdb에 추가되면 SQL Server를 서비스로 다시 시작한 후 축소할 수 있습니다. 모든 tempdb 파일은 시작하는 동안 다시 만들어집니다. 그러나 비어 있으며 제거할 수 있습니다. tempdb 내의 추가 파일을 제거하려면 ALTER DATABASE 옵션과 함께 REMOVE FILE 명령을 사용합니다.

이 방법을 사용하려면 SQL Server를 다시 시작해야 합니다.

  1. SQL Server를 중지합니다.

  2. 명령 프롬프트의 최소 구성 모드에서 인스턴스를 시작합니다. 이렇게 하려면 다음 단계를 수행하세요.

    1. 명령 프롬프트에서 SQL Server가 설치된 폴더로 변경합니다(다음 예시에서 <VersionNumber><InstanceName> 바꾸기).

      cd C:\Program Files\Microsoft SQL Server\MSSQL<VersionNumber>.<InstanceName>\MSSQL\Binn
      
    2. 인스턴스가 SQL Server의 명명된 인스턴스인 경우 다음 명령을 실행합니다(다음 예시에서 <InstanceName> 바꾸기).

      sqlservr.exe -s <InstanceName> -c -f -mSQLCMD
      
    3. 인스턴스가 SQL Server의 기본 인스턴스인 경우 다음 명령을 실행합니다.

      sqlservr -c -f -mSQLCMD
      

      참고 항목

      -c-f 매개 변수로 인해 SQL Server는 데이터 파일의 tempdb 크기가 1MB이고 로그 파일의 크기가 0.5MB인 최소 구성 모드에서 시작됩니다. 이 -mSQLCMD 매개 변수는 sqlcmd 이외의 다른 애플리케이션이 단일 사용자 연결을 인수하지 못하도록 합니다.

  3. sqlcmd로 SQL Server에 연결한 다음 다음 Transact-SQL 명령을 실행합니다. <target_size_in_MB>을(를) 원하는 크기로 바꿉니다.

    ALTER DATABASE tempdb MODIFY FILE
    (NAME = 'tempdev', SIZE = <target_size_in_MB>);
    
    ALTER DATABASE tempdb MODIFY FILE
    (NAME = 'templog', SIZE = <target_size_in_MB>);
    
  4. SQL Server를 중지합니다. 이렇게 하려면 Ctrl+C을(를) 명령 프롬프트 창에서 누르고 SQL Server를 서비스로 다시 시작한 다음 tempdb.mdftemplog.ldf 파일의 크기를 확인합니다.

DBCC SHRINKDATABASE 명령 사용

DBCC SHRINKDATABASE은(는) 매개 변수 target_percent을(를) 수신합니다. 데이터베이스가 축소된 후 데이터베이스 파일에 남아 있는 사용 가능한 공간의 원하는 백분율입니다. DBCC SHRINKDATABASE을(를) 사용하는 경우 SQL Server를 다시 시작해야 할 수 있습니다.

  1. tempdb 저장 프로시저를 사용하여 현재 sp_spaceused에서 사용되는 공간을 결정합니다. 그런 다음 DBCC SHRINKDATABASE 매개 변수로 사용할 여유 공간의 백분율을 계산합니다. 이 계산은 원하는 데이터베이스 크기를 기반으로 합니다.

    참고 항목

    경우에 따라 사용되는 공간을 다시 계산하고 업데이트된 보고서를 가져오기 위해 sp_spaceused @updateusage = true을(를) 실행해야 할 수 있습니다. 자세한 내용은 sp_spaceused를 참조하세요.

    다음 예시를 참조하세요.

    tempdb에 1,024MB인 기본 데이터 파일(tempdb.mdf)과 360MB인 로그 파일(tempdb.ldf)의 2개 파일이 있는 것으로 가정합니다. sp_spaceused이(가) 기본 데이터 파일에 600MB의 데이터가 포함되어 있다고 보고한다고 가정합니다. 또한 기본 데이터 파일을 800MB로 축소한다고 가정합니다. 축소 후 남은 여유 공간의 원하는 백분율을 계산합니다. 800MB - 600MB = 200MB. 이제 200MB를 800MB로 나누면, 25%이 되는데, 이것이 target_percent입니다. 따라서 트랜잭션 로그 파일은 축소되어 데이터베이스가 축소된 후 25% 또는 200MB의 공간을 확보합니다.

  2. SSMS, Azure Data Studio 또는 sqlcmd를 사용하여 SQL Server에 연결한 후 다음 Transact-SQL 명령을 실행합니다. <target_percent>을(를) 원하는 백분율로 바꿉니다.

    DBCC SHRINKDATABASE (tempdb, '<target_percent>');
    

DBCC SHRINKDATABASE에 대한 tempdb 명령에는 제한이 있습니다. 데이터 및 로그 파일의 대상 크기는 데이터베이스를 만들 때 지정한 크기보다 작거나 ALTER DATABASE 옵션을 사용하는 MODIFY FILE와(과) 같은 파일 크기 변경 작업을 사용하여 명시적으로 설정한 마지막 크기보다 작을 수 없습니다. 또 다른 DBCC SHRINKDATABASE 제한 사항은 target_percentage 매개 변수의 계산과 사용되는 현재 공간에 대한 종속성입니다.

DBCC SHRINKFILE 명령 사용

DBCC SHRINKFILE 명령을 사용하여 개별 tempdb 파일을 축소합니다. DBCC SHRINKFILE은(는) 동일한 데이터베이스에 속한 다른 파일에 영향을 주지 않고 단일 데이터베이스 파일에서 사용할 수 있기 때문에 DBCC SHRINKDATABASE보다 더 많은 유연성을 제공합니다. DBCC SHRINKFILE은(는) 매개 변수 target_size을(를) 수신합니다. 데이터베이스 파일에 대해 원하는 최종 크기입니다.

  1. 기본 데이터 파일(tempdb.mdf), 로그 파일(templog.ldf) 및 tempdb에 추가된 추가 파일에 대해 원하는 크기를 결정합니다. 파일에 사용되는 공간이 원하는 대상 크기보다 작거나 같은지 확인합니다.

  2. SSMS, Azure Data Studio 또는 sqlcmd를 사용하여 SQL Server에 연결한 후 축소할 특정 데이터베이스 파일에 대해 다음 Transact-SQL 명령을 실행합니다. <target_size_in_MB>을(를) 원하는 크기로 바꿉니다.

    USE tempdb;
    GO
    
    -- This command shrinks the primary data file
    DBCC SHRINKFILE (tempdev, '<target_size_in_MB>');
    GO
    
    -- This command shrinks the log file, examine the last paragraph.
    DBCC SHRINKFILE (templog, '<target_size_in_MB>');
    GO
    

DBCC SHRINKFILE의 장점은 파일의 크기를 원래 크기보다 작은 크기로 줄일 수 있다는 것입니다. 데이터 또는 로그 파일에 대해 DBCC SHRINKFILE을(를) 실행할 수 있습니다. model 데이터베이스 크기를 데이터베이스 크기보다 작게 만들 수는 없습니다.

축소 작업을 실행할 때 오류 8909

tempdb을(를) 사용 중인 경우 DBCC SHRINKDATABASE 또는 DBCC SHRINKFILE 명령을 사용하여 축소하려는 경우 사용 중인 SQL Server 버전에 따라 다음과 유사한 메시지를 받을 수 있습니다.

Server: Msg 8909, Level 16, State 1, Line 1 Table error: Object ID 0, index ID -1, partition ID 0, alloc unit ID 0 (type Unknown), page ID (6:8040) contains an incorrect page ID in its page header. The PageId in the page header = (0:0).

이 오류는 tempdb의 실제 손상을 나타내지 않습니다. 그러나 오류 8909와 같은 물리적 데이터 손상 오류에 대한 다른 이유가 있을 수 있으며 이러한 원인에는 I/O 하위 시스템 문제가 포함됩니다. 따라서 축소 작업 외부에서 오류가 발생하는 경우 더 많은 조사를 수행해야 합니다.

8909 메시지가 애플리케이션 또는 축소 작업을 실행하는 사용자에게 반환되어도 축소 작업은 실패하지 않습니다.