SQL Server 2008 R2 连接有时会因“登录不正确”而失败

SQL Server 2008 R2 连接有时会因“登录不正确”而失败

作为我们测试套件的一部分,除了模拟所有内容且不需要数据库连接的单元测试之外,我们还有需要数据库的集成测试。

需要进行集成测试是因为我们正在处理大量遗留代码,它为我们提供了执行高级测试的可能性。

设置

数据库是 SQL Server 2008 R2,运行在具有所有最新 Windows 更新的 Windows Server 2008 R2 系统上。操作系统和 SQL Server 均已安装更新。

运行数据库服务器的虚拟机是我们构建基础设施的一部分,每天早上 6 点根据映像新建,晚上 10 点销毁。所以我知道 SQL Server 代理和服务本质上是新的并且每天都会启动。第一次构建发生在早上 7 点,这给了机器充足的时间启动和加载所有服务。

数据库服务器配置为允许无限数量的连接,并且启用命名管道和 TCP 连接。

与数据库的连接由用户。

我们有一份精简版的生产数据库快照,中密度纤维板,其中包含执行测试所需的所有表、视图、存储过程和最少数据集。

当集成测试运行时,测试设置会复制中密度纤维板到我们的 SQL Server 安装的 DATA 文件夹中密度纤维板然后使用以下命令将 .b.mdf 附加到数据库:

CREATE DATABASE Foo ON (FILENAME = N'Path\To\b.mdf') FOR ATTACH

测试运行,执行数据库操作,并在测试夹具的测试拆卸中分离数据库并删除 b.mdf 文件。

分别执行以下两个命令来执行分离操作:

ALTER DATABASE Foo SET SINGLE_USER WITH ROLLBACK IMMEDIATE
EXEC master.dbo.sp_detach_db @dbname = N'Foo'

因此,在实践中,我有一组布局如下的测试装置:

Setup();
Test_1();
Test_2();
Test_3();
TearDown();

每个设置都会创建一个新的数据库,运行所有测试并删除数据库,以便下一个文本装置从一个干净、全新的数据库开始。

我总共有大约 50 个文本装置,每个装置包含 10 个测试。因此,数据库连接和分离次数为 50 次,并且运行了大约 500 个测试。

问题

过去几周,我发现与集成测试相关的失败构建数量有所增加。我知道我的测试没有问题,因为整个设置在我本地机器和其他开发人员的机器上都能完美运行。只是构建服务器报告了一个问题:

SetUp Error : Namespace.Class.Method
SetUp : System.Data.SqlClient.SqlException : Cannot open database "Foo"    requested by the login. The login failed.
Login failed for user 'sa'.

显然,我谷歌了一下,结果显示登录信息正确。我知道这一点,因为失败的测试并不总是相同的。如果我运行整个测试套件 10 次,那么 10 次中有 8 次会失败,但报告失败的测试每次都不同。错误消息是相同的,说无法登录,有时还会报告管道的另一端没有进程

我还检查了命名管道和 TCP 连接是否已启用,检查了允许的连接数,...我检查了 ERRORLOG 文件,但它不包含与我的数据库直接相关的任何内容。

我的猜测是,由于某种奇怪的原因,它太快或太慢,无法正确连接或分离数据库,或者是调用SINGLE_USER导致问题。据我所知,如果一个测试由于登录而失败,则无法删除 b.mdf 文件,因为该文件似乎正在使用中。

所以我的问题是:我还能尝试其他什么吗?是否有错误日志文件或特定消息可以为我提供更多见解?我可以做些什么来检查连接和分离是否成功?(分离失败是否可能导致登录问题?)分离操作是否是异步的,因此在下一次调用时是否可能尚未完成?

答案1

第一个问题:登录失败错误。
测试运行时,您的数据库很可能尚未完全初始化。
您应该在过程中捕获此问题,一种简单的方法是查询主数据库以查看目标数据库是否已启动并正在运行。

IF (select name from sys.databases
where name = 'foo' and state_desc = 'ONLINE' and is_in_standby = '0') IS NOT NULL
PRINT 'database not found';

第二个问题:管道另一端没有进程。
如果您不通过 TCP/IP 连接,则此错误背后的错误通常很难发现。
您可以尝试启用直接 IP 连接,或者您可以关注其他错误,它们很可能是导致此错误的原因。

相关内容