web-dev-qa-db-fra.com

Lors de la restauration d'une sauvegarde, comment déconnecter toutes les connexions actives?

Mon SQL Server 2005 ne restaure pas une sauvegarde en raison de connexions actives. Comment puis-je le forcer?

165
Jader Dias

SQL Server Management Studio 2005

Lorsque vous cliquez avec le bouton droit sur une base de données et que vous cliquez sur Tasks, puis que vous cliquez sur Detach Database, un dialogue s'affiche avec les connexions actives.

Detach Screen

En cliquant sur le lien hypertexte sous "Messages", vous pouvez tuer les connexions actives.

Vous pouvez ensuite tuer ces connexions sans détacher la base de données.

Plus d'informations ici .

SQL Server Management Studio 2008

L'interface a changé pour SQL Server Management studio 2008, voici les étapes (via: Tim Leung )

  1. Cliquez avec le bouton droit de la souris sur le serveur dans l'Explorateur d'objets et sélectionnez "Moniteur d'activité".
  2. Lorsque cela s'ouvre, développez le groupe Processus.
  3. Maintenant, utilisez le menu déroulant pour filtrer les résultats par nom de base de données.
  4. Éliminez les connexions au serveur en sélectionnant l’option "Kill Process" (Processus de destruction) du clic droit.
173
George Stocker

Vous souhaitez définir votre base de données en mode mono-utilisateur, effectuer la restauration, puis la redéfinir sur multi-utilisateur:

ALTER DATABASE YourDB
SET SINGLE_USER WITH
ROLLBACK AFTER 60 --this will give your current connections 60 seconds to complete

--Do Actual Restore
RESTORE DATABASE YourDB
FROM DISK = 'D:\BackUp\YourBaackUpFile.bak'
WITH MOVE 'YourMDFLogicalName' TO 'D:\Data\YourMDFFile.mdf',
MOVE 'YourLDFLogicalName' TO 'D:\Data\YourLDFFile.ldf'

/*If there is no error in statement before database will be in multiuser
mode.  If error occurs please execute following command it will convert
database in multi user.*/
ALTER DATABASE YourDB SET MULTI_USER
GO

Référence: Pinal Dave ( http://blog.SQLAuthority.com )

Référence officielle: https://msdn.Microsoft.com/en-us/library/ms345598.aspx

189
brendan

Ce code a fonctionné pour moi, il tue toutes les connexions existantes d'une base de données. Tout ce que vous avez à faire est de changer la ligne Set @dbname = 'databaseName' pour qu'elle ait le nom de votre base de données.

Use Master
Go

Declare @dbname sysname

Set @dbname = 'databaseName'

Declare @spid int
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname)
While @spid Is Not Null
Begin
        Execute ('Kill ' + @spid)
        Select @spid = min(spid) from master.dbo.sysprocesses
        where dbid = db_id(@dbname) and spid > @spid
End

après cela, j'ai pu le restaurer

42
RagnaRock

Le redémarrage du serveur SQL déconnectera les utilisateurs. Le moyen le plus simple que j'ai trouvé est également utile si vous souhaitez mettre le serveur hors ligne.

Mais, pour une raison très étrange, l’option "Take Offline" (Déconnecter) ne le fait pas de manière fiable et peut bloquer ou perturber la console de gestion. Redémarrer puis déconnecter des travaux

Parfois, il s'agit d'une option - si, par exemple, vous avez arrêté un serveur Web, c'est la source des connexions.

5
Simon_Weaver

Essaye ça ...

DECLARE UserCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT
    spid
FROM
    master.dbo.sysprocesses
WHERE DB_NAME(dbid) = 'dbname'--replace the dbname with your database
DECLARE @spid SMALLINT
DECLARE @SQLCommand VARCHAR(300)
OPEN UserCursor
FETCH NEXT FROM UserCursor INTO
    @spid
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQLCommand = 'KILL ' + CAST(@spid AS VARCHAR)
    EXECUTE(@SQLCommand)
    FETCH NEXT FROM UserCursor INTO
        @spid
END
CLOSE UserCursor
DEALLOCATE UserCursor
GO
4
user2276214

J'ai rencontré ce problème lors de l'automatisation d'un processus de restauration dans SQL Server 2008. Mon approche (réussie) consistait à combiner deux des réponses fournies.

Tout d'abord, je rencontre toutes les connexions de ladite base de données et je les tue.

DECLARE @SPID int = (SELECT TOP 1 SPID FROM sys.sysprocess WHERE dbid = db_id('dbName'))
While @spid Is Not Null
Begin
        Execute ('Kill ' + @spid)
        Select @spid = top 1 spid from master.dbo.sysprocesses
        where dbid = db_id('dbName')
End

Ensuite, je mets la base de données en mode single_user

ALTER DATABASE dbName SET SINGLE_USER

Ensuite, je lance la restauration ...

RESTORE DATABASE and whatnot

Tuez à nouveau les connexions

(same query as above)

Et redéfinissez la base de données sur multi_user.

ALTER DATABASE dbName SET MULTI_USER

De cette façon, je m'assure qu'il n'y a pas de connexions qui bloquent la base de données avant de passer en mode simple, car l'ancien gèlera s'il en existe.

3
Eric Wu

Pour ajouter aux conseils déjà donnés, si vous avez une application Web exécutée via IIS et utilisant la base de données, vous devrez peut-être également arrêter (ne pas recycler) le pool d'applications de l'application. pendant que vous restaurez, puis redémarrez. L'arrêt du pool d'applications supprime les connexions http actives et n'en permet plus, ce qui pourrait sinon permettre le déclenchement de processus qui se connectent à la base de données et, partant, le verrouille. Ceci est un problème connu, par exemple avec le système de gestion de contenu Umbraco lors de la restauration de sa base de données.

2
Chris Halcrow

Aucun d'entre eux ne fonctionnait pour moi, impossible de supprimer ou de déconnecter les utilisateurs actuels. Impossible également de voir les connexions actives à la base de données. Redémarrer SQL Server (clic droit et sélectionner redémarrer) m'a permis de le faire.

2
The Coder

Aucun de ce qui précède n'a fonctionné pour moi. Ma base de données n'a montré aucune connexion active utilisant Activity Monitor ou sp_who. J'ai finalement dû:

  • Clic droit sur le noeud de la base de données
  • Sélectionnez "Détacher ..."
  • Cochez la case "Supprimer les connexions"
  • Rattacher

Ce n’est pas la solution la plus élégante, mais cela fonctionne et ne nécessite pas de redémarrer SQL Server (ce n’est pas une option pour moi, car le serveur de base de données hébergeait une foule d’autres bases de données)

1
Brent Waggoner

Je préfère faire comme ça,

modifier la base de données hors ligne avec annulation immédiate

puis restaurez votre base de données. après ça,

modifier la base de données en ligne avec annulation immédiate

0
Aniyan Kolathur