Ошибка. Исключительный доступ не может быть получен потому, что база данных используется.
Я пытаюсь сделать 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