SQL Server 用户实例错误:现有数据库已达到允许的最大数量

Posted

技术标签:

【中文标题】SQL Server 用户实例错误:现有数据库已达到允许的最大数量【英文标题】:SQL Server User Instances error: Existing databases has reached the max number allowed 【发布时间】:2015-01-13 13:48:56 【问题描述】:

我在 Visual Studio 2008 中使用 C# 在我的 PC 上循环遍历 MDF 文件并从中提取数据。我正在使用表适配器指向本地 MDF 文件。

最近我的一台电脑拒绝让我附加任何新的数据源,因为它说

System.Data.SqlClient.SqlException:无法创建/附加任何新数据库,因为现有数据库的数量已达到 允许的最大数量:32766

即使我启动一个新的 Windows 应用程序并尝试将 MDF 文件(在我的桌面上)添加到它作为数据源,我也会收到上述错误。

谁能告诉我如何移除/删除现有的连接?

我的代码在另一台 PC 上运行良好,我在我的 PC 上重新安装了 Visual Studio,但仍然出现此错误。

C# 表适配器代码:

tmTableAdapter.Connection.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename='" + pathofmdffile + "';Integrated Security=True;Connect Timeout=30;User Instance=True";
tmTableAdapter.Connection.Open();

【问题讨论】:

你做过tmTableAdapter.Connection.Close()吗? 重新安装 VS 无济于事,因为错误来自 SQL Server。如果您连接到 SSMS 中的 SQLEXPRESS 实例并查看 Databases 文件夹,您是否看到全部 32,766 个?您可能需要将它们分离。 谢谢,是的,我在 C# 代码后面的三行中执行了 tmTableAdapter.Connection.Close()。当我打开 SSMS 并连接到 MYCOMPUTERNAME\SQLEXPRESS 并查看 Databases\System Databases 时,我看到 4 个 DB(master、model、msdb 和 tempdb)我应该在哪里查看(抱歉,对 SQL Server 不太熟悉) @JohnSaunders 即使​​在关闭连接后,数据库仍保持连接状态。我在回答中详细说明了如何摆脱它们。 【参考方案1】:

重新安装 VS 将无济于事,因为错误来自 SQL Server。

看看这些 MSDN 页面有很多很好的信息:

SQL Server Express User Instances SQL Server 2005 Express Edition User Instances User Instances for Non-Administrators

由于您使用的是“用户实例”,我猜在连接到主 SQLEXPRESS 实例时数据库不会显示。

检查事项:

在 SSMS 中,通过执行以下操作连接到您最后连接的数据库:

转到对象资源管理器 与数据库引擎的新连接 在“连接到服务器”弹出窗口中: 点击“选项>>”按钮 转到“其他连接属性”选项卡 在文本区域输入以下内容:User Instance = true 点击“连接”按钮 展开“数据库”文件夹。您应该会看到它们,以 MDF 文件的完整路径命名 右键单击数据库 转到“任务>” 第一个选项是“分离”

显然,这对于 32,766 个数据库来说是不切实际的,但对于少数人来说,这是最好的选择。

默认情况下,sqlservr.exe 进程会挂起 60 分钟,您在它终止之前附加的任何数据库都会被添加到列表中,并且可能会重置过期计数器。您可以通过连接到最近附加的数据库来立即结束该过程(如上所述;这些步骤适用于新查询,或者如果通过对象资源管理器连接,则右键单击实例名称并转到“新查询” ),然后运行以下命令:

SHUTDOWN;

这将一次性清除所有连接的数据库。

将超时设置为小于 60 分钟。根据SQL Server Express User Instances页面(同上链接):

父实例上的系统管理员可以通过使用 sp_configure 更改 用户实例超时 选项来设置用户实例的超时期限。默认为 60 分钟。

在 SSMS 中(确保您已连接到 实例):

-- View current setting (in the "run_value" field)
EXEC sp_configure 'user instance timeout'
-- Documentation says default is 60 but mine was 5


-- If you can't see the option, run the following:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;


-- To change it, run the following:
EXEC sp_configure 'user instance timeout', 5;

使用“SQL Server Express Utility”分离一个或多个数据库:

SSEUtil.exe 于 2005 年编写,此后一直没有更新(当前版本为 v1.0.2130)

下载地址:https://www.microsoft.com/en-us/download/confirmation.aspx?id=3990

使用-d[etach] <dbpath[*]>|name=<dbname> 命令

查看以下目录,其中包含 4 个系统 DB:

在 XP / Vista 上:C:\Documents and SettingsUserName\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS

在 Windows 7 及更高版本上:C:\UsersUserName\AppData\Local\Microsoft\Microsoft SQL Server Data\SQLEXPRESS

这主要只是提供信息,因为只要 SQL Server 进程正在运行,就无法删除这些文件。


对于持续的基础,如果您将在一个循环中附加许多 DB,您可以在使用完每个 DB 后通过运行 sp_detach_db 以编程方式在该过程中删除它们:

USE [master];
ALTER DATABASE [DatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
EXEC sp_detach_db @dbname =N'DatabaseName';

仅供参考,“用户实例”现已弃用。你应该考虑使用SQL Server Express LocalDB。

【讨论】:

非常感谢您的帮助。一个清晰简洁的答案(对于像我这样的学习者),带有帮助我了解更多信息的链接,很棒的答案。您能否扩展一下一次性关闭所有连接。我可以像你上面说的那样单独分离,但如果可能的话,我想选择和分离多个数据库(就像你说的那样,对所有 32k dbs 都这样做是不切实际的) 没关系,找到“SQL Server Express 实用程序”的解决方案。见以下链接:***.com/questions/2367688/… @lway 是的,在第二个链接“SQL Server 2005 Express Edition User Instances”中提到了该实用程序,尽管它并未表明它可以使用通配符进行多次分离。好的。我可以将其添加到我的答案中。但这仍然不是以编程方式进行的好选择,因为它需要进行炮击。相反,如果您不想在每个进程中都这样做,您仍然应该在循环中执行 sp_detach_db。毕竟,这就是 SSEUtil 所做的一切。您只需要确保单用户模式。还有一个 DMV 只显示用户实例而不是真实的数据库。我会更新的。 完全同意,至少现在我可以再次运行我的代码并将 sp_detach_db 合并到其中。 SSE 实用程序可用于帮助您摆脱困境并让您恢复正常运行,但您无法超越正确的编程实践。再次感谢您的帮助。

以上是关于SQL Server 用户实例错误:现有数据库已达到允许的最大数量的主要内容,如果未能解决你的问题,请参考以下文章

由于启动用户实例的进程时出错,导致无法生成 SQL Server 的用户实例。该连接将关闭。

将现有数据库用户映射到SQL Server登录。

如何删除 SQL Server 故障转移群集实例

如何安装sql server 2008 r2

SQL Server Express 数据库实例连接错误

无法在 sql server 2008 中为现有项目执行数据库附件