2

今天我試圖通過已經存在的數據庫恢復數據庫,我只需右鍵單擊SSMS中的數據庫 - >任務 - >脫機,這樣我就可以恢復數據庫。數據庫處於轉換狀態

出現一個小彈出窗口,並顯示Query Executing.....一段時間,然後拋出錯誤說Database is in use cannot take it offline。從我收集有該數據庫的一些活動連接,所以我試圖在這一點上SSMS執行以下查詢

USE master 
GO 
ALTER DATABASE My_DatabaseName 
SET OFFLINE WITH ROLLBACK IMMEDIATE 
GO 

再次顯示Query Executing.....了一段時間,然後扔了以下錯誤:

Msg 5061, Level 16, State 1, Line 1 
ALTER DATABASE failed because a lock could not be placed on database 'My_DatabaseName'. Try again later. 
Msg 5069, Level 16, State 1, Line 1 
ALTER DATABASE statement failed. 

之後,我無法通過SSMS連接到數據庫。當我嘗試脫機使用它SSMS扔一個錯誤說:

Database is in Transition. Try later ..... 

在這一點上,我只是could'nt觸摸數據庫什麼我想它返回相同的錯誤消息Database is in Transition

我在谷歌上讀了一些問題,其中有人遇到類似的問題,他們建議關閉SSMS並再次打開它,我也是這樣,因爲它只是一個開發服務器,我剛剛使用SSMS刪除了數據庫並進行了恢復在一個新的數據庫上。

我的問題是什麼可能導致此?以及我如何避免將來發生這種情況,並且如果我將來在相同的情況下結束,是否還有其他解決方法,然後刪除整個數據庫?

謝謝

回答

2

看看這篇文章。

http://oostdam.info/index.php/sectie-blog/289-sql-error-952-8ways-to-solve-it

我用TSQL的大部分時間,所以我還沒有遇到這個問題呢。

什麼版本的SQL Server數據庫和哪個補丁級別?

下一次,請執行usp_who2以查看正在運行的線程。

http://craftydba.com/wp-content/uploads/2011/09/usp-who2.txt

由於輸出是在一個表中,你可以通過數據庫搜索。

在嘗試ALTER語句之前使用數據庫終止所有線程。

大約6個月前的一個夜晚,由於應用程序不斷觸碰它,我有一段糟糕的時間讓2000數據庫脫機。我最終禁用了用戶帳戶,因此我不會再有任何登錄信息。

+0

謝謝您的回答和鏈接,它是2008 R2 SP1的數據中心版。這是確切的問題。它是一個客戶端應用程序數據庫,儘管當時沒有用戶使用該應用程序,但無論有多少次我將它們從活動監視器中終止連接,應用程序仍具有活動連接。 –

+0

非常有用的鏈接非常感謝你。我一直在使用Google搜索,沒有發現一個出血的東西,然後'關閉你的SSMS' :) –

4

檢查了這一點。這將幫助您釋放鎖。很棒!https://dba.stackexchange.com/questions/57432/database-is-in-transition-error

使用本

select 
    l.resource_type, 
    l.request_mode, 
    l.request_status, 
    l.request_session_id, 
    r.command, 
    r.status, 
    r.blocking_session_id, 
    r.wait_type, 
    r.wait_time, 
    r.wait_resource, 
    request_sql_text = st.text, 
    s.program_name, 
    most_recent_sql_text = stc.text 
from sys.dm_tran_locks l 
left join sys.dm_exec_requests r 
on l.request_session_id = r.session_id 
left join sys.dm_exec_sessions s 
on l.request_session_id = s.session_id 
left join sys.dm_exec_connections c 
on s.session_id = c.session_id 
outer apply sys.dm_exec_sql_text(r.sql_handle) st 
outer apply sys.dm_exec_sql_text(c.most_recent_sql_handle) stc 
where l.resource_database_id = db_id('<YourDatabase>') 
order by request_session_id; 

,然後
每個processnumber

kill <processnumber> 
+0

只是爲了澄清,''processnumber>'是'blocking_session_id'列中的數字! –

+0

非常感謝 – Abdul