朋友的公司,内网部署了一个Windows Server Update Service(以下简称“WSUS”),用于为网内的Windows客户端提供更新服务。由于WSUS补丁所在的分区空间快不够用了,朋友想执行一下清理,以腾出部分服务器硬盘空间出来,可能是因为太久没有清理一些不再使用的补丁,数据量太多的关系,每次执行服务器清理向导的时候,系统总是出错。
查看事件日志,有如下的警告信息:
WSUS 管理控制台无法连接到 WSUS 服务器数据库。
请确保 SQL Server 正在 WSUS 服务器上运行。如果该问题仍然存在,请尝试重新启动 SQL。
System.Data.SqlClient.SqlException — 执行超时已过期。完成操作之前已超时或服务器未响应。
操作已被用户取消。
语句已终止。
无论重试多少次,都会出现如上的错误提示。朋友找了网上很多的方法,无论是修改WSUS的设置,还是调整IIS的超时设置,都不起作用,然后让我来帮忙。
因为朋友是使用独立的SQL Server数据库作为WSUS的数据库的,因此可以使用Microsoft SQL Server Management Studio工具,连接到WSUS数据库,然后执行一下SQL语句:
USE SUSDB
DECLARE @var1 INT, @curitem INT, @totaltodelete INT
DECLARE @msg nvarchar(200)
CREATE TABLE #results (Col1 INT) INSERT INTO #results(Col1)
EXEC spGetObsoleteUpdatesToCleanup
SET @totaltodelete = (SELECT COUNT(*) FROM #results)
SELECT @curitem=1
DECLARE WC Cursor FOR SELECT Col1 FROM #results
OPEN WC
FETCH NEXT FROM WC INTO @var1 WHILE (@@FETCH_STATUS > -1)
BEGIN SET @msg = cast(@curitem as varchar(5)) + '/' + cast(@totaltodelete as varchar(5)) + ': Deleting ' + CONVERT(varchar(10), @var1) + ' ' + cast(getdate() as varchar(30))
RAISERROR(@msg,0,1) WITH NOWAIT
EXEC spDeleteUpdate @localUpdateID=@var1
SET @curitem = @curitem +1
FETCH NEXT FROM WC INTO @var1
END
CLOSE WC
DEALLOCATE WC
DROP TABLE #results
注:以上代码来源:https://www.cnblogs.com/d9394/p/16669572.html ,经测试可用。
执行完成之后,重新打开“服务器清理向导”执行清理,上述问题解决,不再报错。