【问题标题】:Single user mode "missing behavior" on SQL ServerSQL Server 上的单用户模式“缺失行为”
【发布时间】:2013-04-04 11:41:59
【问题描述】:

我运行了一个由 Microsoft 员工提供的script,以了解哪些索引需要根据平均碎片进行重建/重组。我得到了一个合理的列表,但是在尝试在特定数据库上重建其中一些时,我一直收到错误:

我得到的第一个想法是将数据库设置为单用户模式,重建索引,然后使其恢复活力。好吧,这并没有帮助,因为数据库是由 Windows 服务填充的,具有讽刺意味的是,该服务使用与我连接的同一用户,并且是唯一对我有足够权限的用户。我正在一个公司环境中工作,所以月亮比获得另一个用户凭据更近一些。我也无法在执行任务时停止服务,因为它用于许多其他事情。

我的问题很简单:如何强制单用户模式强制单连接源?换句话说,如何从服务中隐藏数据库或最终的 SQL 服务器?它将正确处理缺席作为网络问题,因此我不必担心那部分。

【问题讨论】:

    标签: sql sql-server single-user


    【解决方案1】:

    我找到了一个可以帮助他人的好解决方案。我首先使用以下方法获取当前表上带有锁的事务列表:

    USE [Your DB Name]
    
    SELECT REQUEST_MODE, REQUEST_TYPE, REQUEST_SESSION_ID
    FROM sys.dm_tran_locks
    WHERE RESOURCE_TYPE = 'OBJECT'
    AND RESOURCE_ASSOCIATED_ENTITY_ID =(SELECT OBJECT_ID('YourTableName'))
    

    REQUEST_SESSION_ID 是在表上设置了锁的会话的 ID。然后我运行 EXEC sp_who2 以确保 SPID 是预期服务的 SPID。最后我需要做的就是KILL <SPID> 并重建索引。如果您要构建多个索引,则可能需要多次执行此操作,因为可能会再次设置锁定。

    【讨论】:

      【解决方案2】:

      在 SQL Server 2005 及更高版本中重建索引时有一个可用的 ONLINE = ON/OFF 选项,它控制用户如何访问基础表,这可能会解决您的问题。

      http://msdn.microsoft.com/en-us/library/ms188388(v=sql.110).aspx

      【讨论】:

      • 你提供的同一个链接说默认是关闭的。
      • 只有在使用企业版时才能进行在线索引重建。
      【解决方案3】:

      您的问题是界面只会等待一定的时间才能决定失败。我经常遇到这种情况。

      您可以尝试编写更改脚本,然后手动运行它,这样您就可以等到当前使用索引的用户释放所有锁。不过你必须小心,索引重建会在索引运行时锁定索引(当然,除非你有企业版,重建在线,一切都是用钱做的)

      【讨论】:

      • 你看到标题中的“单用户模式”了吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      相关资源
      最近更新 更多