如何分离 NCrunch 节点服务使用的所有 LocalDb 数据库



有时,使用 LocalDB 的测试的清理代码不会运行(可能是在取消测试时(。 结果是大量垃圾本地数据库。

运行尝试创建另一个本地数据库的测试时出现这样的错误

System.Data.SqlClient.SqlException: Unable to create/attach any new database because the number of existing databases has reached the maximum number allowed: 32765. ved System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) ved System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) ved System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) ved System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) ved System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite) ved System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) ved System.Data.SqlClient.SqlCommand.ExecuteNonQuery() ved Dapper.SqlMapper.ExecuteCommand(IDbConnection cnn, CommandDefinition& command, Action`2 paramReader) ved Dapper.SqlMapper.ExecuteImpl(IDbConnection cnn, CommandDefinition& command) ved Dapper.SqlMapper.Execute(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Nullable`1 commandTimeout, Nullable`1 commandType)

测试清理在每个测试类中都是这样的(使用 xunit(

public override void Dispose()
{
base.Dispose();
FreeDb();
GC.SuppressFinalize(this);
}
private void FreeDb()
{
Task.Factory.StartNew(() =>
{
var masterConnectionString =
@"Data Source=(LocalDB)MSSQLLocalDB;Integrated Security=True; Initial Catalog=master";
using (var dbConnection = new SqlConnection(masterConnectionString))
{
dbConnection.Execute($"ALTER DATABASE [{_databaseName}] SET OFFLINE WITH ROLLBACK IMMEDIATE");
dbConnection.Execute($"exec sp_detach_db '{_databaseName}'");
}
});
}

使用 Sql 服务器 Management Studio 连接到以下服务器 (LocalDb(\MSSQLLocalDB

然后使用以下语句确定哪些数据库是 localDb:

SELECT * FROM sys.databases

在此之后,更正以下分离 localdb 语句以仅分离本地数据库:

DECLARE @rowCount INT = 1
DECLARE @databaseName NVARCHAR(MAX)
WHILE @rowCount = 1
BEGIN
SET @databaseName = null
SELECT TOP(1)
@databaseName = name
FROM sys.databases
WHERE database_id >= 5
SET @rowCount = @@ROWCOUNT
IF @rowCount = 1
BEGIN
exec sp_detach_db @databaseName
END
END

就我而言,似乎 database_id 4 以上的所有内容都是 localdb,但这对您来说可能有所不同。

情况似乎更糟。

正在用完的本地数据库实例来自我的 NCrunch 节点。 以系统用户身份运行。

因此,从具有管理员权限的PowerShell提示符中,我运行了

choco install pstools

然后

psexec -i -s CMD

使命令提示符作为系统运行

sqllocaldb运气也不好.exe但粘贴SQL Management Studio的完整路径确实如此:

"C:Program Files (x86)Microsoft SQL Server140ToolsBinnManagementStudioSsms.exe"

连接到服务器(LocalDb)MSSQLLocalDB

然后我遵循安德斯的方法并连接到(LocalDb)MSSQLLocalDB然后我做到了

DECLARE @rowCount INT = 1
DECLARE @databaseName NVARCHAR(MAX)
WHILE @rowCount = 1
BEGIN
SET @databaseName = null
SELECT TOP(1)
@databaseName = name
FROM sys.databases
WHERE database_id >= 7
SET @rowCount = @@ROWCOUNT
IF @rowCount = 1
BEGIN
exec sp_detach_db @databaseName
exec sp_dbremove @databaseName
END
END

sp_dbremove已弃用,但在此处完成工作。 .mdf 和 _log.ldf 文件现在甚至被删除了。

之后,db 的数量从 32765 下降到 6,当计算如下时:

SELECT COUNT(1) FROM sys.databases

最新更新