Aujourd'hui, j'ai découvert que le disque dur qui stocke mes bases de données était plein. Cela s'est déjà produit auparavant, généralement la cause est assez évidente. Habituellement, il y a une mauvaise requête, ce qui provoque d'énormes déversements sur tempdb qui augmente jusqu'à ce que le disque soit plein. Cette fois, ce qui s'est passé était un peu moins évident, car tempdb n'était pas la cause du lecteur complet, c'était la base de données elle-même.
Les faits:
- La taille habituelle de la base de données est d'environ 55 Go, elle est passée à 605 Go.
- Le fichier journal a une taille normale, le fichier de données est énorme.
- Le fichier de données dispose de 85% d'espace disponible (j'interprète cela comme «aérien»: espace qui a été utilisé, mais qui a été libéré. SQL Server réserve tout l'espace une fois alloué).
- La taille de Tempdb est normale.
J'ai trouvé la cause probable; il y a une requête qui sélectionne beaucoup trop de lignes (une mauvaise jointure entraîne la sélection de 11 milliards de lignes où quelques centaines de milliers sont attendues). Il s'agit d'une SELECT INTO
requête qui m'a fait me demander si le scénario suivant aurait pu se produire:
- SELECT INTO est exécuté
- La table cible est créée
- Les données sont insérées lorsqu'elles sont sélectionnées
- Le disque se remplit, provoquant l'échec de l'insertion
- SELECT INTO est abandonné et annulé
- La restauration libère de l'espace (les données déjà insérées sont supprimées), mais SQL Server ne libère pas l'espace libéré.
Dans cette situation, cependant, je ne m'attendais pas à ce que la table créée par le SELECT INTO
existe toujours, elle devrait être supprimée par la restauration. J'ai testé ceci:
BEGIN TRANSACTION
SELECT T.x
INTO TMP.test
FROM (VALUES(1))T(x)
ROLLBACK
SELECT *
FROM TMP.test
Il en résulte:
(1 row affected)
Msg 208, Level 16, State 1, Line 8
Invalid object name 'TMP.test'.
Pourtant, la table cible existe. Cependant, la requête réelle n'a pas été exécutée dans une transaction explicite, cela peut-il expliquer l'existence de la table cible?
Les hypothèses que j'ai esquissées ici sont-elles correctes? Est-ce un scénario probable qui s'est produit?