Ho avuto questo problema prima.
- Hai un grande database e una piccola unità di registro. Vuoi riorganizzare (per una serie di motivi).
- Quando si tenta di eseguire questa operazione su una tabella frammentata di grandi dimensioni, il registro si riempie fino a quando l'unità di registro non è piena e quindi il comando si interrompe.
- Se è in modalità semplice, altre transazioni potrebbero non riuscire fino a quando il registro non viene cancellato nel punto di controllo successivo e se è in modalità completa, altre transazioni potrebbero non riuscire fino al backup del registro successivo. Interruzione!
- Se si è in modalità completa, si aumenta la frequenza di backup del registro ma ciò non aiuta a evitare il problema poiché la riorganizzazione viene eseguita in una transazione implicita, il registro non viene cancellato fino a quando la transazione non termina o si interrompe o viene interrotta.
- E vuoi davvero che la riorganizzazione venga completata.
È un po 'controintuitivo perché sai che se interrompi la riorganizzazione può continuare da dove era stata interrotta, è solo che una interruzione commette la transazione piuttosto che il rollback.
Ecco cosa fai. È un po 'lungo ma semplice.
- Pre-crescere il file di registro in dimensioni relativamente grandi, ma non al massimo. Fondamentalmente vuoi lasciare abbastanza spazio per fare un lavoro utile, oltre ad alcune piccole crescite se si verificano, in modo che le normali operazioni non si fermino.
- Creare un processo per eseguire la riorganizzazione dell'indice ("Riorganizza").
Creare un avviso WMI agente ('Riorganizza valvola di sicurezza') su una condizione di prestazione.
- Oggetto: SQLServer: database
- Contatore: registro percentuale utilizzato
- Istanza: (il tuo nome di database grande)
- Avviso se il contatore sale sopra: 80
- Risposta: Esegui processo ('Riorganizza controllo')
Crea un lavoro ('Riorganizza assegno')
- Nel lavoro controllare msdb.dbo.sysjobactivity per vedere se il lavoro 'Riorganizza' è in esecuzione. E se è ...
- Interrompere il processo e eseguire il polling fino a quando non si interrompe. Questo può richiedere alcuni secondi.
- (Se si è in modalità completa) Attivare il processo di backup del registro e confermare al termine.
- Ricontrolla i contatori sys.dm_os_performance_co che il contatore dello spazio libero nel registro ha ridotto al di sotto della soglia.
- Avviare il lavoro "Riorganizza".
Prova questo da qualche parte, anche una sandbox di sviluppo, per assicurarti che funzioni correttamente prima di attaccarlo sul tuo server di produzione.
Quello che vedrai è che il lavoro 'Riorganizza' inizia e inizia a riempire il registro. Quando il registro raggiunge una percentuale piena, attiva l'avviso WMI (entro circa 30 secondi) che esegue l'altro lavoro che vede che il lavoro "Riorganizza" è in esecuzione e quindi probabilmente in errore. Quindi interrompe "Riorganizza", esegue un backup, conferma che lo spazio disponibile nel registro torna a un valore ragionevole, quindi avvia nuovamente il processo "Riorganizza" che riprenderà da dove era stato interrotto.
Quindi, come è possibile, il motivo per cui le dimensioni del log sono ridimensionate a una cifra ragionevole in questo scenario è quella di ridurre il numero di crescita / trigger / lavoro / arresto / riavvii, in modo che possa essere più efficiente e anche mantenere spazio sufficiente per il escrescenze occasionali che non vengono catturate nel tempo.
Questo è un tipo di strano scenario. Sono abbastanza sicuro che mi sarei lasciato sfuggire qualche anno fa e ovviamente ci sono problemi fondamentali alla base qui. Ma se hai a che fare con centinaia di server, emergeranno alcuni casi limite come questo che non possono essere risolti in alcun modo, per qualsiasi motivo commerciale, tranne MacGyvering, una soluzione temporanea che porta a termine il lavoro.
Finché è sicuro, logico, testato e ben documentato, non dovrebbero esserci problemi.