2

我目前正在分离生产服务器上的开发数据库。由于这是生产服务器,我不想重新启动 sql 服务。那是最坏的情况。

显然,我尝试通过 SSMS 将其分离。告诉我有一个活动连接,我断开了它。第二次分离时,它告诉我这是不可能的,因为它正在使用中。

我尝试了 EXEC sp_detach_db'DB',但没有成功。

我尝试让数据库脱机。当我感到无聊并将其关闭时,它运行了大约 15 分钟。

无论如何,我尝试了一切......我确保使用 SSMS 分离数据库中的连接指示器杀死所有连接。

以下返回 0 个结果:

使用主 SELECT * FROM sys.sysprocesses WHERE dbid = DB_ID('DB')

以下内容现在运行了 18 分钟:

ALTER DATABASE DB SET OFFLINE WITH ROLLBACK IMMEDIATE

在所有这些过程中,我确实定期重新启动 SMSS,以确保 SSMS 不是通过隐形锁定某些东西的罪魁祸首。

没有办法暴力破解吗?数据库模式是我非常喜欢的东西,但数据是可消耗的。

希望有某种快速修复?:)

DBA 今晚将尝试重置该过程,但我想知道解决方法以防万一。

谢谢!

ps:我正在使用DTC ...所以也许这可以解释为什么我的数据库突然被锁定了?

编辑:

我现在正在执行以下操作,这会导致最后一部分无限执行。第一个查询甚至返回 0,所以我想杀死用户甚至都不重要。

使用 [主] 去

SELECT * FROM sys.sysprocesses WHERE dbid = DB_ID('Database')

声明 @return_value int

EXEC @return_value = [dbo].[usp_KillUsers] @p_DBName = '数据库'

选择“返回值”=@return_value

ALTER DATABASE Database SET OFFLINE WITH ROLLBACK IMMEDIATE

4

3 回答 3

1

你是如何连接到 SQL Server 的?当您自己连接到数据库时,您是否有可能尝试分离数据库?这可能会阻止分离,具体取决于所涉及的 SQL Server 版本。

您可以尝试将DAC用于此类操作。

于 2009-08-18T15:45:53.167 回答
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

这是一个终止所有用户到数据库的连接的脚本,只需传递数据库名称,它就会关闭它们。然后你可以尝试分离数据库。这个脚本是我不久前发现的,我不能声称它是我自己的。我并不是说这是任何形式的抄袭,我只是没有来源。

于 2009-08-18T16:28:50.630 回答
1

从 syslockinfo 中选择 DISTINCT req_transactionUOW

KILL 'number_returned'(带有 process_id -2 的那个)

原因是 DTC 有点烦人,并且由于事务失败而完全锁定了数据库。现在我想知道发生这种情况的原因。但至少它使我能够在问题再次发生时重置损坏的事务。

我在这里发布它,因为我相信它会帮助一些遇到同样问题的人。

于 2009-08-25T08:45:10.700 回答