WSUSの管理コンソールに接続するとエラーが表示する場合の対処方法

最近Windows Server 2016 or 2019でWSUSを触っているとWSUSの管理コンソールで「WSUSサーバーに接続中にエラーが発生しました。このエラーが発生する原因は多々あります。」と表示され、管理コンソールが使えないことがしばしばあります。

対処方法を調べたの、備忘録がてら本記事にまとめます。

エラー発生時は以下のようにエラー画面となります。

①IISメモリプールのチューニング

1)管理ツールから「インターネット インフォメーション サービス マネージャー 」を選択します。

2)「アプリケーション プール」を展開し、「WsusPool」をクリックします。

3)真ん中のナビゲーションペインから「WsusPool」を選択し、右側のナビゲーションペインから「詳細設定」を選択します。

「詳細設定」にて、 以下の値に変更をしてください。

設定名
キューの長さ 2000 (既定の 1000 から)
アイドル タイムアウト (分) 0 (既定値の 20 から下へ)
Ping が有効 False (既定の True から)
プライベート メモリ制限 (KB) 0 (無制限、既定の 1,843,200 KB から)
通常の時間間隔 (分) 0 (リサイクルを防止するために、既定の 1740 から変更)

4)「OK」を選択して編集を完了してください。

5)IISとWSUSサービスを再起動して設定内容を反映してください。

メモリ不足であればこちらのチューニングで解消します。

そもそものサーバスペックが低い場合は、メモリを12GB〜16GBくらいに上げてください。

https://docs.microsoft.com/ja-JP/troubleshoot/mem/configmgr/windows-server-update-services-best-practices

②WIDの最低メモリ割当設定

Windows Internal Databaseを使っている場合は以下のチューニングも試してみてください。
デフォルト設定でインストールした場合は、Windows Internal Databaseがインストールされています。

1)Microsoft SQL Server 2012 Feature Pack ( https://www.microsoft.com/ja-jp/download/details.aspx?id=29065 )にアクセスします。
2)[+インストール方法] をクリックして、Microsoft SQL Server 2012 Native Client より「sqlncli.msi」 をダウンロードし、対象の WSUS サーバーにインストールします。
3)[+インストール方法] をクリックして、Microsoft SQL Server 2012 コマンド ライン ユーティリティより「SqlCmdLnUtils.msi」をダウンロードし、インストールします。
※ SQL Server コマンド ユーティリティーのインストールの前提条件として、SQL Server Native Client がインストールされている必要があります。WID を利用する WSUS 環境においては、SQL Server Native Client はインストールされませんので、必ず SQL Server Native Clientを対象の WSUS サーバーにインストールしてください。

– 手順
例として最小サーバー メモリを 1024 MB に設定する手順を紹介します。

1. コマンドプロンプト を “管理者として実行” にて起動します。
2. sqlcmd で WID に接続します。

(WSUS 3.0 SP2 の場合)
sqlcmd -E -S \\.\pipe\mssql$microsoft##ssee\sql\query

(Windows Server 2012 / 2012 R2 WSUS の場合)2016以降もこちらで。
sqlcmd -E -S \\.\pipe\MICROSOFT##WID\tsql\query

3. 以下のコマンドを実行します。
※注意※ コマンドをコピー&ペーストした場合、シングルクォーテーション「’」が全角で貼り付け
られてしまう場合があります。その場合は、半角に打ち直したうえでコマンドを実行してください。
EXEC sp_configure ‘show advanced options’,1
GO
Reconfigure
GO
EXEC sp_configure ‘min server memory’,1024
GO
Reconfigure
GO

4. 以下のコマンドを実行し、run_value が設定された値になっていることを確認します

EXEC sp_configure ‘min server memory’
GO

出力例)
name                                minimum     maximum     config_value run_value
———————————– ———– ———– ———— ———–
min server memory (MB)                        0  2147483647         1024        1024

5. exit を入力し、sqlcmd を終了します。

※ 最大サーバー メモリを設定する場合は min server memory を max server memory に置き換えてください。

https://social.msdn.microsoft.com/Forums/ja-JP/0dc69153-1d4e-4e91-bf91-df311424a8be/12300wsus?forum=jpsccmwsus

③WSUSデータベースのインデックス再構築

上記①と②でだめだった場合は、データベースのインデックス再構築を試してみてください。
インストール時は問題なく開けたけど、更新プログラムの同期を行った以降表示がしない場合は、インデックス再構築が有効です。

Windows Internal Databaseを使用している場合のインデックス再構築方法です。
予めQL Server Management Studio Expressをダウンロード、インストールしておいてください。

1)SQL Server Management Studio Express を起動し、下記のパラメータを入力してデータベースへ [接続] を行います。

サーバーの種類 : データベース エンジン
サーバー名 : \\.\pipe\Microsoft##WID\tsql\query
認証 : Windows 認証
※ WSUS 3.0 SP2 の場合、サーバー名は \\.\pipe\mssql$microsoft##ssee\sql\query を指定してください。

2)左ペインのデータベースのツリーから [SUSDB] を右クリックして[新しいクエリ] を選択します。

