Mon SQL Server 2005 ne restaure pas une sauvegarde en raison de connexions actives. Comment puis-je le forcer?
Mon SQL Server 2005 ne restaure pas une sauvegarde en raison de connexions actives. Comment puis-je le forcer?
Réponses:
Lorsque vous cliquez avec le bouton droit de la souris sur une base de données et que vous cliquez Tasks
puis cliquez sur Detach Database
, une boîte de dialogue avec les connexions actives apparaît.
En cliquant sur le lien hypertexte sous "Messages", vous pouvez supprimer les connexions actives.
Vous pouvez ensuite supprimer ces connexions sans détacher la base de données.
Plus d'informations ici .
L'interface a changé pour SQL Server Management studio 2008, voici les étapes (via: Tim Leung )
Vous souhaitez définir votre base de données en mode mono-utilisateur, effectuer la restauration, puis la remettre en mode 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
ROLLBACK IMMEDIATE
ou ROLLBACK AFTER 60
. La seule façon d'enregistrer ces données est d'effectuer une autre sauvegarde après la restauration. Mais vous restaurez à partir d'une sauvegarde différente. Alors, quel est l'intérêt d'attendre? Est-ce que je manque quelque chose?
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
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
Le redémarrage du serveur SQL déconnectera les utilisateurs. Le moyen le plus simple que j'ai trouvé - bon aussi si vous voulez mettre le serveur hors ligne.
Mais pour une raison très étrange, l'option 'Take Offline' ne le fait pas de manière fiable et peut bloquer ou perturber la console de gestion. Redémarrage puis mise hors ligne des travaux
Parfois, c'est une option - si, par exemple, vous avez arrêté un serveur Web qui est la source des connexions.
J'ai rencontré ce problème en automatisant un processus de restauration dans SQL Server 2008. Mon approche (réussie) était un mélange de deux des réponses fournies.
Tout d'abord, je traverse toutes les connexions de ladite base de données et 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, j'ai défini la base de données sur un 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'aucune connexion ne bloque la base de données avant de passer en mode unique, car le premier se fige s'il y en a.
Pour ajouter aux conseils déjà donnés, si vous disposez d'une application Web exécutée via IIS qui utilise la base de données, vous devrez peut-être également arrêter (et non recycler) le pool d'applications de l'application pendant la restauration, puis redémarrer. L'arrêt du pool d'applications tue les connexions http actives et n'en permet plus, ce qui pourrait autrement permettre de déclencher des processus qui se connectent et verrouillent ainsi la base de données. Il s'agit d'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
Aucune de ces réponses 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û:
Ce n'est pas la solution la plus élégante mais cela fonctionne et cela ne nécessite pas de redémarrer SQL Server (ce n'est pas une option pour moi, car le serveur DB hébergeait un tas d'autres bases de données)
Je préfère faire comme ça,
modifier la base de données définie hors ligne avec restauration immédiate
puis restaurez votre base de données. après ça,
modifier l'ensemble de la base de données en ligne avec restauration immédiate