Ошибка. Исключительный доступ не может быть получен потому, что база данных используется.

Я пытаюсь сделать script (в Sql Server 2008) для восстановления одной базы данных из одного файла резервной копии. Я сделал следующий код, и я получаю сообщение об ошибке -

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.

Как исправить эту проблему?

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

Ответ 1

Я предполагаю, что если вы восстанавливаете db, вам не нужны никакие существующие транзакции на этом db. Правильно? Если это так, это должно сработать для вас:

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

Теперь еще один элемент, который нужно знать. После того, как вы установите db в однопользовательский режим, кто-то другой может попытаться подключиться к db. Если они преуспеют, вы не сможете продолжить восстановление. Это гонка! Мое предложение состоит в том, чтобы сразу запускать все три оператора.

Ответ 2

  • Задайте путь для восстановления файла.
  • Нажмите "Параметры" в левой части.
  • Установите флажок - "Закрыть существующие соединения с базой данных назначения". введите описание изображения здесь
  • Нажмите "ОК".

Надеюсь, что это сработает.

Ответ 3

выполнить этот запрос перед восстановлением базы данных:

alter database [YourDBName] 
set offline with rollback immediate

и этот после восстановления:

  alter database [YourDBName] 
  set online

Ответ 4

Используйте следующий script, чтобы найти и убить все открытые подключения к базе данных до восстановления базы данных.

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...'

Надеюсь, это поможет...

Ответ 5

Я думаю, вам просто нужно установить db в один пользовательский режим, прежде чем пытаться восстановить, как показано ниже, просто убедитесь, что вы используете master

USE master
GO
ALTER DATABASE AdventureWorksDW
SET SINGLE_USER

Ответ 6

Для меня решение:

  • Проверьте перезапись существующей базы данных (WITH REPLACE) на вкладке optoins слева.

  • Снимите все остальные параметры.

  • Выберите базу данных источника и назначения.

  • Нажмите "ОК".

Что это.

Ответ 7

Здесь я делаю восстановление базы данных от производства до разработки:

ПРИМЕЧАНИЕ. Я делаю это через работу SSAS, чтобы ежедневно выпускать производственную базу данных:

Шаг1: удаление резервной копии предыдущего дня в разработке:

declare @sql varchar(1024);

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

Шаг 2. Скопируйте производственную базу данных в разработку:

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

Шаг 3: Восстановить, запустив .sql script

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

Код, который находится в файле 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;

Ответ 8

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