首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 還原/刪除資料庫遭遇「無法取得獨佔存取」的秒解方案

     編輯:關於SqlServer

錯誤訊息

因為資料庫正在使用中,所以無法取得對資料庫的獨佔存取權。

核心解法:強制離線並立即回滾

-- 1. 強制設為 OFFLINE,立即回滾所有未完成交易
ALTER DATABASE [YourDB] SET OFFLINE WITH ROLLBACK IMMEDIATE;

-- 2. 執行還原、刪除或其他獨佔操作
-- RESTORE DATABASE [YourDB] ... / DROP DATABASE [YourDB];

-- 3. 作業完成後設回 ONLINE
ALTER DATABASE [YourDB] SET ONLINE;

原理解析

  • SET OFFLINE 會關閉資料庫、斷開所有連線、回滾開啟中交易。
  • WITH ROLLBACK IMMEDIATE 不等待交易認可/回滾完成,直接強制中斷,確保立即取得獨佔鎖定。
  • 此法適用於 SQL Server 2005 及以上所有版本,無需重啟服務。

替代方案(舊版或特殊情境)

-- 單一使用者模式(舊版常用)
EXEC sp_dboption 'YourDB', 'single user', 'true';
-- 執行作業
EXEC sp_dboption 'YourDB', 'single user', 'false';

-- 或殺掉所有連線的 SPID(需動態產生 KILL 指令)
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += N'KILL ' + CAST(session_id AS NVARCHAR(10)) + N';'
FROM sys.dm_exec_sessions
WHERE database_id = DB_ID('YourDB') AND session_id <> @@SPID;
EXEC (@sql);

推薦仍以 SET OFFLINE WITH ROLLBACK IMMEDIATE 為首選,語法簡潔、行為確定、不需游標動態 SQL。

注意事項

  1. 執行前確認無重要長交易正在運行,強制回滾會導致資料遺失。
  2. 若資料庫處於 RESTORING、RECOVERY_PENDING 等異常狀態,可能需先 SET EMERGENCY 再處理。
  3. 生產環境建議先備份尾部記錄 BACKUP LOG ... WITH NORECOVERY 再執行離線。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved