WSUS a fost întotdeauna stricăciunea oricărui administrator IT. Câte fire găsiți toate cu aceeași problemă - expertul de curățare a serverului eșuând. Textul de mai jos a funcționat pentru mine.
Am încercat o mulțime de scripturi SQL atât de la Microsoft, cât și din domeniul public, toate cu rezultate mixte. Săptămâna trecută, serverul nostru WSUS a început din nou să tușească mingi, așa că am plătit banii și am deschis un bilet de asistență. Textul de mai jos este exact așa cum a fost primit de la suportul MS. Pasul 8, în cazul meu, a durat peste o zi și jumătate - și chiar și așa cu unele erori. Am ignorat acele erori. Pasul 9 a fost rapid, dar și câteva erori. Am ignorat și acele erori (erori de blocaj). Odată finalizat, am rulat din nou vrăjitorul de curățare a serverului și a funcționat perfect. Toate au fost rulate în SQL Server Management Studio și folosind WID.
Aceasta nu este o întrebare, dar scopul meu de a încerca și de a ajuta alți administratori să rezolve aceste probleme cronice WSUS. Ați kilometraj foarte - sper că acest lucru vă ajută pe unii dintre voi.
Vă rugăm să urmați pașii menționați mai jos:
--------------------------------------------- --------------------------------------------- ----------------------------------------
1) Reindexare:
UTILIZAȚI SUSDB;
MERGE
SETARE NOCOUNT ON;
-- Reconstruiți sau reorganizați indecșii pe baza nivelurilor de fragmentare ale acestora
DECLARE @work_to_do TABLE (
obiectid int
, indexid int
, pagedensity float
, plutire de fragmentare
, numrows int
)
DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @schemanname nvarchar(130);
DECLARE @nume obiect nvarchar(130);
DECLARE @indexname nvarchar(130);
DECLARE @numrows int
DECLARE @density float;
DECLARE @fragmentation float;
DECLARE @command nvarchar(4000);
DECLARE @fillfactorset bit
DECLARE @numpages int
-- Selectați indecșii care trebuie defragmentați pe baza următoarelor
-- * Densitatea paginii este scăzută
-- * Fragmentarea externă este mare în raport cu dimensiunea indexului
PRINT 'Estimarea fragmentării: Începe. ' + convert(nvarchar, getdate(), 121)
INSERT @work_to_do
SELECTAȚI
f.object_id
, index_id
, avg_page_space_used_in_percent
, medie_fragmentare_în_procent
, record_count
DIN
sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'SAMPLED') AS f
UNDE
(f.avg_page_space_used_in_percent < 85,0 și f.avg_page_space_used_in_percent/100,0 * page_count < page_count - 1)
sau (f.page_count > 50 și f.avg_fragmentation_in_percent > 15,0)
sau (f.page_count > 10 și f.avg_fragmentation_in_percent > 80,0)
PRINT „Numărul de indici de reconstruit: „ + cast(@@ROWCOUNT ca nvarchar(20))
PRINT 'Estimarea fragmentării: sfârșit. ' + convert(nvarchar, getdate(), 121)
SELECT @numpages = sum(ps.used_page_count)
DIN
@work_to_do AS fi
INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id și fi.indexid = i.index_id
INNER JOIN sys.dm_db_partition_stats AS ps pe i.object_id = ps.object_id și i.index_id = ps.index_id
-- Declarați cursorul pentru lista de indici de procesat.
DECLARE curIndexes CURSOR PENTRU SELECT * FROM @work_to_do
-- Deschide cursorul.
OPEN curIndexes
-- Buclă prin indecși
ÎN CÂT timp (1=1)
ÎNCEPE
FETCH NEXT FROM curIndexes
INTO @objectid, @indexid, @density, @fragmentation, @numrows;
DACĂ @@FETCH_STATUS < 0 BREAK;
SELECTAȚI
@objectname = QUOTENAME(o.name)
, @schemanname = QUOTENAME(s.name)
DIN
sys.obiecte AS o
INNER JOIN sys.schemas ca s ON s.schema_id = o.schema_id
UNDE
o.object_id = @objectid;
SELECTAȚI
@indexname = QUOTENAME(nume)
, @fillfactorset = CASE fill_factor WHEN 0 THEN 0 ELSE 1 END
DIN
sys.indexuri
UNDE
object_id = @objectid ȘI index_id = @indexid;
DACĂ ((@densitate ÎNTRE 75,0 ȘI 85,0) ȘI @fillfactorset = 1) SAU (@fragmentare < 30,0)
SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemanname + N'.' + @objectname + N' REORGANIZE';
ELSE IF @numrows >= 5000 ȘI @fillfactorset = 0
SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemanname + N'.' + @objectname + N' RECONSTRUIRE CU (FILLFACTOR = 90)';
ALTE
SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemanname + N'.' + @objectname + N' RECONSTRUIRE';
PRINT convert(nvarchar, getdate(), 121) + N' Se execută: ' + @command;
EXEC (@comandă);
PRINT convert(nvarchar, getdate(), 121) + N' Done.';
Sfârşit
-- Închideți și dezalocați cursorul.
CLOSE curIndexes;
DEALLOCATE curIndexes;
DACA EXISTA (SELECT * FROM @work_to_do)
ÎNCEPE
PRINT 'Numărul estimat de pagini în indecși fragmentați: ' + cast(@numpages as nvarchar(20))
SELECTAȚI @numpages = @numpages - sum(ps.used_page_count)
DIN
@work_to_do AS fi
INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id și fi.indexid = i.index_id
INNER JOIN sys.dm_db_partition_stats AS ps pe i.object_id = ps.object_id și i.index_id = ps.index_id
PRINT „Numărul estimat de pagini eliberate: „ + cast(@numpages as nvarchar(20))
Sfârşit
MERGE
--Actualizați toate statisticile
PRINT „Se actualizează toate statisticile”. + convert(nvarchar, getdate(), 121)
EXEC sp_updateestats
PRINT „Actualizarea statisticilor este finalizată”. + convert(nvarchar, getdate(), 121)
MERGE
--------------------------------------------- ------------------------------------
2) Rulați interogarea de mai jos pentru a obține numărul de actualizări înlocuite.
SELECTARE UpdateID FROM vwMinimalUpdate WHERE IsSuperseded = 1 AND Declined = 0
--------------------------------------------- -------------------------------------
3) Rulați interogarea de mai jos pentru a șterge toate actualizările înlocuite și rulați vrăjitorul de curățare a serverului.
DECLARE @var1 identificator unic
DECLARE @msg nvarchar(100)
DECLARE DU Cursor
PENTRU
SELECTARE UpdateID FROM vwMinimalUpdate WHERE IsSuperseded = 1 AND Declined = 0
Deschide DU
FETCH NEXT FROM DU IN @var1
WHILE (@@FETCH_STATUS > -1)
ÎNCEPE
RAISERROR(@msg,0,1) WITH NOWAIT exec spDeclineUpdate @updateID=@var1,@adminName=N'domain\user',@failIfReplica=1
FETCH NEXT FROM DU IN @var1
Sfârşit
ÎNCHIS DU
DEALLOCATE DU
--------------------------------------------- -------------------------------------
4) Rulați următoarea interogare SQL pe SQL pe baza de date SUSDB pentru a obține numărul de actualizări de curățat:
exec spGetObsoleteUpdatesToCleanup
--------------------------------------------- --------------------------------------
5) Rulați interogarea de mai jos pe SQL DB pentru a șterge actualizările și apoi rulați vrăjitorul de curățare a serverului:
DECLARE @var1 INT
DECLARE @msg nvarchar(100)
CREATE TABLE #results (Col1 INT)
INSERT INTO #results(Col1) EXEC spGetObsoleteUpdatesToCleanup
DECLARE WC Cursor
PENTRU
SELECTAȚI Col1 din #rezultate
WC DESCHIS
PRELUAȚI LÂNGĂ DE LA WC
ÎN @var1
WHILE (@@FETCH_STATUS > -1)
BEGIN SET @msg = 'Ștergerea' + CONVERT(varchar(10), @var1)
RAISERROR(@msg,0,1) CU NOWAIT EXEC spDeleteUpdate @localUpdateID=@var1
FETCH NEXT DE LA WC ÎN @var1 END
WC ÎNCHIS
DEALOCATE WC
DROP TABLE #rezultate
--------------------------------------------- ----------------------------------------
6) Rulați interogarea de mai jos, A ști nu. de actualizări pentru lungimea XML de 5000 sau mai mult:
Selectați
u.UpdateID,
r.RevisionNumber,
r.RevisionID,
lp.Titlu,
pr.ExplicitlyDeployable ca ED,
pr.UpdateType,
pr.CreationDate
din
tbUpdate u
unire internă tbRevision r pe u.LocalUpdateID = r.LocalUpdateID
inner join tbProperty pr pe pr.RevisionID = r.RevisionID
îmbinare internă tbLocalizedPropertyForRevision lpr pe r.RevisionID = lpr.RevisionID
îmbinare internă tbLocalizedProperty lp pe lpr.LocalizedPropertyID = lp.LocalizedPropertyID
Unde
lpr.LanguageID = 1033
și r.RevisionID în (
Selectați
t1.RevisionID
din
tbBundleAll t1
unire interioară tbBundleAtLeastOne t2 pe t1.BundledID=t2.BundledID
Unde
t2.RevisionID în(SELECTARE dbo.tbXml.RevisionID FROM dbo.tbXml
INNER JOIN dbo.tbProperty ON dbo.tbXml.RevisionID = dbo.tbProperty.RevisionID
unde ISNULL(datalength(dbo.tbXml.RootElementXmlCompressed), 0) > 50000) și ishidden=0 și pr.ExplicitlyDeployable=1)
--------------------------------------------- ---------------------------------------------
7) Dacă există actualizări prezente, le refuzăm cu următorul cursor:
DECLARE @UpdateID nvarchar(100)
DECLARE @msg nvarchar(100)
CREATE TABLE #Updates (UpdateID nvarchar(100))
INSERT INTO #Updates(UpdateID)
Selectați
u.UpdateID
din
tbUpdate u
unire internă tbRevision r pe u.LocalUpdateID = r.LocalUpdateID
inner join tbProperty pr pe pr.RevisionID = r.RevisionID
îmbinare internă tbLocalizedPropertyForRevision lpr pe r.RevisionID = lpr.RevisionID
îmbinare internă tbLocalizedProperty lp pe lpr.LocalizedPropertyID = lp.LocalizedPropertyID
Unde
lpr.LanguageID = 1033
și r.RevisionID în (
Selectați
t1.RevisionID
din
tbBundleAll t1
unire interioară tbBundleAtLeastOne t2 pe t1.BundledID=t2.BundledID
Unde
t2.RevisionID în(SELECTARE dbo.tbXml.RevisionID FROM dbo.tbXml
INNER JOIN dbo.tbProperty ON dbo.tbXml.RevisionID = dbo.tbProperty.RevisionID
unde ISNULL(datalength(dbo.tbXml.RootElementXmlCompressed), 0) > 50000) și ishidden=0 și pr.ExplicitlyDeployable=1)
DECLARE UC Cursor
PENTRU
SELECTAȚI UpdateID DIN #Actualizări
DESCHIS UC
FETCH NEXT DE LA UC
ÎN @UpdateID
WHILE(@@FETCH_STATUS > -1)
BEGIN SET @msg = „În declin” + @UpdateID
RAISERROR(@msg,0,1) CU NOWAIT EXEC spDeclineUpdate @updateID=@UpdateID,@adminName=N'mach14\administrator',@failIfReplica=1
FETCH NEXT DE LA UC ÎN @UpdateID END
ÎNCHIS UC
DEALOCATE UC
DROP TABLE #Actualizări
--------------------------------------------- --------------------------------------------
8) Declinul actualizărilor de driver:-
UTILIZAȚI SUSDB
MERGE
SELECTAȚI UpdateTypeID FROM tbUpdateType WHERE Nume = „Driver”
MERGE
ștergeți din tbrevisionlanguage unde revisionid este (selectați revisionid din tbRevision unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde UpdateTypeID = 'D2CB599A-FA9F-4AE9-B346-94AD54EE0629'))
ștergeți din tbProperty unde revisionid este (selectați revisionid din tbRevision unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde UpdateTypeID = 'D2CB599A-FA9F-4AE9-B346-94AD54EE0629'))
ștergeți din tbLocalizedPropertyForRevision unde revisionid este (selectați revisionid din tbRevision unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde UpdateTypeID = 'D2CB599A-FA9F-4AE9-B346-94AD54EE0629'))
ștergeți din tbFileForRevision unde revisionid este (selectați revisionid din tbRevision unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde UpdateTypeID = 'D2CB599A-FA9F-4AE9-B346-94AD54EE0629'))
ștergeți din tbInstalledUpdateSufficienteForPrerequisite unde prerequisiteid în (selectați Prerequisiteid din tbPreRequisite unde revisionid în (selectați revisionid de la tbRevision unde LocalUpdateId în (selectați LocalUpdateId din tbUpdate unde UpdateTypeID = 'D2CB599A-94B594A-94B34))
ștergeți din tbPreRequisite unde revisionid este (selectați revisionid din tbRevision unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde UpdateTypeID = 'D2CB599A-FA9F-4AE9-B346-94AD54EE0629'))
ștergeți din tbDeployment unde revisionid este (selectați revisionid din tbRevision unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde UpdateTypeID = 'D2CB599A-FA9F-4AE9-B346-94AD54EE0629'))
ștergeți din tbXml unde se află revisionid (selectați revisionid din tbRevision unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde UpdateTypeID = 'D2CB599A-FA9F-4AE9-B346-94AD54EE0629'))
ștergeți din tbPreComputedLocalizedProperty unde revisionid este (selectați revisionid din tbRevision unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde UpdateTypeID = 'D2CB599A-FA9F-4AE9-B346-94AD54EE0629')
ștergeți din tbDriver unde revisionid este (selectați revisionid din tbRevision unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde UpdateTypeID = 'D2CB599A-FA9F-4AE9-B346-94AD54EE0629'))
ștergeți din tbFlattenedRevisionInCategory unde revisionid este (selectați revisionid din tbRevision unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde UpdateTypeID = 'D2CB599A-FA9F-4AE9-B346-94AD54EE0629')
ștergeți din tbRevisionInCategory unde revisionid este (selectați revisionid din tbRevision unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde UpdateTypeID = 'D2CB599A-FA9F-4AE9-B346-94AD54EE0629')
ștergeți din tbMoreInfoURLForRevision unde revisionid este (selectați revisionid din tbRevision unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde UpdateTypeID = 'D2CB599A-FA9F-4AE9-B346-94AD54EE0629'))
ștergeți din tbRevision unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde UpdateTypeID = 'D2CB599A-FA9F-4AE9-B346-94AD54EE0629')
ștergeți din tbUpdateSummaryForAllComputers unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde UpdateTypeID = 'D2CB599A-FA9F-4AE9-B346-94AD54EE0629')
ștergeți din tbUpdate unde UpdateTypeID = 'D2CB599A-FA9F-4AE9-B346-94AD54EE0629'
9) Ștergeți actualizările ascunse:
SELECTAȚI * FROM tbActualizați WHERE isHidden = 1
A
ștergeți din tbrevisionlanguage unde revisionid în (selectați revisionid din tbRevision unde LocalUpdateId în (selectați LocalUpdateId din tbUpdate unde ishidden=1))
ștergeți din tbProperty unde revisionid este (selectați revisionid din tbRevision unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde ishidden=1))
ștergeți din tbLocalizedPropertyForRevision unde revisionid în (selectați revisionid din tbRevision unde LocalUpdateId în (selectați LocalUpdateId din tbUpdate unde ishidden=1 ))
ștergeți din tbFileForRevision unde revisionid în (selectați revisionid din tbRevision unde LocalUpdateId în (selectați LocalUpdateId din tbUpdate unde ishidden=1 ))
ștergeți din tbInstalledUpdateSufficienteForPrerequisite unde prerequisiteid în (selectați Prerequisiteid din tbPreRequisite unde revisionid în (selectați revisionid din tbRevision unde LocalUpdateId în (selectați LocalUpdateId din tbUpdate unde ishidden=1 )))
ștergeți din tbPreRequisite unde revisionid în (selectați revisionid din tbRevision unde LocalUpdateId în (selectați LocalUpdateId din tbUpdate unde ishidden=1 ))
ștergeți din tbDeployment unde revisionid este (selectați revisionid din tbRevision unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde ishidden=1 ))
ștergeți din tbXml unde revisionid în (selectați revisionid din tbRevision unde LocalUpdateId în (selectați LocalUpdateId din tbUpdate unde ishidden=1 ))
ștergeți din tbPreComputedLocalizedProperty unde revisionid în (selectați revisionid din tbRevision unde LocalUpdateId în (selectați LocalUpdateId din tbUpdate unde ishidden=1 ))
ștergeți din tbDriver unde se află revisionid (selectați revisionid din tbRevision unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde este ascuns=1))
ștergeți din tbFlattenedRevisionInCategory unde revisionid în (selectați revisionid din tbRevision unde LocalUpdateId în (selectați LocalUpdateId din tbUpdate unde ishidden=1))
ștergeți din tbRevisionInCategory unde revisionid în (selectați revisionid din tbRevision unde LocalUpdateId în (selectați LocalUpdateId din tbUpdate unde ishidden=1))
ștergeți din tbMoreInfoURLForRevision unde revisionid în (selectați revisionid din tbRevision unde LocalUpdateId în (selectați LocalUpdateId din tbUpdate unde ishidden=1))
ștergeți din tbBundleAtLeastOne unde bundledid în (selectați bundledid din tbBundleAll unde revisionid în (selectați revisionid din tbRevision unde LocalUpdateId în (selectați LocalUpdateId din tbUpdate unde ishidden=1)))
ștergeți din tbBundleAll unde revisionid în (selectați revisionid din tbRevision unde LocalUpdateId în (selectați LocalUpdateId din tbUpdate unde ishidden=1))
ștergeți din tbSecurityBulletinForRevision unde revisionid în (selectați revisionid din tbRevision unde LocalUpdateId în (selectați LocalUpdateId din tbUpdate unde este ascuns=1))
ștergeți din tbKBArticleForRevision unde revisionid în (selectați revisionid din tbRevision unde LocalUpdateId în (selectați LocalUpdateId din tbUpdate unde ishidden=1))
ștergeți din tbRevisionSupersedesUpdate unde revisionid este (selectați revisionid din tbRevision unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde este ascuns=1))
ștergeți din tbBundleAtLeastOne unde revisionid în (selectați revisionid din tbRevision unde LocalUpdateId în (selectați LocalUpdateId din tbUpdate unde ishidden=1))
ștergeți din tbEulaProperty unde revisionid în (selectați revisionid din tbRevision unde LocalUpdateId în (selectați LocalUpdateId din tbUpdate unde ishidden=1))
ștergeți din tbRevision unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde ishidden=1)
ștergeți din tbUpdateSummaryForAllComputers unde LocalUpdateId este introdus (selectați LocalUpdateId din tbUpdate unde ishidden=1)
ștergeți din tbInstalledUpdateSufficienteForPrerequisite unde LocalUpdateId este (selectați LocalUpdateId din tbUpdate unde ishidden=1)
ștergeți din tbUpdate unde ishidden = 1
--------------------------------------------- --------------------------------------------- --------------------------
Apoi deschideți consola WSUS și navigați la Options\Server Cleanup Wizard.
Și rulați vrăjitorul unul câte unul.