Oggi ho scoperto che il disco rigido che memorizza i miei database era pieno. Questo è successo prima, di solito la causa è abbastanza evidente. Di solito c'è una cattiva query, che causa grandi perdite di tempdb che cresce fino a quando il disco è pieno. Questa volta è stato un po 'meno evidente quello che è successo, poiché tempdb non era la causa dell'intero disco, era il database stesso.
I fatti:
- La dimensione normale del database è di circa 55 GB, è cresciuta fino a 605 GB.
- Il file di registro ha dimensioni normali, il file di dati è enorme.
- Il file di dati ha l'85% di spazio disponibile (lo interpreto come "aria": spazio che è stato utilizzato, ma che è stato liberato. SQL Server riserva tutto lo spazio una volta assegnato).
- La dimensione del tempdb è normale.
Ho trovato la causa probabile; c'è una query che seleziona troppe righe (un join errato provoca la selezione di 11 miliardi di righe dove sono attese un paio di centinaia di migliaia). Questa è una SELECT INTO
query, che mi ha fatto chiedermi se il seguente scenario avrebbe potuto accadere:
- SELECT INTO viene eseguito
- La tabella di destinazione è stata creata
- I dati vengono inseriti così come sono selezionati
- Il disco si riempie, causando un errore dell'inserimento
- SELECT INTO viene interrotto e ripristinato
- Il rollback libera spazio (i dati già inseriti vengono rimossi), ma SQL Server non rilascia lo spazio liberato.
In questa situazione, tuttavia, non mi sarei aspettato che la tabella creata da SELECT INTO
esistesse ancora, che dovrebbe essere eliminata dal rollback. Ho provato questo:
BEGIN TRANSACTION
SELECT T.x
INTO TMP.test
FROM (VALUES(1))T(x)
ROLLBACK
SELECT *
FROM TMP.test
Questo risulta in:
(1 row affected)
Msg 208, Level 16, State 1, Line 8
Invalid object name 'TMP.test'.
Tuttavia esiste la tabella di destinazione. Tuttavia, la query effettiva non è stata eseguita in una transazione esplicita, può spiegare l'esistenza della tabella di destinazione?
I presupposti che ho delineato qui sono corretti? È probabile che si sia verificato uno scenario?