Esiste un modo per ridurre / ridurre le dimensioni di tempdb.mdf senza riavviare SQL Server


15

È necessario riavviare SQL Server dopo l' DBCC SHRINKFILEattivazione tempdb.mdfo esiste un altro metodo per ridurre le dimensioni tempdb.mdfsenza riavviare SQL Server?

Ti prego di aiutarmi perché ne ho bisogno per un server di produzione e spero di ridurre il tempo di inattività.


2
DBCC SHRINKFILE non richiede il riavvio del servizio.
Greg,

Non è possibile ridurre il tempdb in quanto è in uso. E sì, c'è una soluzione per questo, ma non è molto pulito e ha alcuni effetti collaterali.
Ionico,

Risposte:


15

Puoi farlo in questo modo:

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

L'ultimo passo è il più complicato. Durante il processo di riduzione, nessun'altra azione dovrebbe usare tempdb, poiché ciò potrebbe causare l'interruzione SHRINKFILEdell'operazione. A causa del fatto che tempdb è abbastanza facile da restringere, non dovrebbe impiegare molto tempo a ridurlo.

Attenzione che si tratta di un "riavvio graduale". Tutto verrà rimosso dai buffer e scritto sul disco. Ciò significa un impatto sul sottosistema I / O (scrittura) in quanto deve gestire tutte le operazioni di scrittura. Successivamente è possibile ridurre il file (che ha un impatto sulle prestazioni di lettura e scrittura) e alla fine, tutti i processi che eseguono query su qualsiasi tabella dovranno recuperare i dati dal sottosistema I / O nei buffer. Ciò potrebbe danneggiare più di un riavvio.

Se stai eseguendo un sistema di sviluppo, dovresti semplicemente riavviare la macchina anziché in questo modo. Ma su alcuni sistemi di produzione senza un partner di failover, questo può essere utile.


grazie ionico per la bella spiegazione. tempdb.mdf è di 46 GB nel mio caso. Se non sono in corso transazioni, posso ridurlo al 100%. Si prega di suggerire
Manii,

Sì, il 40960 MB è solo un esempio. Sul mio sistema il tempdb funziona normalmente a ~ 50 GB e in rari casi arriva a 200 GB. :-)
Ionico

<pre> Eseguo la query come DBCC SHRINKFILE (tempdev, 1024); </b> </b> E ha liberato con successo lo spazio, ma di nuovo lo eseguo come </b> </b> Eseguo la query come DBCC SHRINKFILE (tempdev, 30000); </b> </b> e mi ha dato il risultato come di seguito: </b> </b> DbId Field Dimensione corrente Dimensione minima Pagine utilizzate Pagine stimate </b> 2 1 5699352 1024 696 696 </b> </b> Ma dato che la dimensione del tempdb controllata non è stata ridotta. </pre>
Manii,

Questo messaggio può essere visualizzato se una transazione utilizza tempdb durante la riduzione. Potrebbe anche essere che la dimensione del restringimento definita (~ 30 GB) sia superiore al limite gratuito del tuo tempdb.
Ionico,

1

Puoi andare solo con il passaggio seguente

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

In che modo la tua risposta è diversa da quella sopra?
Kin Shah,

1
Ciao Kin, la dimensione del file Tempdb verrà ridotta con DBCC FREEPROCCACHE; e quindi ridurre il file tempdb. Non abbiamo bisogno dell'istruzione seguente per restringere tempdb. DBCC DROPCLEANBUFFERS; DBCC FREESYSTEMCACHE ('ALL'); DBCC FREESESSIONCACHE;
JERRY,

1
Questa è la risposta più semplice, nella maggior parte dei casi è necessario solo DBCC FREEPROCCACHE per consentire di ridurre il tempdb. Vedi domanda correlata
James Jenkins,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.