Comment mettre fin à une transaction SQL Server suspendue en attendant IO_COMPLETION?

8

Nous avons une transaction qui fonctionne depuis plus de 5 heures. Nous manquons d'espace disque. La session a été supprimée mais attend toujours IO_COMPLETION. En fait, le wait_type vient de changer en PAGEIOLATCH_EX. Comment puis-je mettre fin à la transaction SQL Server suspendue? Je ne suis pas inquiet de perdre des données car tout cela peut être repeuplé.

session_id: 54
STATUS: suspended
blocked by: 0
wait_type: PAGEIOLATCH_EX
Elapsed Time (in Sec): 19750.420000
open_transaction_count: 2
Tarzan
la source
3
Laissez-le finir. Sinon, si vous faites une chose brusque de retirer l'alimentation ou de redémarrer le service du serveur SQL, il faudra du temps pour revenir en arrière. Comme vous ne craignez pas de perdre des données, que diriez-vous de restaurer la base de données à partir de la dernière sauvegarde, puis de repeupler les données? De plus, vous pouvez utiliser KILL 54 WITH STATUSONLYpour savoir combien de temps il faudra pour revenir en arrière.
Kin Shah
J'ai exécuté KILL 54 WITH STATUSONLY et j'ai reçu ceci: SPID 54: annulation de transaction en cours. Estimation de la restauration: 0%. Temps restant estimé: 0 seconde. Je ne crois pas la partie 0 secondes.
Tarzan
2
La restauration est une opération à thread unique, par exemple, si votre transaction d'origine s'exécutait avec 8 threads parallèles jusqu'à sa suppression, la restauration peut prendre 8 fois plus de temps.
James Z
@Tarzan KILL .. WITH STATUSONLYn'est pas précis et je vois votre point. Pouvez-vous essayer Alter database .. set OFFLINE or single_User WITH ROLLBACK IMMEDIATE?
Kin Shah
2
J'ai fini par le laisser fonctionner toute la nuit. Il a finalement fini. Woohoo! Merci d'avoir commenté.
Tarzan

Réponses:

1

La prochaine fois que cela se produit, exécutez sp_WhoIsActive( téléchargement / documentation ) et voyez qui exécute quoi et examinez la logique. Vérifiez si le TSQL peut être optimisé pour s'exécuter plus rapidement ou peut-être le découper en transactions plus petites.

J'ai eu des cas où le journal des transactions d'une mauvaise requête par des rédacteurs de rapports, des chargeurs de données, etc. augmentait le journal des transactions plus grand que la taille du fichier de données, et c'est généralement une requête mal exécutée et mal écrite qui n'est pas optimisée ou fragmentée dans des transactions plus petites pour redonner de l'espace libre une fois la transaction terminée - il s'agissait d'ailleurs d'une SIMPLEbase de données du FULLmodèle de récupération - les bases de données du modèle de récupération devraient avoir des sauvegardes du journal des transactions terminées pour permettre la réutilisation de l'espace du journal des transactions des transactions validées.

Le problème racine est probablement la requête, donc déterminer qui fait quoi et leur tendre la main et signaler le problème avec vos conclusions les obligerait à corriger leur logique pour ne pas arroser l'espace disque du serveur pour cette partition de disque - espérons que c'est pas votre logique, mais si c'est le cas, regardez l'optimisation de la logique pour interroger le réglage des performances.

Pimp Juice IT
la source