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
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.
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
Pour moi, la solution est:
Cochez la case Remplacer la base de données existante (WITH REPLACE) dans l'onglet optoins à gauche.
Décochez toutes les autres options.
Sélectionnez la base de données source et de destination.
Cliquez sur OK.
C'est tout.
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 ...
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
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
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.
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.
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.
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;
Je viens de redémarrer le service sqlexpress, puis la restauration s'est bien terminée