Ceci est un double de la question que j'ai posée sur stackoverflow , mais on m'a dit que quelqu'un ici pourrait avoir une meilleure idée de ce qui se passe.
J'ai un problème sporadique, lors de la mise à niveau de SQL Server en mode mono-utilisateur, à l'aide de .NET SqlConnection, une autre application se connecte en quelque sorte à la base de données, tandis que le code SQL est en cours d'exécution et lance mon processus. SqlConnection n'est pas fermé ou éliminé de quelque façon que ce soit. Mais une autre application se retrouve en quelque sorte connectée à la base de données et cela met fin à ma connexion.
Lorsque j'exécute sp_who, je pouvais voir qu'un processus qui prenait le contrôle de la base de données était Command = "TASK MANAGER".
N'importe qui pourrait me dire quel est ce processus, quel est son objectif et comment, dans le monde, il pourrait entrer dans une base de données, qui est en mode mono-utilisateur, et il y a une connexion active?
Je pense que le mystère enfin résol :
Avant de définir la base de données sur SINGLE_USER, vérifiez que l'option AUTO_UPDATE_STATISTICS_ASYNC est définie sur OFF. Lorsqu'il est défini sur ON, le thread d'arrière-plan utilisé pour mettre à jour les statistiques prend une connexion avec la base de données et vous ne pourrez pas accéder à la base de données en mode mono-utilisateur.
Eu le même problème aujourd'hui, si vous n'avez pas désactivé votre AUTO_UPDATE_STATISTICS ASYNC, vous ne pourrez pas entrer dans votre base de données, vous pouvez résoudre ce problème en mettant votre base de données hors ligne. Il est important de savoir que vous devez définir votre priorité de blocage sur élevé, sinon vous serez bloqué hors de la commande. Utilisez les commandes suivantes pour sortir du mode utilisateur UNIQUE
SET DEADLOCK_PRIORITY HIGH
ALTER DATABASE [YourDBName] SET OFFLINE WITH ROLLBACK IMMEDIATE
Suivi par
SET DEADLOCK_PRIORITY HIGH
ALTER DATABASE [YourDBName] SET ONLINE WITH ROLLBACK IMMEDIATE
Suivi par
SET DEADLOCK_PRIORITY HIGH
ALTER DATABASE [YourDBName] SET MULTI_USER WITH ROLLBACK IMMEDIATE
Arrêtez la trace des événements étendus "system_health". Il sera répertorié sous
SQL Server Management Studio
-> [ServerName]
-> Management
-> Extended Events
-> Right-Click on 'System_health'
-> Hit Stop Session
Une fois le bloqueur résolu, redémarrez la session.
Vous devez désactiver SQL Agent "avant" de démarrer le mode à usage unique. Comme le compte d'agent saisira l'accès utilisateur unique. N'oubliez pas que l'utilisateur unique n'est pas vous le premier utilisateur/processus à se connecter.