3)右ペインのクエリ画面内に、以下に記載のWSUS データベース メンテナンス用スクリプトをコピーペーストして、実行します。

スクリプトは以下のサイトで公開されております。

https://docs.microsoft.com/ja-jp/troubleshoot/mem/configmgr/reindex-the-wsus-database

USE SUSDB; 
GO 
SET NOCOUNT ON; 
 
-- Rebuild or reorganize indexes based on their fragmentation levels 
DECLARE @work_to_do TABLE ( 
    objectid int 
    , indexid int 
    , pagedensity float 
    , fragmentation float 
    , numrows int 
) 
 
DECLARE @objectid int; 
DECLARE @indexid int; 
DECLARE @schemaname nvarchar(130);  
DECLARE @objectname 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 
 
-- Select indexes that need to be defragmented based on the following 
-- * Page density is low 
-- * External fragmentation is high in relation to index size 
PRINT 'Estimating fragmentation: Begin. ' + convert(nvarchar, getdate(), 121)  
INSERT @work_to_do 
SELECT 
    f.object_id 
    , index_id 
    , avg_page_space_used_in_percent 
    , avg_fragmentation_in_percent 
    , record_count 
FROM  
    sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'SAMPLED') AS f 
WHERE 
    (f.avg_page_space_used_in_percent < 85.0 and f.avg_page_space_used_in_percent/100.0 * page_count < page_count - 1) 
    or (f.page_count > 50 and f.avg_fragmentation_in_percent > 15.0) 
    or (f.page_count > 10 and f.avg_fragmentation_in_percent > 80.0) 
 
PRINT 'Number of indexes to rebuild: ' + cast(@@ROWCOUNT as nvarchar(20)) 
 
PRINT 'Estimating fragmentation: End. ' + convert(nvarchar, getdate(), 121) 
 
SELECT @numpages = sum(ps.used_page_count) 
FROM 
    @work_to_do AS fi 
    INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id and fi.indexid = i.index_id 
    INNER JOIN sys.dm_db_partition_stats AS ps on i.object_id = ps.object_id and i.index_id = ps.index_id 
 
-- Declare the cursor for the list of indexes to be processed. 
DECLARE curIndexes CURSOR FOR SELECT * FROM @work_to_do 
 
-- Open the cursor. 
OPEN curIndexes 
 
-- Loop through the indexes 
WHILE (1=1) 
BEGIN 
    FETCH NEXT FROM curIndexes 
    INTO @objectid, @indexid, @density, @fragmentation, @numrows; 
    IF @@FETCH_STATUS < 0 BREAK; 
 
    SELECT  
        @objectname = QUOTENAME(o.name) 
        , @schemaname = QUOTENAME(s.name) 
    FROM  
        sys.objects AS o 
        INNER JOIN sys.schemas as s ON s.schema_id = o.schema_id 
    WHERE  
        o.object_id = @objectid; 
 
    SELECT  
        @indexname = QUOTENAME(name) 
        , @fillfactorset = CASE fill_factor WHEN 0 THEN 0 ELSE 1 END 
    FROM  
        sys.indexes 
    WHERE 
        object_id = @objectid AND index_id = @indexid; 
 
    IF ((@density BETWEEN 75.0 AND 85.0) AND @fillfactorset = 1) OR (@fragmentation < 30.0) 
        SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE'; 
    ELSE IF @numrows >= 5000 AND @fillfactorset = 0 
        SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD WITH (FILLFACTOR = 90)'; 
    ELSE 
        SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD'; 
    PRINT convert(nvarchar, getdate(), 121) + N' Executing: ' + @command; 
    EXEC (@command); 
    PRINT convert(nvarchar, getdate(), 121) + N' Done.'; 
END 
 
-- Close and deallocate the cursor. 
CLOSE curIndexes; 
DEALLOCATE curIndexes; 
 
 
IF EXISTS (SELECT * FROM @work_to_do) 
BEGIN 
    PRINT 'Estimated number of pages in fragmented indexes: ' + cast(@numpages as nvarchar(20)) 
    SELECT @numpages = @numpages - sum(ps.used_page_count) 
    FROM 
        @work_to_do AS fi 
        INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id and fi.indexid = i.index_id 
        INNER JOIN sys.dm_db_partition_stats AS ps on i.object_id = ps.object_id and i.index_id = ps.index_id 
 
    PRINT 'Estimated number of pages freed: ' + cast(@numpages as nvarchar(20)) 
END 
GO 
 
 
--Update all statistics 
PRINT 'Updating all statistics.' + convert(nvarchar, getdate(), 121)  
EXEC sp_updatestats 
PRINT 'Done updating statistics.' + convert(nvarchar, getdate(), 121)  
GO

 

4)データベースの最適化が終了すると、 “Statistics for all tables have been updated”  または “全テーブルの統計が更新されました” というメッセージが表示されます。

以上でインデックス再構築の完了です。

インデックス再構築後にWSUSの管理コンソールを開くと、問題なく表示されると思います。

1ヶ月に1回はインデックス再構築を実行することをMSが推奨しておりますので、定期的に実行してください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です