2013-09-23 30 views
132

目前,我的數據庫處於單用戶模式。當我嘗試擴大我的數據庫,我得到一個錯誤:退出單用戶模式

The database 'my_db' is not accessible.(ObjectExplorer)

此外,當我嘗試刪除數據庫中,我得到的錯誤:

Changes to the state or options of database 'my_db' cannot be made at this time. The database is in single-user mode, and a user is currently connected to it.

如何退出的單出用戶模式?我沒有任何用戶使用這個數據庫。

當我嘗試瀏覽我的網站IIS,我得到的錯誤是:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

我覺得好像在單用戶模式是導致此。

回答

249

SSMS中一般使用多個連接到幕後的數據庫。

在更改訪問模式之前,您需要終止這些連接。

首先,確保對象資源管理器指向系統數據庫,如master。

其次,執行sp_who2並查找數據庫'my_db'的所有連接。 通過執行KILL { session id }來終止所有連接,其中會話ID是由sp_who2列出的SPID

三,打開一個新的查詢窗口。

執行以下代碼。

-- Start in master 
USE MASTER; 

-- Add users 
ALTER DATABASE [my_db] SET MULTI_USER 
GO 

請參閱我的blog article管理數據庫文件。這是爲移動文件編寫的,但用戶管理是相同的。

+0

