web-dev-qa-db-fra.com

Erreur - L'accès exclusif n'a pas pu être obtenu car la base de données est en cours d'utilisation

En fait, j'essaie de créer un script (dans SQL Server 2008) pour restaurer une base de données à partir d'un fichier de sauvegarde. J'ai fait le code suivant et j'obtiens une erreur - 

Msg 3101, Level 16, State 1, Line 3
Exclusive access could not be obtained because 
the database is in use.
Msg 3013, Level 16, State 1, Line 3
RESTORE DATABASE is terminating abnormally.

Comment puis-je résoudre ce problème? 

IF DB_ID('AdventureWorksDW') IS NOT NULL 
BEGIN 
RESTORE DATABASE [AdventureWorksDW] 
FILE = N'AdventureWorksDW_Data' 
FROM  
DISK = N'C:\Program Files\Microsoft SQL Server\
MSSQL10_50.SS2008\MSSQL\Backup\AdventureWorksDW.bak' 
WITH  FILE = 1, 
MOVE N'AdventureWorksDW_Data' 
TO N'C:\Program Files\Microsoft SQL Server\
MSSQL10_50.SS2008\MSSQL\DATA\AdventureWorksDW.mdf', 
MOVE N'AdventureWorksDW_Log'  
TO N'C:\Program Files\Microsoft SQL Server\
MSSQL10_50.SS2008\MSSQL\DATA\AdventureWorksDW_0.LDF', 
NOUNLOAD,  STATS = 10 
END
72
Steam

Je suppose que si vous restaurez une base de données, vous ne vous souciez pas des transactions existantes sur cette base de données. Droite? Si oui, cela devrait fonctionner pour vous:

USE master
GO

ALTER DATABASE AdventureWorksDW
SET SINGLE_USER
--This rolls back all uncommitted transactions in the db.
WITH ROLLBACK IMMEDIATE
GO

RESTORE DATABASE AdventureWorksDW
FROM ...
...
GO

Maintenant, un élément supplémentaire à prendre en compte. Une fois que vous avez défini la base de données en mode mono-utilisateur, une autre personne peut tenter de se connecter à la base. S'ils réussissent, vous ne pourrez pas poursuivre votre restauration. C'est une course! Ma suggestion est d'exécuter les trois déclarations en même temps.

72
Dave Mason
  1. Définissez le chemin pour restaurer le fichier.
  2. Cliquez sur "Options" sur le côté gauche.
  3. Cochez la case "Fermer les connexions existantes à la base de données de destination" .  enter image description here
  4. Cliquez sur OK.

J'espère que cela fonctionnera.

135
Vinu M Shankar

exécutez cette requête avant de restaurer la base de données:

alter database [YourDBName] 
set offline with rollback immediate

et celui-ci après avoir restauré:

  alter database [YourDBName] 
  set online
30
Andrei Karcheuski

Pour moi, la solution est:

  1. Cochez la case Remplacer la base de données existante (WITH REPLACE) dans l'onglet optoins à gauche.

  2. Décochez toutes les autres options.

  3. Sélectionnez la base de données source et de destination.

  4. Cliquez sur OK.

C'est tout.

6
Aayush Verma

Utilisez le script suivant pour rechercher et supprimer toutes les connexions ouvertes à la base de données avant de restaurer la base de données.

declare @sql as varchar(20), @spid as int

select @spid = min(spid)  from master..sysprocesses  where dbid = db_id('<database_name>') 
and spid != @@spid    

while (@spid is not null)
begin
    print 'Killing process ' + cast(@spid as varchar) + ' ...'
    set @sql = 'kill ' + cast(@spid as varchar)
    exec (@sql)

    select 
        @spid = min(spid)  
    from 
        master..sysprocesses  
    where 
        dbid = db_id('<database_name>') 
        and spid != @@spid
end 

print 'Process completed...'

J'espère que cela aidera ...

6
Aqeel Haider

Je pense que vous avez juste besoin de définir la base de données sur le mode mono-utilisateur avant de tenter de restaurer, comme ci-dessous, assurez-vous que vous utilisez master

USE master
GO
ALTER DATABASE AdventureWorksDW
SET SINGLE_USER
2
Jason
Use Master
alter database databasename set offline with rollback immediate;

--Do Actual Restore
RESTORE DATABASE databasename
FROM DISK = 'path of bak file'
WITH MOVE 'datafile_data' TO 'D:\newDATA\data.mdf',
MOVE 'logfile_Log' TO 'D:\newDATA\DATA_log.ldf',replace

alter database databasename set online with rollback immediate;
GO
1
Puneeth

Solution 1: redémarrez les services SQL et essayez de restaurer la base de données Solution 2: redémarrez le système/serveur et essayez de restaurer la base de données Solution 3: reprenez le DB actuel, supprimez le DB actuel/cible et essayez restaurer la base de données.

0
Joseph Joy

La définition de la base de données en mode mono-utilisateur ne fonctionnait pas pour moi, mais la déconnecter puis la remettre en ligne fonctionnait. C'est dans le menu contextuel de la base de données, sous Tâches.

Assurez-vous de cocher l'option 'Supprimer toutes les connexions actives' dans la boîte de dialogue.

0
Jeffrey Harmon

J'ai eu cette erreur quand il n'y avait pas assez d'espace disque pour restaurer Db. Le nettoyage de l'espace l'a résolu.

0
user3790083

Voici un moyen de restaurer la base de données de la production au développement:

REMARQUE: Je le fais via un travail SSAS pour pousser la base de production au développement tous les jours:

Étape 1: Supprimer la sauvegarde du jour précédent en développement:

declare @sql varchar(1024);

set @sql = 'DEL C:\ProdAEandAEXdataBACKUP\AE11.bak'
exec master..xp_cmdshell @sql

Étape 2: Copier la base de données de production dans le développement:

declare @cmdstring varchar(1000)
set @cmdstring = 'copy \\Share\SQLDBBackup\AE11.bak C:\ProdAEandAEXdataBACKUP'
exec master..xp_cmdshell @cmdstring 

Étape 3: restaurer en exécutant un script .sql

SQLCMD -E -S dev-erpdata1 -b -i "C:\ProdAEandAEXdataBACKUP\AE11_Restore.sql"

Code contenu dans le fichier AE11_Restore.sql:

RESTORE DATABASE AE11
FROM DISK = N'C:\ProdAEandAEXdataBACKUP\AE11.bak'
WITH MOVE 'AE11' TO 'E:\SQL_DATA\AE11.mdf',
MOVE 'AE11_log' TO 'D:\SQL_LOGS\AE11.ldf',
RECOVERY;
0
NonProgrammer

Je viens de redémarrer le service sqlexpress, puis la restauration s'est bien terminée

0
BabaNew