SQL Server Management Studio 2012卡住了

29
当我点击“对象资源管理器”中的“数据库”节点时,它会一直显示“正在加载项目”,直到某个时候就会卡住。
只有连接到远程服务器时才会出现这种情况,在我的PC上访问数据库时不会发生这种情况。其他节点也不会出现这种情况。
网络托管公司的人没有遇到任何问题。(但他们正在运行2008版本,那里的SQL服务器也是如此)
我重新安装了整个SQL服务器,但是无济于事。
可能是什么问题?

您是否可以使用这些凭据访问托管公司的多个数据库?(通常情况下不是这样的。) - Aaron Bertrand
你能解释一下“hangs”的意思吗?这是指你已经放弃了它,还是它实际上进入了“无响应”模式?你是否运行了某种网络分析器来查看在等待期间传输了哪些数据?它可能被阻塞在另一端,或者只是以非常缓慢的速度传输数据... - Aaron Bertrand
13个回答

45

我也遇到了同样的问题:在使用Object Explorer访问远程服务器时,SSMS会无限期地挂起。Windows系统事件日志将显示DCOM错误10009(“DCOM无法使用任何配置的协议与计算机MACHINE_NAME通信。”)。

解决方案是清除我的个人资料中MRU历史记录和其他设置。方法如下:

  1. 关闭所有打开的SSMS 2012实例
  2. 在资源管理器中,打开“%AppData%\Microsoft\SQL Server Management Studio”
  3. 将“11.0”文件夹重命名为其他名称,例如“11.0.old”
  4. 打开SSMS 2012

你会发现你的MRU列表已经被清除了。此时你可以重新输入你的凭据并像往常一样使用SSMS。

如果一切正常,你可以删除重命名的文件夹。否则,删除新创建的“11.0”文件夹,并将原始文件夹重新命名为“11.0”。

我不知道是否真的是MRU列表导致了这个问题,还是其他个人资料数据导致的。

我们发现SSMS试图通过端口135建立DCOM连接到SQL Server(可能是为了SSIS、T-SQL调试或其他操作)。我们的防火墙配置为阻止端口135。通过在防火墙中开放该端口,我们能够使用SSMS(这也就是为什么它对本地数据库有效而对远程数据库无效的原因)。不幸的是,一个开放的端口135会引来很多攻击,所以这对我们来说不是一个可行的解决方案。


1
删除11.0文件夹可以解决问题几天,但一周后又回到最初的状态,当尝试展开数据库节点时,对象资源管理器完全锁定,甚至在我有机会这样做之前就发生了。这是在我尝试连接到共享Web主机上有许多其他数据库的2个不同SQL服务器实例时发生的。在SSMS 2008中,我能够连接到相同的2个SQL服务器实例而没有任何问题。我可能会再次删除11.0文件夹,但这很麻烦,因为我需要重新添加所有设置。 - Ben Amada
唯一的永久解决方案是在防火墙上打开端口135,但我不建议这样做。 - Jaecen
非常感谢!在删除了SSMS 2014的12.0文件夹之后,一切都变得更快了。 - veljasije

6

关闭所有数据库的自动关闭功能。这对我来说效果很好!

每次扩展或刷新数据库列表时,服务器都会唤醒数据库,导致系统卡顿。

只需运行以下命令查找所有开启自动关闭功能的数据库:

SELECT name, is_auto_close_on
FROM master.sys.databases AS dtb 
WHERE is_auto_close_on = 1 
ORDER BY name

感谢http://social.msdn.microsoft.com/Forums/sqlserver/en-US/99bbcb47-d4b5-4ec0-9e91-b1a23a655844/ssms-2012-extremely-slow-expanding-databases?forum=sqltools 提供的帮助。
要关闭数据库的此设置,请右键单击对象浏览器中的数据库实例 -> 单击属性 -> 在数据库属性窗口左侧导航窗格中单击“选项” -> 在右侧窗格中将自动关闭属性的值更改为“False”,如下图所示: SQL Server 2008 R2中数据库属性窗口中的自动关闭选项

1
谢谢。如果这是真的 - 即必须唤醒数据库才能出现在对象资源管理器窗口中 - 我想知道为什么会这样。我想先看到它,然后再选择我需要的数据库... - ispiro
似乎2012年之前的SSMS不需要这样做。2012年必须执行某些需要加载数据库的操作... - Nuno Agapito
此外,通过谷歌搜索发现,将数据库设置为自动关闭是一种非常糟糕的做法...我将所有我的数据库(大约有40个)都进行了更改,等待时间从1-2分钟降至0秒 :) - Nuno Agapito
太准确了,伙计!每个SQL服务器上都有超过1,000个数据库!而且展开数据库需要大约40秒的时间!运行来自https://support.managed.com/kb/a402/turn-off-auto_close-on-all-ms-sql-databases.aspx的脚本,现在只需要一秒钟就能打开它们了!实际上只有每个服务器上的40个数据库设置为自动关闭... 致意和感谢Liam - Liam Wheldon
它实际上像魔法一样运行。+1。对我来说,每当我从(localdb)\v11.0实例中删除localdb数据库时,就会发生这种情况。有时会显示一个消息框,显示消息“对象引用未设置为对象的实例”,就在删除localdb数据库之后。当弹出此弹出消息时,只有对象资源管理器会挂起,其余UI是响应的。但是有时候当这个消息框不出现时,整个UI都变得无响应。 - RBT

5
假设您只能使用托管公司提供的一个数据库访问权限(至少使用某个用户名/密码),您可以通过将注册服务器设置为默认访问您应该访问的数据库来避免完全使用下拉列表:

enter image description here

这种方法即使主机创建的登录将您路由到tempdb或其他默认情况下,管理工作室仍将使您处于您的数据库上下文中。

现在我看到您在谈论对象资源管理器节点,而不是我错误地解释的“使用数据库”下拉菜单。尝试的方式可能是突出显示数据库节点(不要展开它)并单击F7(对象资源管理器详细信息)。如果这对您有用,则可以通过此方法导航层次结构,并且作为奖励,您可以在此处显示许多实体属性并进行多选,这两个内容在对象资源管理器中无法控制。

如果这没有帮助,则您的主机应该比他们表现出的更好地帮助您。如果支持SSMS 2012,则他们应该能够在SSMS 2012中测试并确认或否认它是否能够复制。如果不支持,则我认为您的补救措施是安装SSMS 2008(它们可以共存)并将其用于管理此特定服务器。

当然,您可以使用目录视图和/或DMV做到几乎所有您可以在对象资源管理器中做的事情(以及许多您无法做到的事情)。因此,在确定要做什么之前,您可能需要回顾(或与我们分享)您正在使用对象资源管理器的确切内容-如果有一种方法可以不使用对象资源管理器来完成它,则您可能会喜欢解决方法而不是拥有两个版本的工具(因为2012 SSMS中的改进绝对没有任何关系与对象资源管理器)。


感谢您提供详细的答案。 我尝试将数据库名称放入“连接属性”中 - 它只是像以前一样连接到服务器。 我尝试了“对象资源管理器详细信息” - 同样的问题。 网络主机不支持2012年版。 我正在下载SSMS 2008,但希望避免使用该选项,因为害怕它可能会干扰2012(是否有文档说明两者可以共存?)。 至于目录视图和DMV - 听起来很有前途 - 它们是什么? 再次感谢。 - ispiro
我不知道它是否有记录,但只要您不使用Visual Studio或BIDS等工具,那么我可以向您保证它们不会相互影响(尽管我不确定如果您将第二次安装2008,谁会在偏好/键盘自定义等方面获胜)。 我认为使用2008版本不会改变任何东西,但至少它会给您一个合理的抱怨,即您可以在他们支持的版本中破坏它。 他们应该能够试图从他们温馨的小网络外部重现它(我确信它可以正常工作)。 - Aaron Bertrand
我正在使用Visual Studio和Visual Web Developer。 - ispiro
那我就不会提供任何保证了。 :-) 我只在使用管理工具时采用并排模式。如果你使用的是Visual Studio 2010,我听说有并排问题,只有在安装Visual Studio 2010 SP1(或者已经安装)后才能解决。在重新打开管理工具副本之前,我建议你先这样做。如果你使用的是旧版本的Visual Studio,抱歉,我可帮不了你了。 - Aaron Bertrand
已经应用了很长时间了。我想我会尝试那个选项。再次感谢您的帮助。并且使用VS2010。 - ispiro
显示剩余2条评论

