web-dev-qa-db-fra.com

Session dans un état limbo - Killed / Rollback

J'ai un SQLjob qui appelle xp_cmdshell qui est utilisé pour vider un fichier txt sur un site ftp via un script.

Parfois, il échoue et le travail est bloqué dans un état exécutable. En général, je tue la session et elle est effacée.

Cependant, j'ai deux sessions suspendues dans un état limbo.

 sp_WHO2 53 -- running from 7/8/2018

SP_WHO2 53

SP_WHO2 98 -- running from 6/16/2018

SP_WHO2 98

L'état du travail indique son Runnable mais la commande est KILLED/ROLLBACK.

Vérification du SPID 53

Kill 53 with status only 

Sortie

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

Vérification du SPID 98

KILL 98 with status only

Sortie

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

Comment dois-je procéder pour effacer ces sessions?

J'ai des problèmes de performances avec SQL Server, ce qui m'a conduit à ces sessions. J'ai fait quelques recherches et me fait croire que cela augmentera les fichiers journaux et causera des problèmes de performances. Je ne sais pas si le problème actuel est dû à ces sessions mais ce sont des requêtes coûteuses actives. J'ai donc pensé partir d'ici. Je suis développeur ici et je suis conscient que le moniteur d'activité est obsolète dans SQL SERVER 2014 Mais j'ai vérifié le moniteur d'activité et ci-dessous les images.

Image from activity monitor - 1

Image from activity monitor - 2

Pouvez-vous suggérer comment je peux m'y prendre?

J'ai lu un blog sur un tel scénario par Brent Ozar
- Rollback: que se passe-t-il lorsque vous TUEZ une session? .

J'ai appris à la dure en cherchant à corriger la cause profonde.

AK

4
user156968

Vous pouvez essayer de tuer le processus Windows qui a été généré avec xp_cmdshell car ce processus est probablement en cours d'exécution et n'est pas géré en supprimant le spid de SQL Server. La façon dont vous le décrivez, je suppose que le programme ftp est toujours en cours d'exécution.

En effet, la commande kill ne supprime pas les programmes qui ont été démarrés hors processus.

Vous pouvez simuler le scénario comme ceci:

Dans une fenêtre de requête SQL, démarrez un processus:

xp_cmdshell 'notepad.exe'

puis après avoir tué ce spid, j'obtiens la même sortie dans sp_who2 que vous

54      RUNNABLE                        Administrator   hostname      . master  KILLED/ROLLBACK     0   0   07/24 14:23:02  Microsoft SQL Server Management Studio - Query  54      0  

Mais j'ai toujours un processus notepad.exe en cours d'exécution:

C:\Users\Administrator>tasklist | find "notepad"
notepad.exe                   4676 Services                   0      3 788 K

Une fois que j'ai tué ce processus notepad.exe, mon spid SQL Server a également disparu.

Si vous voulez savoir quel processus vous devez tuer, l'Explorateur de processus devrait l'afficher comme un processus enfant de sqlserver.exe comme ceci (vous devrez peut-être démarrer procexp.exe en tant qu'administrateur):

enter image description here