2009-08-18 84 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