Recentemente, ho avuto l’occasione di dare assistenza, su SQL Server, a un cliente che mi ha segnalato errori applicativi di diverso tipo, ma il più frequente era "Errore in scrittura sulla tabella ‘nome_tabella’".
Dopo aver verificato il recovery model del DB su cui si basa l’applicativo, che era impostato su SIMPLE, ho verificato lo spazio libero sulle unità che contengono i file del database e la presenza di transazioni attive. Lo spazio libero sull’unità che contiene i file del DB era insufficiente per salvare altri dati a causa delle dimensioni del transaction log, arrivato a occupare circa 29GB a fronte di un file dati (modesto) di circa 400MB. Il T-Log aveva saturato lo spazio sull’unità disco che lo ospitava e i backup del database erano ovviamente cresciuti di conseguenza.
Per quale motivo il transaction log era cresciuto tanto? E perché SQL Server non era in grado di rilasciarlo? Anche forzando il rilascio con un’operazione di Shrink?
Ho utilizzato la vista sys2.logs_usage, il cui script è disponibile per il download dal sito di CodePlex, per conoscere il motivo che impediva a SQL Server di troncare il file di log per liberare spazio e consentirne il riutilizzo.
Il motivo è descritto nella colonna log_reuse_wait_desc che sulla riga relativa al DB incriminato riportava il valore "REPLICATION"… ho scoperto che il database in questione pubblicava, attraverso una replica transazionale, alcune tabelle. Questo valore, quando il DB è interessato in una replica transazionale, indica la presenza di transazioni avvenute nel database di pubblicazione, ma non ancora distribuite nei sottoscrittori dal distributore, da qui l’impossibilità di compattare il transaction log.
Alcuni agenti di replica erano, infatti, in errore con il messaggio: "L’utente [dominio\utente] non ha accesso al server ‘nome_server’".
Dopo aver corretto l’anomalia sugli agenti di replica, il distributore ha potuto aggiornare i sottoscrittori e in seguito l’enorme spazio impegnato dal transaction log è stato rilasciato per consentirne il riutilizzo.
Articoli correlati: