SQL Server를 다시 시작하지 않고 tempdb.mdf 크기를 줄이거 나 줄이는 방법이 있습니까?


15

이 후 SQL Server를 다시 시작하는 것이 필요하다 DBCC SHRINKFILEtempdb.mdf또는의 크기를 줄일 수있는 다른 방법이 tempdb.mdfSQL 서버를 다시 시작하지 않고는?

프로덕션 서버에 이것이 필요하므로 친절하게 도움이되며 중단 시간없이 축소를 수행하기를 희망합니다.


2
DBCC SHRINKFILE에는 서비스를 다시 시작할 필요가 없습니다.
Greg

tempdb는 사용 중이므로 축소 할 수 없습니다. 그리고 네, 이것에 대한 해결책이 있지만 매우 깨끗하지 않고 부작용이 있습니다.
Ionic

답변:


15

이 방법으로 할 수 있습니다 :

-- write everything from your buffers to the disc!
CHECKPOINT; 
GO
-- Clean all buffers and caches
DBCC DROPCLEANBUFFERS; 
DBCC FREEPROCCACHE;
DBCC FREESYSTEMCACHE('ALL');
DBCC FREESESSIONCACHE;
GO
-- Now shrink the file to your desired size
DBCC SHRINKFILE (TEMPDEV, 40960);
-- Make sure that there is no running transaction which uses the tempdb while shrinking!
-- This is most trickiest part of it all.
GO

마지막 단계가 가장 까다 롭습니다. 축소 프로세스 중에는 작업을 중단시킬 수 있으므로 다른 작업으로 tempdb를 사용해서는 안됩니다 SHRINKFILE. tempdb는 매우 쉽게 축소 할 수 있기 때문에 오래 걸리지 않습니다.

이것이 "소프트 재시작"과 같은 것임을 명심하십시오. 버퍼에서 모든 것이 제거되고 디스크에 기록됩니다. 이는 모든 쓰기 작업을 처리해야하므로 I / O 하위 시스템 (쓰기)에 영향을 미칩니다. 그런 다음 파일을 읽고 (읽기 및 쓰기 성능에 영향을 미침) 결국 테이블을 쿼리하는 모든 프로세스는 I / O 서브 시스템에서 버퍼로 데이터를 다시 검색해야합니다. 다시 시작하는 것 이상을 아프게 할 수 있습니다.

개발 시스템을 실행중인 경우이 방법 대신 시스템을 다시 시작하면됩니다. 그러나 장애 조치 파트너가없는 일부 프로덕션 시스템에서는 이것이 유용 할 수 있습니다.


좋은 설명을 해준 Ionic에게 감사합니다. 내 경우 tempdb.mdf는 46GB입니다. 진행중인 거래가 없으면 100 %로 축소 할 수 있습니다. 친절하게 제안하십시오.
Manii

예, 40960MB는 단지 예일뿐입니다. 내 시스템에서 tempdb는 ~ 50GB에서 정상적으로 실행되며 드물게 200GB로 증가합니다. :-)
Ionic

<pre> DBCC SHRINKFILE (tempdev, 1024)로 쿼리를 실행합니다. </ b> </ b> 그리고 공간을 비 웠지만 다시 실행합니다 </ b> </ b> DBCC SHRINKFILE (tempdev, 30000); </ b> </ b> 결과는 다음과 같습니다. </ b> </ b> DbId 필드 현재 크기 최소 크기 사용 된 페이지 예상 페이지 수 </ b> 2 1 5699352 1024 696 696 </ b> </ b> 그러나 확인 된 tempdb 크기는 줄어들지 않았습니다. </ pre>
Manii

트랜잭션이 축소되는 동안 tempdb를 사용하는 경우이 메시지가 발생할 수 있습니다. 정의 된 축소 크기 (~ 30GB)가 tempdb의 무료 한도를 초과 할 수도 있습니다.
Ionic

1

아래 단계만으로 갈 수 있습니다.

USE tempdb;
GO;
dbcc freeproccache;
DBCC SHRINKFILE (tempdb_file_name, memory_in_MB);
GO;

위의 답변과 어떻게 다른가요?
Kin Shah

1
안녕하세요 Kin, Tempdb 파일 크기는 DBCC FREEPROCCACHE로 줄어 듭니다. tempdb 파일을 축소하십시오. 수축 tempdb에 대해서는 아래 진술이 필요하지 않습니다. DBCC DROPCLEANBUFFERS; DBCC FREESYSTEMCACHE ( 'ALL'); DBCC FREESESSIONCACHE;
JERRY

1
이것은 가장 간단한 대답입니다. 대부분의 경우 tempdb를 줄일 수 있도록 DBCC FREEPROCCACHE 만 필요합니다. 관련 질문보기
James Jenkins
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.