如何分离 NCrunch 节点服务使用的所有 LocalDb 数据库
How to detach all LocalDb databases used by NCrunch Node service
偶尔,使用 LocalDB 的测试的清理代码不是 运行(可能是在取消测试时)。结果是很多垃圾本地数据库。
当 运行ning 测试试图创建另一个 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)
每次测试中的测试清理都是这样的class(使用 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 服务器管理工作室连接到以下服务器 (LocalDb)\MSSQLLocalDB
然后使用以下语句确定哪些数据库是localDb:
SELECT * FROM sys.databases
在此之后更正以下 detach localdb 语句以仅分离 localdbs:
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 节点。以 SYSTEM 用户身份运行。
因此,在具有管理员权限的 PowerShell 提示符下,我 运行
choco install pstools
然后是
psexec -i -s CMD
获取命令提示符 运行 作为 SYSTEM
sqllocaldb.exe 也不太幸运,但粘贴 SQL Management Studio 的完整路径确实如此:
"C:\Program Files (x86)\Microsoft SQL Server0\Tools\Binn\ManagementStudio\Ssms.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 文件。
之后dbs的数量从32765降到6,这样算的时候:
SELECT COUNT(1) FROM sys.databases
偶尔,使用 LocalDB 的测试的清理代码不是 运行(可能是在取消测试时)。结果是很多垃圾本地数据库。
当 运行ning 测试试图创建另一个 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)
每次测试中的测试清理都是这样的class(使用 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 服务器管理工作室连接到以下服务器 (LocalDb)\MSSQLLocalDB
然后使用以下语句确定哪些数据库是localDb:
SELECT * FROM sys.databases
在此之后更正以下 detach localdb 语句以仅分离 localdbs:
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 节点。以 SYSTEM 用户身份运行。
因此,在具有管理员权限的 PowerShell 提示符下,我 运行
choco install pstools
然后是
psexec -i -s CMD
获取命令提示符 运行 作为 SYSTEM
sqllocaldb.exe 也不太幸运,但粘贴 SQL Management Studio 的完整路径确实如此:
"C:\Program Files (x86)\Microsoft SQL Server0\Tools\Binn\ManagementStudio\Ssms.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 文件。
之后dbs的数量从32765降到6,这样算的时候:
SELECT COUNT(1) FROM sys.databases