2009-08-18 103 views
2

我目前正在分離生產服務器上的開發數據庫。由於這是一個生產服務器,我不想重新啓動sql服務。這是最糟糕的情況。分離數據庫/離線失敗

顯然我試圖通過SSMS分離它。告訴我有一個活躍的連接,我斷開了它。第二次分離時,它告訴我,這是不可能的,因爲它被使用。

我試過EXEC sp_detach_db'DB'沒有運氣。

我試圖讓數據庫脫機。當我感到無聊並關閉它時,它跑了大約15分鐘。

無論如何,我嘗試了一切...我確保所有連接都使用SSMS的分離數據庫中的連接指示符被殺死。

下返回0結果:

USE主 SELECT * FROM sys.sysprocesses WHERE DBID = DB_ID( 'DB')

並且正在運行現在18分鐘以下:

ALTER DATABASE數據庫脫機立即回滾

我在所有這些過程中都定期重新啓動SMSS,以確保SSMS不是通過隱藏鎖定東西的罪魁禍首。

難道沒有辦法蠻橫嗎?數據庫模式是我非常喜歡的,但數據是可消耗的。

希望有某種快速修復? :)

DBA將嘗試重置該過程今晚,但我想知道這個解決方案,以防萬一。

Thx!

ps:我正在使用DTC ...所以這也許可以解釋爲什麼我的數據庫突然被鎖定了?

編輯:

我現在做的,這導致最後一部分的無限執行以下。第一個查詢甚至返回0,所以我想殺死用戶將不會有問題。

USE [主] GO

SELECT * FROM sys.sysprocesses WHERE DBID = DB_ID( '數據庫')

GO

DECLARE @return_value詮釋

EXEC @return_value = [DBO]。[usp_KillUsers] @p_DBName = '數據庫'

SELECT '返回值'= @return_value

GO

WITH IMMEDIATE ROLLBACK

ALTER DATABASE數據庫SET OFFLINE

GO

回答

1

SELECT DISTINCT req_transactionUOW從syslockinfo

KILL 'number_returned'(一個(或多個)與PROCESS_ID -2)

原因是DTC是有點討厭,一個失敗的事務完全鎖定數據庫。現在我想知道發生這種情況的原因。但至少它讓我有能力在問題重新出現時重置已損壞的事務。

我在這裏發佈它,因爲我確信它會幫助一些遇到相同問題的人。

1

如何都你連接到SQL Server?當您自己連接到數據庫時,是否有可能試圖分離數據庫?這可以阻止分離,具體取決於涉及的SQL Server版本。

你可以嘗試使用DAC這樣的東西。

+1

對於這樣的任務,我喜歡在開始時放置一個明確的「使用主」,以確保我沒有使用我試圖分離的數據庫。 – 2009-08-18 16:01:16

+0

我100%確定我沒有使用數據庫。我檢查了每個可以檢查的地方,以確保該數據庫上沒有連接處於活動狀態。 – SpoBo 2009-08-25 07:56:01

1

嘗試分離數據庫之前殺死所有連接,IE:

USE [master] 
GO 
/****** Object: StoredProcedure [dbo].[usp_KillUsers] Script Date: 08/18/2009 10:42:48 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[usp_KillUsers] 
    @p_DBName SYSNAME = NULL 
AS 

/* Check Paramaters     */ 
/* Check for a DB name     */ 
IF (@p_DBName IS NULL) 
BEGIN 
    PRINT 'You must supply a DB Name' 
    RETURN 
END -- DB is NULL 
IF (@p_DBName = 'master') 
BEGIN 
    PRINT 'You cannot run this process against the master database!' 
    RETURN 
END -- Master supplied 
IF (@p_DBName = DB_NAME()) 
BEGIN 
    PRINT 'You cannot run this process against your connections database!' 
    RETURN 
END -- your database supplied 

SET NOCOUNT ON 

/* Declare Variables     */ 
DECLARE @v_spid INT, 
     @v_SQL NVARCHAR(255) 

/* Declare the Table Cursor (Identity) */ 
DECLARE c_Users CURSOR 
    FAST_FORWARD FOR 
SELECT spid 
    FROM master..sysprocesses (NOLOCK) 
    WHERE db_name(dbid) LIKE @p_DBName 

OPEN c_Users 

FETCH NEXT FROM c_Users INTO @v_spid 
WHILE (@@FETCH_STATUS <> -1) 
BEGIN 
    IF (@@FETCH_STATUS <> -2) 
    BEGIN 
    SELECT @v_SQL = 'KILL ' + CONVERT(NVARCHAR, @v_spid) 
-- PRINT @v_SQL 
    EXEC (@v_SQL) 
    END -- -2 
    FETCH NEXT FROM c_Users INTO @v_spid 
END -- While 

CLOSE c_Users 
DEALLOCATE c_Users 

這是一個腳本來殺死所有的用戶連接到數據庫,只是通過數據庫名稱,它將關閉它們。然後你可以嘗試分離數據庫。這個腳本是我後來發現的,我不能聲稱它是我自己的。我不是說這是任何形式的東拼西湊,我只是沒有來源。

+0

測試過它,返回0,所以我想所有連接都關閉了。之後,使其脫機仍然失敗。告訴我它無法鎖定數據庫。 – SpoBo 2009-08-25 07:56:39