【问题标题】:detach database/take offline fails分离数据库/脱机失败
【发布时间】:2009-08-18 15:31:46
【问题描述】:

我目前正在分离生产服务器上的开发数据库。由于这是生产服务器,我不想重新启动 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')

DECLARE @return_value int

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

SELECT '返回值' = @return_value

ALTER DATABASE Database SET OFFLINE WITH ROLLBACK IMMEDIATE

【问题讨论】:

    标签: tsql transactions locking msdtc


    【解决方案1】:

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

    您可以尝试使用 DAC 来处理此类问题。

    【讨论】:

    • 对于这样的任务,我喜欢在开始时放置一个明确的“使用主机”,以确保我没有使用我试图分离的数据库。
    • 我 100% 确定我没有使用数据库。我检查了您可以检查的每个地方,以确保该数据库上没有处于活动状态的连接。
    【解决方案2】:

    在分离数据库之前尝试杀死所有连接,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,所以我猜所有的连接都关闭了。之后将其离线仍然失败。告诉我它无法锁定数据库。
    【解决方案3】:

    从 syslockinfo 中选择 DISTINCT req_transactionUOW

    KILL 'number_returned'(process_id -2)

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 2021-07-15
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      相关资源
      最近更新 更多