簡體   English   中英

SQL-Server:錯誤 - 無法獲得獨占訪問,因為數據庫正在使用中

[英]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
  1. 設置恢復文件的路徑。
  2. 單擊左側的“選項”。
  3. 取消選中“恢復前進行尾日志備份”
  4. 勾選復選框 - “關閉與目標數據庫的現有連接”。 在此處輸入圖片說明
  5. 單擊確定。

我假設如果您正在恢復一個數據庫,您不關心該數據庫上的任何現有事務。 對? 如果是這樣,這應該適合您:

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

對我來說,解決辦法是:

  1. 在左側的 optoins 選項卡中選中 Overwrite the existing database(WITH REPLACE)。

  2. 取消選中所有其他選項。

  3. 選擇源和目標數據庫。

  4. 單擊確定。

就是這樣。

在恢復數據庫之前,使用以下腳本查找並終止所有打開的數據庫連接。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM