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

SQL Server 還原數據庫提示「正在使用」的三種解決方案

     編輯:關於SqlServer

還原數據庫要求獨占訪問,若有任何會話(含當前操作者)連接目標庫,將報錯:無法獲得對數據庫的獨占訪問權。本文提供從「圖形界面」到「腳本殺進程」的三級方案。

現象與根因

  • 現象 1:還原後數據庫顯示「受限制訪問」。
  • 現象 2:還原過程報錯 System.Data.SqlClient.SqlError: 因為數據庫正在使用...。
  • 根因:存在活躍連接,還原需單用戶模式。

方案一:圖形界面切換訪問模式(最直觀)

  1. SSMS → 右鍵目標庫 → 屬性 → 選項 頁籤。
  2. 狀態 區塊 → 限制訪問 下拉選 SINGLE_USER → 確定(會彈窗強制斷開現有連接)。
  3. 執行還原。
  4. 還原完成後改回 MULTI_USER。

方案二:重啟 SQL Server 服務(最暴力、最快)

服務管理器或 net stop MSSQLSERVER && net start MSSQLSERVER。所有連接瞬間斷開,適合維護窗口期。

方案三:T-SQL 腳本殺掉指定庫所有進程(可自動化)

USE master;
GO

DECLARE @dbname SYSNAME = 'YourDB';
DECLARE @spid SMALLINT;
DECLARE @sql NVARCHAR(MAX);

-- 游標遍歷 sys.sysprocesses(舊版)或 sys.dm_exec_sessions(新版)
DECLARE cur CURSOR LOCAL FAST_FORWARD FOR
    SELECT session_id 
    FROM sys.dm_exec_sessions 
    WHERE database_id = DB_ID(@dbname) 
      AND session_id <> @@SPID;  -- 排除自己

OPEN cur;
FETCH NEXT FROM cur INTO @spid;
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sql = N'KILL ' + CAST(@spid AS VARCHAR(5));
    EXEC (@sql);
    FETCH NEXT FROM cur INTO @spid;
END
CLOSE cur;
DEALLOCATE cur;
GO

-- 立即設為單用戶並回滾未提交事務
ALTER DATABASE [YourDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- 執行還原 ...
-- 還原後恢復多用戶
ALTER DATABASE [YourDB] SET MULTI_USER;
GO

方案四:離線強制斷連(最乾淨)

ALTER DATABASE [YourDB] SET OFFLINE WITH ROLLBACK IMMEDIATE;
GO
-- 還原
RESTORE DATABASE [YourDB] ...;
GO
ALTER DATABASE [YourDB] SET ONLINE;
GO

優勢:單條語句完成斷連+回滾,無需游標循環,且不受「鎖定系統表」限制。

避坑指南

  • 殺進程/離線操作務必在 master 資料庫上下文執行,避免「數據庫正在使用」死鎖。
  • 生產環境執行前請確認維護窗口、通知業務方。
  • 若為 AlwaysOn/鏡像環境,需先移除可用性組/鏡像再操作。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved