SQL Server - Best practice per la crescita di file di database


16

Ho monitorato la crescita dei file tramite il raccoglitore di dati in SQL Server 2008 R2 per due settimane. Il database sta crescendo costantemente a circa 35 (MB) / giorno. Il DB non ha ancora raggiunto la dimensione iniziale di 2 GB.

La crescita automatica dei file DB è impostata su 5 MB e vorrei provare un approccio diverso, quindi sto cercando suggerimenti e commenti.

C'è un'attività di ottimizzazione che viene eseguita ogni settimana la domenica sera all'1: 30. Il compito sarà:

  • Verifica integrità del database
  • Riduci il file di registro: (va bene perché la modalità di registrazione è semplice)
  • Riduci database
  • Riorganizza indice
  • Ricostruisci indice
  • Aggiorna statistiche
  • Cancella cronologia

Vorrei aggiungere altri due passaggi al piano di ottimizzazione settimanale:

  1. Aumentare il file del database di 500 MB se lo spazio utilizzato raggiunge una determinata soglia o dimensione totale.
  2. Aumentare il file di registro di 250 MB (dopo la riduzione) se lo spazio utilizzato raggiunge una determinata soglia della dimensione totale.

Posizionando l'onere della crescita in ore offline, spero di ottenere prestazioni riducendo il numero di eventi di auto-crescita durante carichi pesanti.

Ho due domande relative ai file a crescita automatica.

  • Il posto migliore per inserire i passi di crescita del file sarebbe prima dei passi attuali o dopo?
  • Se uso il ALTER DATABASE|MODIFY FILEfile per far crescere il file, come posso determinare se SpaceUsedInFile >= (TotalFileSpace-@AllowanceThreshold)?

2
Il tuo DB dovrebbe avere dimensioni sufficienti per non crescere mai . Tuttavia, assicurarsi che l' inizializzazione dei file istantanei sia abilitata.
Remus Rusanu,

3
@Remus, per quanto ideale, stai dicendo che hai pre-dimensionato perfettamente ogni database durante la tua carriera? Ci sarà sempre qualche indovinello coinvolto e modifiche da apportare. Concordo sul fatto che la crescita dovrebbe essere controllata e non lasciata solo a farlo 7 volte al giorno.
Aaron Bertrand

3
@AaronBertrand: preferisco un consiglio semplicistico e iperbole . Con il tempo ho imparato che si attacca meglio. La maggior parte degli utenti non può gestire il 'dipende' e quelli che lo fanno possono capire da soli che ci sono sfumature di grigio tra bianco e nero ...
Remus Rusanu

3
@DanAndrews: l'allocazione eccessiva può avere effetti "a valle". Pensa a uno sviluppatore che prova a ripristinare il DB sulla sua macchina solo per scoprire che ha bisogno di due nuove unità da 1 TB per 1 GB di dati ...
Remus Rusanu

2
Sto solo giocando l'avvocato del diavolo. Tuttavia, gli HD sono economici. Il tempo perso in produzione per la riconfigurazione e la perdita di prestazioni è costoso.
Dan Andrews,

Risposte:


24

Dovresti mirare a crescere automaticamente il meno possibile. Sette volte al giorno è lancinante, anche con l'inizializzazione istantanea dei file.

Non creare un database ristretto. Mai. Shrinkfile, forse, ma solo dopo un evento straordinario. Ridurlo solo per crescere di nuovo è un esercizio di futilità e in realtà dovrebbe essere chiamato auto-frammento.

Se il modello di recupero è semplice, non è necessario aumentare il file di registro di 250 GB. Lo spazio utilizzato nel file si pulirà automaticamente nel tempo, a meno che non sia stata avviata una transazione un mese fa e non si abbia alcuna intenzione di commetterla o ripristinarla.

Quindi il mio consiglio sarebbe:

Crescere manualmente il file di dati manualmente durante un periodo di inattività fino a una dimensione adatta per diversi mesi di crescita. Per cosa lo stai salvando nel frattempo?

Impostare l'incremento di crescita automatica per il file di dati su qualcosa di relativamente piccolo (in modo che non interrompa gli utenti quando si verifica) e avvisare su questo evento (è possibile catturarlo nella traccia predefinita, ad esempio o tramite esteso eventi). Questo può dirti che stai colpendo il punto più alto che hai stimato ed è tempo di ricrescere manualmente. A questo punto ti consigliamo di conservare questo manuale nel caso in cui desideri aggiungere un nuovo file / filegroup su un'unità diversa per contenere lo spazio, poiché alla fine riempirai l'unità corrente.

Fai crescere automaticamente il file di registro, ad esempio, il doppio del più grande che sia mai stato. Non dovrebbe auto-crescere ulteriormente a meno che non ci siano transazioni anormali che ostacolano le cose. È necessario monitorare anche questo evento, in modo da conoscerli.


Grazie per l'input ... Ti consiglierò per far crescere il file di registro e monitorarlo per un po '. Ho usato erroneamente GB per MB nella dimensione di crescita automatica. Sono d'accordo e non credo che il Database Shrink stia facendo ciò che doveva fare. Alla fine dell'anno il DB raggiunge i 15 GB, al momento della creazione del lavoro stavamo esaurendo lo spazio per i backup.

+1 per dovrebbe essere chiamato auto-frammento :-) Hai già lanciato un problema Connect per quello? :-)
marc_s

10

La crescita automatica è qualcosa che dovresti cercare di evitare, se possibile. Il problema è che non hai alcun controllo su quando può verificarsi la crescita e il tuo sistema può subire un duro colpo mentre lo fa.

Imposta le dimensioni del tuo file su qualcosa di sensato per circa un mese e monitora il tuo tasso di crescita da lì per capire quanto spazio stima per X quantità di tempo e imposta la tua dimensione su quella + un margine di errore.

Ho impostato un semplice processo di monitoraggio che mi avviserà quando la dimensione del file raggiunge un massimo predefinito prima della crescita automatica. Puoi usare qualcosa del genere:

SELECT instance_name,
       [Data File(s) Size (KB)],
       [LOG File(s) Size (KB)],
       [Log File(s) Used Size (KB)],
       [Percent Log Used]
       into ##Logsize
FROM
(
   SELECT *
   FROM sys.dm_os_performance_counters
   WHERE counter_name IN
   (
       'Data File(s) Size (KB)',
       'Log File(s) Size (KB)',
       'Log File(s) Used Size (KB)',
       'Percent Log Used'
   )
     AND instance_name = 'database your interested in' 
) AS Src
PIVOT
(
   MAX(cntr_value)
   FOR counter_name IN
   (
       [Data File(s) Size (KB)],
       [LOG File(s) Size (KB)],
       [Log File(s) Used Size (KB)],
       [Percent Log Used]
   )
) AS pvt 
go
declare @logsize int
Select @logsize = [Percent Log Used] from ##Logsize

If @logsize > the maximum percent you want the log to fill too i.e 90
    BEGIN
        --Do your thing here
    END

Drop table ##Logsize

Questo potrebbe ovviamente essere programmato come lavoro.


Rimuovo il database "AND nome_istanza = 'di tuo interesse" in modo che restituisca tutti i database. Quindi utilizzare un conteggio in cui la dimensione del registro è superiore a una soglia nell'istruzione IF. Se il conteggio è superiore a 1, faccio un sp_send_dbmail con un'istruzione name selezionata dalla tabella temporanea per inviare via e-mail i nomi dei registri sopra il limite.
Nick Winstanley,
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.