web-dev-qa-db-fra.com

Supprimer la déclaration ne répondant pas à Tuer la commande de session

Il y a quatre jours, un utilisateur a exécuté la commande ci-dessous sur une table avec 400 000 000 rangées. Il est toujours en cours d'exécution et le fichier journal augmente de taille.

delete from [table-name]

Ce tableau a une contrainte de clé étrangère qui n'est pas activée pour la vérification et je sais qu'aucune rangée n'existe dans l'autre table.

La base de données est en cours d'exécution avec "IS LIRE SNAPSHOT ENGAGÉ sur" Activé et en mode de récupération simple.

Une fois que cela a eu lieu pendant quelques heures, j'ai émis une commande de session Kill, car nous manquions d'espace disque pour le fichier journal. J'ai ajouté un autre fichier journal pour permettre au système de continuer à fonctionner.

Le fichier journal continue de croître et lorsque je gère la session Kill avec StatonOnly, il renvoie ce message:

SPID 123: transaction rollback in progress. Estimated rollback completion: 0%. Estimated time remaining: 0 seconds.

Je suis à perte de ce qu'il faut faire à propos de cette requête pour la faire renverser et simplement comprendre ce qui se passe, peut-on suggérer ce que je peux regarder?

7
David Woakes

Donc, la suppression a couru pour seulement "quelques heures" avant de le tuer, et maintenant le "Rollback" est en cours d'exécution depuis 4 jours?

C'est bien au-delà du temps que je m'attendais normalement, alors voici ce que je recommanderais:

  1. Obtenir l'approbation de la gestion
  2. Redémarrez l'instance SQL.
  3. Croiser les doigts.
  4. Si vous avez de la chance, la restauration suspendue claquera tout de suite, la base de données va récupérer et tout le monde sera heureux.
  5. Si vous êtes non Lucky, alors la restauration continuera lorsque la base de données est en cours de récupération et que la base de données ne reviendra jamais en ligne. Cochez la case SQL Errorlog pour le statut pour voir si cela se produit.
  6. Dans ce cas, arrêtez l'instance SQL à nouveau, puis supprimez les fichiers de base de données du disque pendant que l'instance est arrêtée.
  7. Démarrez SQL à nouveau, l'instance ne parviendra pas à trouver les fichiers de base de données.
  8. Déposez la base de données (Ghost)
  9. Restaurer la base de données de la sauvegarde.

Si le redémarrage la corrige, vous êtes bon. Si ce n'est pas le cas, vous n'êtes pas pire, puis faites simplement une restauration à partir de la sauvegarde.

Bonne chance.

4
BradC