Puncte:1

Rezolvat: Remediați blocarea WSUS Server Cleanup la ștergerea actualizărilor care nu sunt necesare

drapel jp

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.
Michael Hampton avatar
drapel cz
Este bine să [postați propriile cunoștințe](/help/self-answer), dar ar trebui să fie formatat ca întrebare și răspuns, cu întrebarea de mai sus și răspunsul de mai jos.
BitWrangler avatar
drapel jp
Remarcat. Prima postare.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.