Có cách nào để giảm / thu nhỏ kích thước tempdb.mdf mà không cần khởi động lại SQL Server không


15

Có cần phải khởi động lại SQL Server sau DBCC SHRINKFILEtrên tempdb.mdfhoặc là có bất kỳ phương pháp khác để giảm kích thước của tempdb.mdfkhông khởi động lại SQL Server?

Vui lòng giúp đỡ khi tôi cần điều này cho một máy chủ sản xuất và tôi hy vọng sẽ thu nhỏ mà không mất thời gian.


2
DBCC SHRINKFILE không yêu cầu khởi động lại dịch vụ.
Greg

Bạn không thể thu nhỏ tempdb như đang sử dụng. Và vâng, có một số giải pháp cho việc này nhưng nó không sạch lắm và có một số tác dụng phụ.
Ionic

Câu trả lời:


15

Bạn có thể làm theo cách này:

-- 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

Bước cuối cùng là khó khăn nhất. Trong quá trình thu nhỏ, không có hành động nào khác nên sử dụng tempdb, vì điều này có thể gây ra hủy bỏ SHRINKFILEhoạt động của bạn . Do tempdb khá dễ thu nhỏ, nên không mất nhiều thời gian để thu nhỏ nó.

Coi chừng đây là một cái gì đó giống như "khởi động lại mềm". Tất cả mọi thứ sẽ được xóa khỏi bộ đệm và ghi vào đĩa. Điều này có nghĩa là một tác động đến hệ thống con I / O của bạn (ghi) vì nó phải xử lý tất cả các hoạt động ghi. Sau đó, bạn có thể thu nhỏ tệp (có ảnh hưởng đến hiệu suất đọc và ghi) và cuối cùng, tất cả các quy trình truy vấn bất kỳ bảng nào cũng sẽ cần truy xuất dữ liệu từ hệ thống con I / O vào bộ đệm. Điều này có thể làm tổn thương nhiều hơn là khởi động lại.

Nếu bạn đang chạy một hệ thống phát triển, bạn chỉ nên khởi động lại máy thay vì cách này. Nhưng trên một số hệ thống sản xuất không có đối tác chuyển đổi dự phòng, điều này có thể hữu ích.


cảm ơn Ionic vì lời giải thích tốt đẹp tempdb.mdf là 46 GB trong trường hợp của tôi. Nếu không có giao dịch nào đang diễn ra thì tôi có thể thu nhỏ nó lại 100% không. Vui lòng đề nghị.
Manii

Có 40960 MB chỉ là một ví dụ. Trên hệ thống của tôi, tempdb chạy bình thường ở mức ~ 50GB và trong những trường hợp hiếm hoi tăng lên 200GB. :-)
Ionic

<pre> Tôi chạy truy vấn dưới dạng DBCC SHRINKFILE (tempdev, 1024); </ b> </ b> Và nó đã giải phóng thành công không gian nhưng một lần nữa tôi chạy nó như </ b> </ b> Tôi chạy truy vấn như DBCC SHRINKFILE (tempdev, 30000); </ b> </ b> Và nó đã cho tôi kết quả như sau: </ b> </ b> Kích thước hiện tại của DbId Kích thước tối thiểu Các trang được sử dụng Trang ước tính </ b> 2 1 5699352 1024 696 696 </ b> </ b> Nhưng khi kích thước tempdb được kiểm tra không bị giảm. </ Pre>
Manii

Thông báo này có thể xảy ra nếu một giao dịch sử dụng tempdb trong khi thu hẹp. Cũng có thể là kích thước thu nhỏ được xác định của bạn (~ 30GB) vượt quá giới hạn miễn phí của tempdb của bạn.
Ionic

1

Bạn chỉ có thể đi với bước dưới đây mà thôi

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

Câu trả lời của bạn khác với câu trả lời trên như thế nào?
Kin Shah

1
Xin chào Kin, Kích thước tệp Tempdb sẽ được giảm với DBCC FREEPROCCACHE; và sau đó thu nhỏ tệp tempdb. Chúng tôi không cần tuyên bố dưới đây để thu nhỏ tempdb. DBCC DROPCLEANBUFFERS; DBCC FREESYSTEMCACHE ('TẤT CẢ'); DBCC FREESESSIONCACHE;
JERRY

1
Đây là câu trả lời đơn giản hơn, trong hầu hết các trường hợp, chỉ cần DBCC FREEPROCCACHE là cần thiết để cho phép bạn thu nhỏ tempdb. Xem câu hỏi liên quan
James Jenkins
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.