4
我与 Microsoft SQL 支持团队一起解决这个问题花了一个多月的时间。该问题已被提交为 bug。
我在 Win 7(64 位)上安装了 SQL 2012 SSMS 和 VS 2012。
删除配置文件夹从来没有持续合理的时间。
我们找到的解决方法是确保我的 SSMS 配置文件默认连接到 Master 数据库。这似乎与以下事实有关:我使用 Windows 身份验证进行连接,并且我隶属于具有 SQL 权限分配的多个 AD 组,而我在 AD 帐户上没有设置 SQL 特定权限。

4
在我的情况下,删除配置文件文件夹只起到了一次作用。下一次打开SSMS 2012时,连接服务器时仍会出现冻结。SP1也无法解决这个问题。
直到我发现了一个简单的解决方法,描述在connect.microsoft.com上由Ben Amada提供的中:在关闭SSMS 2012之前始终关闭对象资源管理器详细信息 因此,对于我来说,完整的解决方法如下:
  1. 按照Jaecen的回答操作,但在创建了干净的配置文件文件夹后再次关闭SSMS 2012
  2. 应用Hoodlum的建议,并将SqlStudio.bin从旧的配置文件文件夹复制到新的配置文件文件夹中(旧的配置文件文件夹可以随后删除)
  3. 每次在关闭SSMS 2012之前,请确保关闭对象资源管理器详细信息窗口
前两个步骤仅需要执行一次,或者如果意外地保留了对象资源管理器详细信息窗口。 编辑 我刚才注意到,在同一SSMS会话中重新连接到SQL服务器时,关闭“对象资源管理器详细信息”窗口也是必需的。因此,每当连接到服务器时,“对象资源管理器详细信息”窗口都必须关闭。

这仍然适用于例如在任何旧版本的Windows中使用的SSMS 18.10。 - Elken

2
我正在连接多个远程服务器,这些服务器的版本从2000到2012不等。 本地PC上的SMSS是SQL Server 2012,SMSS版本为11.0.2100.60。
每天会出现几次SSMS卡死的情况。当发生这种情况时,我通过RDP连接到本地服务器/SMSS/活动监视器,并逐个杀死我的PC上数据库名称为master的进程,直到我PC上的SMSS恢复正常。
这种方法总是有效的,但如果能找到治疗方法而非仅仅解决症状,那将是非常受欢迎的。

2

我有一些SQL Server,从2000年到2012年,可以在我的桌面上通过SMSS访问它们。问题的出现频率不同,看起来是这样的:当我折叠对象资源管理器中的服务器时,SMSS会冻结。

查看相关服务器上的活动监视器后,我发现一个进程在master数据库中执行以下查询,主机为我的桌面:

SELECT dtb.name AS [Name] FROM master.dbo.sysdatabases AS dtb ORDER BY [Name] ASC SMSS

终止进程可以解决SMSS的冻结。


1
我已测试了以上所有答案,但我的SSMS在展开数据库列表时卡住了。最终我找到了问题所在,原因是我恢复了一个数据库,但它最后没有正确地恢复。然后当我扩展数据库列表时,它就一直卡住了。
我运行了以下查询:
SELECT 
dtb.name AS [Name]
,dtb.database_id AS [ID] 
,CAST(has_dbaccess(dtb.name) AS bit) AS [IsAccessible] FROM master.sys.databases AS dtb 

然后结果花费了太长时间,最终超时了,但是当我筛选卡住的数据库时,我得到了结果。
SELECT 
dtb.name AS [Name]
,dtb.database_id AS [ID] 
,CAST(has_dbaccess(dtb.name) AS bit) AS [IsAccessible] FROM 
master.sys.databases AS dtb 
Where name <> 'StuckDB' ORDER BY [Name] ASC 

最终,我决定分离StuckDB以解决我的问题。

1

以下是对我有效的操作步骤: 打开SSMS 点击连接到对象资源管理器按钮 在连接到服务器对话框中展开选项 >> 点击重置所有 完成!


0

我通过将默认数据库更改回主数据库来解决了这个问题。


那是因为你设置的默认数据库启用了自动关闭功能吗? - influent
@influent 那是哪里? - Tuan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接