Temps d'attente extrême lors de la mise hors ligne d'une base de données SQL Server

278

J'essaie d'effectuer une maintenance hors ligne (restauration de la base de données de développement à partir d'une sauvegarde en direct) sur ma base de données de développement, mais la commande `` Déconnecter '' via SQL Server Management Studio s'exécute extrêmement lentement - de l'ordre de 30 minutes et plus maintenant. Je suis à peu près à ma fin et je n'arrive pas à trouver de références en ligne sur ce qui pourrait être à l'origine du problème de vitesse, ou comment le résoudre.

Certains sites ont suggéré que les connexions ouvertes à la base de données provoquent ce ralentissement, mais la seule application qui utilise cette base de données est l'instance IIS de ma machine de développement et le service est arrêté - il n'y a plus de connexions ouvertes.

Qu'est-ce qui pourrait être à l'origine de ce ralentissement et que puis-je faire pour l'accélérer?

Erik Forbes
la source

Réponses:

408

Après quelques recherches supplémentaires (nouveaux termes de recherche inspirés par la réponse de gbn et le commentaire de u07ch sur la réponse de KMike), j'ai trouvé cela, qui s'est terminé avec succès en 2 secondes:

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE

(Mettre à jour)

Lorsque cela échoue toujours avec l'erreur suivante, vous pouvez le corriger en s'inspirant de cet article de blog :

Échec de ALTER DATABASE car aucun verrou n'a pu être placé sur la base de données 'dbname'. Réessayez plus tard.

vous pouvez exécuter la commande suivante pour savoir qui garde un verrou sur votre base de données:

EXEC sp_who2

Et utilisez tout SPIDce que vous trouverez dans la commande suivante:

KILL <SPID>

Exécutez ensuite à ALTER DATABASEnouveau la commande. Cela devrait maintenant fonctionner.

Erik Forbes
la source
35
Si cela ne fonctionne pas (aucun verrou n'a pu être placé), essayez également la solution sur stackoverflow.com/questions/4673065 .
nalply
3
Si le processus Take DB Offline est toujours en cours d'exécution, pour les machines de développement, vous pouvez le supprimer à partir du Gestionnaire des tâches et exécuter la commande ci-dessus.
Null Head
1
Si vous exécutez la commande KILL et obtenez le message "Impossible d'utiliser KILL pour tuer votre propre processus.", Assurez-vous que vous utilisez la base de données master pour exécuter la commande
Jarrod
129

Il y a très probablement une connexion à la base de données quelque part (un rare exemple: mise à jour statistique asynchrone )

Pour rechercher des connexions, utilisez sys.sysprocesses

USE master
SELECT * FROM sys.sysprocesses WHERE dbid = DB_ID('MyDB')

Pour forcer les déconnexions, utilisez ROLLBACK IMMEDIATE

USE master
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
gbn
la source
7
+1, car la requête de processus vous permet de savoir ce qui est connecté à cette base de données. dans mon cas, c'était un employé voyou avec SSMS ouvert :)
MikeMurko
3
Dans mon cas, j'étais le voyou avec une fenêtre d'analyse de requête ouverte
dellyjm
1
Dans mon cas, les développeurs avaient un site Web de production principal pour une banque très connue pointant vers une base de données lebeled OLD
ZZ9
3
Si elle dit que la ALTER DATABASE failed because a lock could not be placed on databasecommande KILL <SPID>aidera
Muflix
28

Avez-vous des fenêtres SQL Server Management Studio ouvertes qui sont connectées à cette base de données?

Mettez-le en mode mono-utilisateur, puis réessayez.

KM.
la source
2
ALTER DATABASE <DBNAME> SET SINGLE_USER WITH Rollback Immediate
u07ch
KMike - la seule connexion que j'ai est ouverte à la base de données Master, pas à la base de données que j'essaie de mettre hors ligne.
Erik Forbes
17

Dans mon cas, après avoir tant attendu qu'il se termine, je n'ai eu aucune patience et j'ai simplement fermé le studio de gestion. Avant de quitter, il a montré le message de réussite, db est hors ligne. Les fichiers étaient disponibles pour renommer.

Rudy
la source
7

exécuter la procédure stockée sp_who2

Cela vous permettra de voir s'il y a des verrous de blocage .. tuer leur devrait le réparer.

woodwa
la source
5

Dans SSMS: cliquez avec le bouton droit sur l'icône du serveur SQL, Moniteur d'activité. Processus ouverts. Trouvez le connecté connecté. Faites un clic droit sur le processus, Kill.

nzeemin
la source
4

chaque fois que vous rencontrez ce type de chose, vous devez toujours penser à votre journal des transactions. L'affirmation alter db avec rollback immédiat indique que c'est le cas. Vérifiez ceci: http://msdn.microsoft.com/en-us/library/ms189085.aspx

Bone up sur les points de contrôle, etc. Vous devez décider si les transactions dans votre journal valent la peine d'être sauvegardées, puis choisir le mode d'exécution de votre base de données en conséquence. Il n'y a vraiment aucune raison pour que vous deviez attendre mais également aucune raison pour que vous perdiez des données non plus - vous pouvez avoir les deux.

Yetanotherdave
la source
2
Sage conseil - merci - mais dans ce cas, les données sont consommables car il s'agit d'une base de données de développement en cours de restauration.
Erik Forbes
3

La fermeture de l'instance de SSMS (SQL Service Manager) à partir de laquelle la demande a été faite a résolu le problème pour moi .....

Armand G.
la source
3

Dans mon cas, j'avais regardé certaines tables de la base de données avant d'exécuter cette action. Mon compte d'utilisateur détenait une connexion active à cette base de données dans SSMS. Une fois que je me suis déconnecté du serveur dans SSMS (laissant la boîte de dialogue "Mettre la base de données hors ligne" ouverte), l'opération a réussi.

RamenNoodle
la source
Pareil pour moi. Ensuite, je me suis reconnecté, changé la base de données active en maître et exécuté la commande suivante: ALTER DATABASE XXX SET OFFLINE WITH ROLLBACK IMMEDIATE
cskwg
2

Pour contourner ce problème, j'ai arrêté le site Web qui était connecté à la base de données dans IIS et immédiatement le panneau «gelé» «mettre la base de données hors ligne» est devenu figé.

Dan
la source
2

J'ai essayé toutes les suggestions ci-dessous et rien n'a fonctionné.

  1. EXEC sp_who
  2. Tuer <SPID>

  3. ALTER DATABASE SET SINGLE_USER WITH Rollback Immediate

    ALTER DATABASE MISE HORS LIGNE AVEC ROLLBACK IMMEDIATE

    Résultat: les deux commandes ci-dessus ont également été bloquées.

4. Cliquez avec le bouton droit sur la base de données -> Propriétés -> Options Définir la base de données en lecture seule sur True Cliquez sur 'Oui' dans la boîte de dialogue avertissant que SQL Server fermera toutes les connexions à la base de données.

Résultat: la fenêtre était bloquée lors de l'exécution.

En dernier recours, j'ai redémarré le service SQL Server à partir du gestionnaire de configuration, puis j'ai exécuté ALTER DATABASE SET OFFLINE WITH ROLLBACK IMMEDIATE. Ça a marché comme sur des roulettes

Viraj A
la source
1

Fermez également toutes les fenêtres de requête ouvertes qui sont connectées à la base de données en question;)

Steve Woods
la source
1

Dans SSMS, définissez la base de données en lecture seule, puis revenez. Les connexions seront fermées, ce qui libère les serrures.

Dans mon cas, il y avait un site Web qui avait des connexions ouvertes avec la base de données. Cette méthode était assez simple:

  1. Cliquez avec le bouton droit sur la base de données -> Propriétés -> Options
  2. Défini Database Read-Onlysur True
  3. Cliquez sur «Oui» dans la boîte de dialogue avertissant que SQL Server fermera toutes les connexions à la base de données.
  4. Rouvrez les options et désactivez la lecture seule
  5. Essayez maintenant de renommer la base de données ou de la mettre hors ligne.
zacharydl
la source
0

Pour moi, je devais simplement aller dans le Job Activity Monitor et arrêter deux choses en cours de traitement. Ensuite, il s'est immédiatement déconnecté. Dans mon cas, cependant, je savais quels étaient ces 2 processus et qu'il était acceptable de les arrêter.

craig
la source
0

Dans mon cas, la base de données était liée à une ancienne installation de Sharepoint. L'arrêt et la désactivation des services associés dans le gestionnaire de serveur ont "décroché" l'action de mise hors ligne, qui fonctionnait depuis 40 minutes et s'est terminée immédiatement.

Vous voudrez peut-être vérifier si des services utilisent actuellement la base de données.

Jonathan
la source
1
Exécutez sp_who2pour voir quels processus utilisent la base de données et utilisez-les kill <PID>pour les arrêter.
Eric Kigathi
0

La prochaine fois, dans la boîte de dialogue Déconnecter, n'oubliez pas de cocher la case «Supprimer toutes les connexions actives». J'étais également sur SQL_EXPRESS sur une machine locale sans connexion, mais ce ralentissement s'est produit pour moi, sauf si j'ai coché cette case.

Brett Drake
la source
-1

Dans mon cas, j'ai arrêté le serveur Tomcat. puis immédiatement la DB s'est déconnectée.

Java Main
la source