[英]SQL-Server: Error - Exclusive access could not be obtained because the database is in use
我實際上是在嘗試制作一個腳本(在 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
我假設如果您正在恢復一個數據庫,您不關心該數據庫上的任何現有事務。 對? 如果是這樣,這應該適合您:
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
現在,要注意另外一項。 將數據庫設置為單用戶模式后,其他人可能會嘗試連接到數據庫。 如果它們成功,您將無法繼續進行恢復。 這是一場比賽! 我的建議是同時運行所有三個語句。
在恢復數據庫之前執行此查詢:
alter database [YourDBName]
set offline with rollback immediate
恢復后的這個:
alter database [YourDBName]
set online
對我來說,解決辦法是:
在左側的 optoins 選項卡中選中 Overwrite the existing database(WITH REPLACE)。
取消選中所有其他選項。
選擇源和目標數據庫。
單擊確定。
就是這樣。
在恢復數據庫之前,使用以下腳本查找並終止所有打開的數據庫連接。
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...'
希望這會有所幫助...
我剛剛重新啟動了 sqlexpress 服務,然后恢復正常
我認為您只需要在嘗試恢復之前將 db 設置為單用戶模式,如下所示,只需確保您使用的是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
解決方案 1:重新啟動 SQL 服務並嘗試恢復數據庫 解決方案 2:重新啟動系統/服務器並嘗試恢復數據庫 解決方案 3:收回當前數據庫,刪除當前/目標數據庫並嘗試恢復數據庫。
將數據庫設置為單用戶模式對我不起作用,但將其脫機,然后將其重新聯機確實有效。 它位於數據庫的右鍵單擊菜單中的任務下。
請務必選中對話框中的“刪除所有活動連接”選項。
我在嘗試恢復 MS SQL Server 2012 上的數據庫時遇到了這個問題。
這是對我有用的:
我必須首先在備份文件上運行下面的RESTORE FILELISTONLY
命令以列出邏輯文件名:
RESTORE FILELISTONLY
FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\my_db_backup.bak'
這分別顯示了數據庫的數據和日志文件的LogicalName和相應的PhysicalName :
LogicalName PhysicalName
com.my_db C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\com.my_db.mdf
com.my_db_log C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\com.my_db_log.ldf
我所要做的就是在我的數據庫恢復腳本中分別替換數據庫的LogicalName和相應的PhysicalName的數據和日志文件:
USE master;
GO
ALTER DATABASE my_db SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
RESTORE DATABASE my_db
FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\my_db_backup.bak'
WITH REPLACE,
MOVE 'com.my_db' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\com.my_db.mdf',
MOVE 'com.my_db_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\com.my_db_log.ldf'
GO
ALTER DATABASE my_db SET MULTI_USER;
GO
並且數據庫還原任務成功運行:
就這樣。
我希望這有幫助
Vinu M Shankar 的解決方案對我有用。
但是我必須檢查: “在恢復之前進行尾日志備份”復選框才能使我的工作。
這是我從生產到開發進行數據庫恢復的一種方式:
注意:我正在通過 SSAS 作業將生產數據庫推送到每天的開發中:
Step1:刪除開發中的前一天備份:
declare @sql varchar(1024);
set @sql = 'DEL C:\ProdAEandAEXdataBACKUP\AE11.bak'
exec master..xp_cmdshell @sql
Step2:復制生產數據庫到開發:
declare @cmdstring varchar(1000)
set @cmdstring = 'copy \\Share\SQLDBBackup\AE11.bak C:\ProdAEandAEXdataBACKUP'
exec master..xp_cmdshell @cmdstring
步驟 3:通過運行 .sql 腳本恢復
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;
當沒有足夠的磁盤空間來恢復 Db 時,我收到了這個錯誤。 清理一些空間解決了它。
我在不知情的情況下收到此錯誤,其他人在另一個 SSMS 會話中連接到數據庫。 在我將它們注銷后,恢復成功完成。
就我而言,盡管我嘗試了上述所有解決方案,但有效的是重新啟動 SSMS。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.