Apakah ada cara untuk mengurangi / mengecilkan ukuran tempdb.mdf tanpa me-restart SQL Server

15

Apakah perlu untuk me-restart SQL Server setelah DBCC SHRINKFILEpada tempdb.mdfatau apakah ada metode lain untuk mengurangi ukuran tempdb.mdftanpa restart SQL Server?

Mohon bantuan karena saya memerlukan ini untuk server produksi dan saya berharap untuk melakukan penyusutan tanpa waktu henti.

Manii
sumber
2
DBCC SHRINKFILE tidak memerlukan layanan restart.
Greg,
Anda tidak dapat mengecilkan tempdb karena sedang digunakan. Dan ya ada beberapa solusi untuk ini tetapi tidak terlalu bersih dan memiliki beberapa efek samping.
Ionic

Jawaban:

15

Anda dapat melakukannya dengan cara ini:

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

Langkah terakhir adalah yang paling sulit. Selama proses menyusut, tidak ada tindakan lain yang harus menggunakan tempdb, karena ini dapat menyebabkan pembatalan SHRINKFILEoperasi Anda . Karena fakta bahwa tempdb cukup mudah menyusut, tidak perlu waktu lama untuk menyusut.

Waspadalah bahwa ini adalah sesuatu seperti "soft restart". Semuanya akan dihapus dari buffer dan ditulis ke disk. Ini berarti dampak pada subsistem I / O Anda (tulis) karena harus menangani semua operasi penulisan. Setelah itu Anda dapat mengecilkan file (yang berdampak pada kinerja baca dan tulis) dan pada akhirnya, semua proses yang meminta tabel apa pun perlu mengambil data kembali dari subsistem I / O ke dalam buffer. Ini mungkin sakit lebih dari restart.

Jika Anda menjalankan sistem pengembangan, Anda harus memulai ulang mesin alih-alih dengan cara ini. Tetapi pada beberapa sistem produksi tanpa mitra failover, ini mungkin berguna.

Ionik
sumber
terima kasih Ionic untuk penjelasan yang bagus. tempdb.mdf berukuran 46 GB dalam kasus saya. Jika tidak ada transaksi yang terjadi maka dapatkah saya mengecilkannya menjadi 100%. Mohon saran.
Manii
Ya, 40960MB hanyalah sebuah contoh. Pada sistem saya tempdb berjalan normal pada ~ 50GB dan dalam kasus yang jarang tumbuh menjadi 200GB. :-)
Ionic
<pre> Saya menjalankan kueri sebagai DBCC SHRINKFILE (tempdev, 1024); </b> </b> Dan itu berhasil membebaskan ruang tetapi sekali lagi saya menjalankannya seperti </b> </b> Saya menjalankan kueri sebagai DBCC SHRINKFILE (tempdev, 30000); </b> </b> Dan itu memberi saya hasil sebagai berikut: </b> </b> DbId Field Ukuran Saat Ini Ukuran Minimum Halaman yang Digunakan Estimasi Halaman </b> 2 1 5699352 1024 696 696 </b> </b> Tetapi karena ukuran tempdb yang dicentang tidak berkurang. </pre>
Manii
Pesan ini dapat terjadi jika transaksi menggunakan tempdb saat menyusut. Mungkin juga ukuran menyusut yang Anda tetapkan (~ 30GB) berada di atas batas bebas tempdb Anda.
Ionic
1

Anda bisa pergi dengan langkah di bawah ini saja

USE tempdb;
GO;
dbcc freeproccache;
DBCC SHRINKFILE (tempdb_file_name, memory_in_MB);
GO;
JERRY
sumber
Bagaimana jawaban Anda berbeda dari yang di atas?
Kin Shah
1
Halo, Tempdb Ukuran file akan dikurangi dengan DBCC FREEPROCCACHE; dan kemudian mengecilkan file tempdb. Kami tidak perlu pernyataan di bawah ini untuk shrink tempdb. DBCC DROPCLEANBUFFERS; DBCC FREESYSTEMCACHE ('ALL'); DBCC FREESESSIONCACHE;
JERRY
1
Ini adalah jawaban yang lebih sederhana, dalam banyak kasus hanya DBCC FREEPROCCACHE diperlukan untuk memungkinkan Anda mengecilkan tempdb. Lihat pertanyaan terkait
James Jenkins