當我使用'sp_who2'命令時,我沒有看到任何DBName連接到'my_db'我沒有殺死任何這些連接。在運行命令後,我得到相同的錯誤= [: '此時無法更改數據庫'my_db'的狀態或選項。數據庫處於單用戶模式,並且當前用戶已連接到該用戶。 Msg 5069,Level 16,State 1,Line 1 ALTER DATABASE語句失敗' – Liondancer

+2

您是否確定自己在master中,sp_who2沒有顯示任何具有database = my_db的行,並且您的對象資源管理器不在my_db上。 –

+1

嘗試,斷開並連接SSMS。有些東西必須連接到該數據庫。另一種選擇是連接專用管理控制檯(DAC)。這假定你是一個系統管理員。然後殺死有問題的spid。 –

17

轉出的單用戶模式,嘗試:

ALTER DATABASE [my_db] SET MULTI_USER

要切換回單用戶模式,你可以使用:

ALTER DATABASE [my_db] SET SINGLE_USER

+0

我得到的錯誤: 「改變爲狀態或數據庫'my_db'的選項目前無法生成。數據庫處於單用戶模式,並且當前用戶已連接到該用戶。 消息5069,級別16,狀態1,行1 ALTER DATABASE語句失敗。' – Liondancer

+1

可以停止並重新啓動數據庫(顯然,如果這不是會影響其他用戶的生產系統),然後重試該命令?而@CRAFTYDBA聲明應該從主數據庫執行該命令。 – rsbarro

+1

我擴展'系統數據庫'並右鍵單擊'主'並選擇'新查詢',並嘗試在你和@ CRAFTYDBA的逗號。同樣的錯誤= [ – Liondancer

5

不知道這是否有助於任何人,但我有同樣的問題,無法找到阻止我的過程。我關閉了SSMS並停止了所有服務擊中本地實例。然後,一旦我回到並運行exec sp_who2,它顯示我是罪魁禍首。我殺了這個進程,並能夠讓Multi_User工作,然後重新啓動服務。我們每隔幾分鐘/秒就會打一次IIS來查找某些軟件包。

12

我想這是工作

ALTER DATABASE dbName SET MULTI_USER WITH ROLLBACK IMMEDIATE 
1

即使我遇到同樣的問題,無法找到活動連接MY_DB殺死它,但仍然顯示同樣的錯誤。我最終斷開服務器上任何數據庫的所有可能的SSMS連接,從SSMS創建一個新連接並將其更改爲多用戶。

-- Actual Code to change my_db to multi user mode 
USE MASTER; 
GO 
ALTER DATABASE [my_db] SET MULTI_USER 

注意:這似乎是SQL Server 2005中的一個可能的錯誤!

3

今天早上我跑過同樣的問題。原來是一個簡單的問題。我打開了一個查詢窗口,它被設置爲對象瀏覽器中的單個用戶數據庫。 sp_who2存儲過程沒有顯示連接。一旦我關閉了它,我可以將其設置爲

7

以下爲我工作:

USE [master] 
SET DEADLOCK_PRIORITY HIGH 
exec sp_dboption '[StuckDB]', 'single user', 'FALSE'; 
ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT 
ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE 
1

我們剛剛經歷這在SQL 2012年 複製工藝躍升,當我們殺了原來的會話將其設置爲單個用戶。但sp_who2並未顯示附加到數據庫的新進程。 關閉SSMS並重新打開,然後讓我們看到數據庫上的這個過程,然後我們可以殺死它並立即切換到多用戶模式,並且工作。

我想不通,這背後的邏輯,但它似乎是在SSMS中的錯誤,並且仍然表現自己在2012年的SQL

7

我有同樣的問題,和SESSION_ID殺了使用此查詢發現:

Select request_session_id From sys.dm_tran_locks Where resource_database_id=DB_ID('BI_DB_Rep'); 
+0

這很完美。找到討厭的SPID並將數據庫重新在線。非常感謝! –

19

首先,找到並KILL所有已當前運行的進程。

然後,運行以下T-SQL將數據庫設置爲MULTI_USER模式。

USE master 
GO 
DECLARE @kill varchar(max) = ''; 
SELECT @kill = @kill + 'KILL ' + CONVERT(varchar(10), spid) + '; ' 
FROM master..sysprocesses 
WHERE spid > 50 AND dbid = DB_ID('<Your_DB_Name>') 
EXEC(@kill); 

GO 
SET DEADLOCK_PRIORITY HIGH 
ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH NO_WAIT 
ALTER DATABASE [<Your_DB_Name>] SET MULTI_USER WITH ROLLBACK IMMEDIATE 
GO 
6

按CTRL + 1

發現,鎖定你的數據庫的過程。在你的數據庫的dbname列中查找並記下spid。現在,你必須執行該語句:

kill <your spid> 
ALTER DATABASE <your db> SET MULTI_USER; 
+0

CTRL + 1是一個非常方便的捷徑,我不知道! –

2

另一種選擇是:

  • 數據庫脫機;在SMSS,右擊數據庫,然後選擇脫機,勾選「刪除所有連接」
  • 運行ALTER DATABASE [Your_Db] SET MULTI_USER
+0

我不會讓它脫機,它只是一直說它是在單用戶模式下,並且用戶已連接! (是的,我做了「放棄所有連接」)。我結束了分離數據庫! – TabbyCool

6
  1. 右鍵單擊數據庫部分數據庫
  2. 選擇「屬性」
  3. 選擇「選項「
  4. 向下滾動」其他選項「並更改」限制訪問「字段

screenshot of options page of sql server

1

添加到Jespers answer,以更加有效:

SET DEADLOCK_PRIORITY 10;-- Be the top dog. 

SET DEADLOCK_PRIORITY HIGH使用DEADLOCK_PRIORITY 5.

正在發生的事情是,其他進程在數據庫中獲取的裂縫,如果你的過程有一個較低的DEADLOCK_PRIORITY,那麼它就失去了比賽。

這可以避免發現並殺死其他spid(可能需要多次完成)。

您可能需要多次運行ALTER DATABASE(但Jesper會這樣做)。修改後的代碼:

USE [master] 
SET DEADLOCK_PRIORITY HIGH 
exec sp_dboption '[StuckDB]', 'single user', 'FALSE'; 
ALTER DATABASE [StuckDB] SET MULTI_USER WITH NO_WAIT 
ALTER DATABASE [StuckDB] SET MULTI_USER WITH ROLLBACK IMMEDIATE 
2

使用這個腳本

exec sp_who 

找到dbname和SPID列

現在執行

kill spid 
go 
ALTER DATABASE [DBName] 
SET MULTI_USER;