2009-08-18 1 views
2

現在、運用サーバー上の開発データベースをデタッチしています。これはプロダクションサーバーなので、SQLサービスを再起動する必要はありません。それが最悪のシナリオです。デタッチデータベース/テイクオフに失敗しました

明らかに私はSSMSを使ってそれを切り離そうとしました。私にはアクティブな接続があったと言いました。私はそれを切断しました。 2回目を外すと、それが使用されて以来不可能であると私に言った。

私はEXEC sp_detach_db「DB」を試してみました。

データベースをオフラインにしようとしました。それは私が退屈してそれをオフにしたときに約15分間走った。

とにかく、私はすべてを試しました... SSMSを使用してデタッチデータベースの接続インジケータを使用してすべての接続が強制終了されたことを確認しました。

次の0の結果が返さ:DBID = DB_ID( 'DB')

そして以下は現在18分間実行されているsys.sysprocesses FROM

使用をマスター SELECT *:

ALTER DATABASE DB OFFLINE WITH ROLLBACK IMMEDIATE

SSMSが目に見えないものをロックすることで、SSMSが原因ではないことを確認するために、SMSSを定期的に再起動しました。

これを強制する方法はありませんか?データベーススキーマは私がかなり好きなものですが、データは消耗品です。

クイックフィックスのいくつかの並べ替えがありますか? :)

DBAは今晩プロセスをリセットしようとしますが、私はこの場合のための修正を知りたいと思います。

Thx!

ps:私はDTCを使用しています...これはおそらく、なぜ私のデータベースが突然ロックされたのかを説明するかもしれませんか?

編集:

私は今、最後の部分の無限の実行、その結果次のことをやっています。最初のクエリでも0が返されるので、ユーザーの殺害は問題ではないと考えています。

に[マスター] GO

SELECT * @return_valueが

EXEC @return_value int型DBID = DB_ID( 'データベース')

GO

DECLARE sys.sysprocesses FROM = [dbo]。[usp_KillUsers] ROLLBACK IMMEDIATE WITH @p_DBName = 'データベース'

SELECT '戻り値' = @return_value

GO

ALTER DATABASEデータベースSETのOFFLINE

GO

答えて

1

(process_idを持つ一方(S)-2)

syslockinfo KILL 'number_returned' FROM DISTINCT req_transactionUOWを選択

原因は、DTCは少し迷惑であると失敗したトランザクションで完全にデータベースをロックしました。今私はこれが起こった理由を知りたいと思います。しかし、少なくとも問題が再発したときに壊れたトランザクションをリセットすることができます。

同じ問題が発生している人に役立つと思いますので、ここに投稿しています。

1

する方法あなたはSQL Serverに接続していますか?あなた自身が接続している間にデータベースを切り離そうとしている可能性はありますか?これにより、関連するSQL Serverのバージョンに応じてDetachをブロックできます。

このようなものにはDACをお試しください。データベースをデタッチする前にすべての接続を殺す

+1

また、私はデタッチしようとしているDBを使用していないことを確認するために、最初に明示的な「使用マスター」を置いています。 –

+0

私は100%データベースを使用していないと確信しています。私はあなたがそのデータベースでアクティブな接続がないことを確認するためにチェックできるすべての場所をチェックしました。 – SpoBo

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

関連する問題