Место на нашем WSUS сервере ежедневно таяло на глазах. Решили зачистить старые обновления для Windows 7, 2008 и прочих уже почти отсутствующих у нас операционок.
Для начала стоит попробовать традиционный метод: «Чистка базы WSUS через Server Cleanup Wizard».
Нашли интересный баг, когда проставляем все галки, то сервер наглухо зависает (у нас «провисел» почти сутки) но так ничего не очистилось. А самое интересное, свободные 20 гиг, которые ранее были свободны на диске, тоже куда-то делись 😦
Если галки выставлять поочередно, то что-то очищается.
Но когда ставим галку «Неиспользуемые обновления и редакции обновлений», вылетает: «Ошибка базы данных».
Попробовали сделать PowerShell скриптом (можно поочередно вбивать команды, можно вставить в cmd файл и запустить его):
PS1:
[reflection.assembly]::LoadWithPartialName(«Microsoft.UpdateServices.Administration») | out-null
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
$cleanupScope = new-object Microsoft.UpdateServices.Administration.CleanupScope;
$cleanupScope.DeclineSupersededUpdates = $true
$cleanupScope.DeclineExpiredUpdates = $true
$cleanupScope.CleanupObsoleteUpdates = $true
$cleanupScope.CompressUpdates = $true
$cleanupScope.CleanupObsoleteComputers = $true
$cleanupScope.CleanupUnneededContentFiles = $true
$cleanupManager = $wsus.GetCleanupManager();
$cleanupManager.PerformCleanup($cleanupScope);
Опции:
DeclineSupersededUpdates — Отклонить замененные обновления.
DeclineExpiredUpdates — Отклонить просроченные обновления.
CleanupObsoleteUpdates — Удалить из базы неиспользуемые обновления.
CompressUpdates — Удалить из базы устаревшие ревизии обновлений.
CleanupObsoleteComputers — удалить компьютеры которые не соединялись за последние 30 дней.
CleanupUnneededContentFiles — Удаляет файлы отклоненных обновлений из папки WSUS.
или CMD:
@echo off
@echo Starting cleanup: %date% %time% >> d:scriptsWSUS_Cleanup.log
powershell.exe d:scriptsWSUS_Cleanup.ps1 >> d:scriptsWSUS_Cleanup.log
@echo Finished cleanup: %date% %time% >> d:scriptsWSUS_Cleanup.log
Но в итоге после некоторых раздумий сервер выдал:
Печаль…
Как поправить ошибку пока не понятно…
Вот здесь как раз человек объясняет ситуацию:
http://zetslash.blogspot.com/2017/06/wsus.html
Процедура запуска сценария будет разной для разных вариантов установки SUSDB (Windows Internal Database или SQL Server). Для того, чтобы определить, где развёрнута база данных WSUS необходимо на сервере WSUS проверить значение реестра SQLServerName в разделе HKLMSoftwareMicrosoftUpdate ServicesServerSetup. Если в значении присутствуют ##SSEE или ##WID, то база данных развёрнута на WID, а если вы видите в этом значении имя хоста или имя_сервераэкземпляр, то база данных развёрнута на SQL Server:
В нашем случае видим, что база WID:
Далее, в случае, если база данных развёрнута на WID нам необходимо использовать утилиту sqlcmd и планировщик задач Windows. Если SQL Server — можно запланировать выполнение сценария с помощью планов обслуживания (Maintenance Plans).
Windows Internal Database
Чтобы установить sqlcmd можно скачать и установить SQL Server Management Studio (SSMS) для версии вашей WID. Версию можно определить в лог-файле:
- В Windows Server 2012 — C:WindowsWIDLog — открываем error.log, где в самом начале файла указана используемая версия SQL, для которой нам нужно скачать SSMS Express.
- В Windows Server 2008 R2 и ниже — C:WindowsSYSMSISSEEMSSQL.2005MSSQLLOG — также открываем error.log и в самом начале файла смотрим версию.
Пытаюсь понять какая версия SQL у меня установлена:
Но ничего не понятно, и в файле ничего нет, хотя вроде должно быть.
В итоге устанавливаю консоль SQL Server Management Studio Express 2016 (она благополучно установилась):
Запускаем консоль Management Studio с правами администратора.
Подключаемся к базе, указав следующее имя сервера:
- в Windows Server 2008 / R2 — .pipemssql$microsoft##sseesqlquery
- в Windows Server 2012 / R2 — .pipeMICROSOFT##WIDtsqlquery
Запустил пару скриптов из этого поста, но мне это никак не помогло:
http://zetslash.blogspot.com/2017/06/wsus.html
https://itblog.ru.net/ws/wsus/wsus-cleanup-powershell/
Еще раз запустил мастер очистки, оставил его на ночь и тут случилось чудо:
Самое печальное, что очистка прошла, а места больше на диске так и не стало.
Попробовал сделать через PowerShell:
[reflection.assembly]::LoadWithPartialName(«Microsoft.UpdateServices.Administration»)` | out-null
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
$cleanupScope = new-object Microsoft.UpdateServices.Administration.CleanupScope;
$cleanupScope.DeclineSupersededUpdates = $true
$cleanupScope.DeclineExpiredUpdates = $true
$cleanupScope.CleanupObsoleteUpdates = $true
$cleanupScope.CompressUpdates = $true
$cleanupScope.CleanupObsoleteComputers = $true
$cleanupScope.CleanupUnneededContentFiles = $true
$cleanupManager = $wsus.GetCleanupManager();
$cleanupManager.PerformCleanup($cleanupScope);
Вероятно необходима реиндексация базы.
Попробовал реиндексировать вот таким скриптом:
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
Но снова место на диске так и не появилось.
Попробовал еще один скрипт:
DECLARE IndexCursor CURSOR FOR
SELECT sys.indexes.name AS IndexName
,sys.objects.name AS TableName
FROM sys.indexes
INNER JOIN sys.objects
ON sys.indexes.object_id = sys.objects.object_id
WHERE sys.objects.type = ‘U’
AND sys.indexes.is_disabled = 0
AND NOT sys.indexes.name IS NULL
ORDER BY TableName ASC
,IndexName ASC;
DECLARE @IndexName nvarchar(max), @TableName nvarchar(max);
DECLARE @ExecSql nvarchar(max);
OPEN IndexCursor;
FETCH NEXT FROM IndexCursor INTO @IndexName, @TableName;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @TableName + ‘.’ + @IndexName;
SET @ExecSql = ‘ALTER INDEX [‘ + @IndexName + ‘] ON [‘ + @TableName + ‘] REBUILD;’;
EXEC (@ExecSql);
FETCH NEXT FROM IndexCursor INTO @IndexName, @TableName;
END
CLOSE IndexCursor;
DEALLOCATE IndexCursor;
Но все это добавило лишь несколько мегабайт свободного места.
Скорее всего больше нечего реиндексировать.
ЭТО ВСЕ, ЧТО УДАЛОСЬ ПОЧЕРПНУТЬ ПО ДАННОМУ ВОПРОСУ.
P.S.
Если правил на WSUS не много и можно их потом быстро настроить, то можно переставить WSUS с нуля или резать по живому, это уже кому как виднее и удобнее…
Попробуем резать по живому.
Как корректно и правильно «зачистить» папку WSUSContent я так не нашел, а именно она сейчас занимает все место на диске.
Останавливаем службу в IIS.
Удаляем все, что есть в папке WSUSContent, сразу видим, что диск опустел:
Запускаем службу
Нажимаем Синхронизировать сейчас, но ничего не происходит, так как в базе осталась информация что все обновления на месте, хотя по факту их уже нет.
Чтобы повторно установить WSUS с чистой базой данных, то есть предыдущей конфигурации:
Запустите Windows Powershell в качестве администратора и используйте следующие команды:
- Uninstall-WindowsFeature -Name UpdateServices,Windows-Internal-Database -Restart
- Повторите перезагрузку, удалите ВСЕ в C:WindowsWID(для Win 2012 r2).
- Затем запустите следующую команду для повторной установки WSUS:
Install-WindowsFeature UpdateServices -Restart
Кажется, что удаление WSUS а также WID Database опция фактически не удаляет базу данных WID.
- База данных WID можно удалить, удалив Windows Internal Database особенность.
- Вам также потребуется вручную удалить файл C:windowsWIDDatasusdb.mdf перед повторной установкой все снова.
Надеемся WSUS 4.0 не за горами и версия без подобных «багов» все же появится в продакшине, хотя, как мне показалось, Microsoft почему-то уже давно «забил» на WSUS.
Всем хорошей работы!!!
13.02.2019 —
Posted by |
ms windows server 2016
Sorry, the comment form is closed at this time.
- Remove From My Forums
Ошибка при очистке из базы компьютеров, не отправляющих данные на сервер
-
Вопрос
-
Добрый день!
На сервере WSUS запускается мастер очистки сервера, для удаления компьютеров, которые не отправляют данные на сервер. Мастер заверщается с ошибкой.
Консоли администрирования WSUS не удается подключиться к базе данных сервера WSUS.
Убедитесь в том, что на сервере WSUS запущен сервер SQL. Если проблему не удается устранить, попробуйте перезапустить SQL.System.Data.SqlClient.SqlException — Конфликт инструкции DELETE с ограничением REFERENCE «FK__tbExpande__Targe__23BE4960». Конфликт произошел в базе данных «SUSDB», таблица «dbo.tbExpandedTargetInTargetGroup», column ‘TargetID’.
Выполнение данной инструкции было прервано.Source
.Net SqlClient Data ProviderStack Trace:
в System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
в System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
в Microsoft.UpdateServices.UI.SnapIn.Wizards.ServerCleanup.ServerCleanupWizard.OnCleanupComplete(Object sender, PerformCleanupCompletedEventArgs e)Какие варианты решения указанной проблемы?
Ответы
-
А можно поподробнее рассказать, про удаление FK__tbExpande__Targe__23BE4960. Удалить FK и создать его заново?
Во первых
это не самое лучшее решение, которое ни в коем случае не стоит делать в рабочей структуре, но если надумаете удалять, то можете его поробывать.
и может привести к неработоспособности БД — это как бы дискляймер) В некоторых случаях помогало.
Во вторых, не силен в SQL, но судя по ошибке
System.Data.SqlClient.SqlException — Конфликт инструкции DELETE с ограничением REFERENCE «FK__tbExpande__Targe__23BE4960». Конфликт произошел в базе данных «SUSDB», таблица «dbo.tbExpandedTargetInTargetGroup»,
column ‘TargetID’.
Выполнение данной инструкции было прервано.Существуют некие ограничения внешнего ключа (Foreign Key) FK__tbExpande__Targe__23BE4960 таблицы
dbo.tbExpandedTargetInTargetGroup, которые и приводят к ошибке при удалении, что и отражено в логе.Подключитесь к вашей БД и посмотрите таблицу.
Далее попробуйте удалить ограничитель FK, команды если не ошибаюсь:
ALTER TABLE tbExpandedTargetInTargetGroup
DROP CONSTRAINT FK__tbExpande__Targe__23BE4960но тут лучше проконсультируйтесь с SQL — специалистом
По поводу создать заново не знаю получится ли, это надо пробывать, для начала удалите FK, далее проверьте работоспособность, и запустите заново cleanup wizard
-
Изменено
23 января 2012 г. 13:11
-
Помечено в качестве ответа
Kily83
24 января 2012 г. 5:54
-
Изменено
I’m getting Database errors when using the Update Services console on Windows Server 2008 R2. Synchronizations fails and I get the same
Database error if I try to do the Clean Up Wizard.
In Event Viewer I’m seeing:
The description for Event ID 824 from source MSSQL$MICROSOFT##SSEE cannot be found. Either the component that raises this event is not installed on your local computer or the installation is corrupted. You can install or repair the component on the local computer.
If the event originated on another computer, the display information had to be saved with the event.
The following information was included with the event:
incorrect pageid (expected 1:259197; actual 0:0)
read
(1:259197)
5
0x0000007e8fa000
e:WSUS\UpdateServicesDbFilesSUSDB.mdf
The specified resource type cannot be found in the image file
Anybody have any suggestions or is it looking like I’m going to have to uninstall and reinstall the WSUS role/DB?
check
Best Answer
OverDrive
This person is a verified professional.
Verify your account
to enable IT peers to see that you are a professional.
mace
WSUS Expert
-
check
397
Best Answers -
thumb_up
579
Helpful Votes
Your DB id pooched. It’s corrupted. To run the fixes would result in data loss. As it’s only WSUS…
You’re best off removing WSUS/WID and re-installing it and starting fresh.
Remove the roles, reboot, Delete the databases in C:WindowsWIDData (beyond master, model, tempdb, and msdb — you should see only SUSDB if WSUS is the only database within the WID. If it is, remove all the databases)
Install WSUS again, and setup from scratch. Then use my script to keep it clean.
1 found this helpful
thumb_up
thumb_down
View Best Answer in replies below
Read these next…
Windows 10 Enterprise not allowing downloads or search
Windows
Hello All,We just got a new machine that came with its own computer. The computer has Windows 10 Enterprise on it. All of our PCs are running Windows 10 Pro. I joined the new PC to the domain and logged in as the domain admin. Everything worked great. The…
Bring your dog to work day
Holidays
Do you work from home or office? Doesn’t matter. Let’s see those pets that work right alongside you. Well, mine mostly sleeps but they are there! This is Peanut. Her bed is next to my desk. I have to walk her up and down the stairs due to her rickety bon…
Snap! — Space Immunities, Stretching Metal, Defining Sandwich, 3D Printed Steel
Spiceworks Originals
Your daily dose of tech news, in brief.
Welcome to the Snap!
Flashback: june 23, 1912: Computer Pioneer Alan Turing Born (Read more HERE.)
Bonus Flashback: June 22, 2000: Possible evidence of liquid water found on Mars (Read more HERE.)
…
Has anyone else heard anything about RHEL becoming closed source?
Linux
Would anyone care to share their thoughts about what this might indicate for things to come?
A few weeks ago, Jay Lecroix Opens a new window made some passing references to the changes IBM has made to CentOS/CentOS Strea…
IT Documentation
Software
Let me begin by stating I am aware that there are tonnes of posts for this question. But, I was denied financial leeway for unnecessary expenses; and this in their opinion is one. I, recently, acquired the role of and IT do-it-all. for more than a decade,…
Место на нашем WSUS сервере ежедневно таяло на глазах. Решили зачистить старые обновления для Windows 7, 2008 и прочих уже почти отсутствующих у нас операционок.
Для начала стоит попробовать традиционный метод: «Чистка базы WSUS через Server Cleanup Wizard».
Нашли интересный баг, когда проставляем все галки, то сервер наглухо зависает (у нас «провисел» почти сутки) но так ничего не очистилось. А самое интересное, свободные 20 гиг, которые ранее были свободны на диске, тоже куда-то делись 😦
Если галки выставлять поочередно, то что-то очищается.
Но когда ставим галку «Неиспользуемые обновления и редакции обновлений», вылетает: «Ошибка базы данных».
Попробовали сделать PowerShell скриптом (можно поочередно вбивать команды, можно вставить в cmd файл и запустить его):
PS1:
[reflection.assembly]::LoadWithPartialName(«Microsoft.UpdateServices.Administration») | out-null
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
$cleanupScope = new-object Microsoft.UpdateServices.Administration.CleanupScope;
$cleanupScope.DeclineSupersededUpdates = $true
$cleanupScope.DeclineExpiredUpdates = $true
$cleanupScope.CleanupObsoleteUpdates = $true
$cleanupScope.CompressUpdates = $true
$cleanupScope.CleanupObsoleteComputers = $true
$cleanupScope.CleanupUnneededContentFiles = $true
$cleanupManager = $wsus.GetCleanupManager();
$cleanupManager.PerformCleanup($cleanupScope);
Опции:
DeclineSupersededUpdates — Отклонить замененные обновления.
DeclineExpiredUpdates — Отклонить просроченные обновления.
CleanupObsoleteUpdates — Удалить из базы неиспользуемые обновления.
CompressUpdates — Удалить из базы устаревшие ревизии обновлений.
CleanupObsoleteComputers — удалить компьютеры которые не соединялись за последние 30 дней.
CleanupUnneededContentFiles — Удаляет файлы отклоненных обновлений из папки WSUS.
или CMD:
@echo off
@echo Starting cleanup: %date% %time% >> d:scriptsWSUS_Cleanup.log
powershell.exe d:scriptsWSUS_Cleanup.ps1 >> d:scriptsWSUS_Cleanup.log
@echo Finished cleanup: %date% %time% >> d:scriptsWSUS_Cleanup.log
Но в итоге после некоторых раздумий сервер выдал:
Печаль…
Как поправить ошибку пока не понятно…
Вот здесь как раз человек объясняет ситуацию:
http://zetslash.blogspot.com/2017/06/wsus.html
Процедура запуска сценария будет разной для разных вариантов установки SUSDB (Windows Internal Database или SQL Server). Для того, чтобы определить, где развёрнута база данных WSUS необходимо на сервере WSUS проверить значение реестра SQLServerName в разделе HKLMSoftwareMicrosoftUpdate ServicesServerSetup. Если в значении присутствуют ##SSEE или ##WID, то база данных развёрнута на WID, а если вы видите в этом значении имя хоста или имя_сервераэкземпляр, то база данных развёрнута на SQL Server:
В нашем случае видим, что база WID:
Далее, в случае, если база данных развёрнута на WID нам необходимо использовать утилиту sqlcmd и планировщик задач Windows. Если SQL Server — можно запланировать выполнение сценария с помощью планов обслуживания (Maintenance Plans).
Windows Internal Database
Чтобы установить sqlcmd можно скачать и установить SQL Server Management Studio (SSMS) для версии вашей WID. Версию можно определить в лог-файле:
- В Windows Server 2012 — C:WindowsWIDLog — открываем error.log, где в самом начале файла указана используемая версия SQL, для которой нам нужно скачать SSMS Express.
- В Windows Server 2008 R2 и ниже — C:WindowsSYSMSISSEEMSSQL.2005MSSQLLOG — также открываем error.log и в самом начале файла смотрим версию.
Пытаюсь понять какая версия SQL у меня установлена:
Но ничего не понятно, и в файле ничего нет, хотя вроде должно быть.
В итоге устанавливаю консоль SQL Server Management Studio Express 2016 (она благополучно установилась):
Запускаем консоль Management Studio с правами администратора.
Подключаемся к базе, указав следующее имя сервера:
- в Windows Server 2008 / R2 — .pipemssql$microsoft##sseesqlquery
- в Windows Server 2012 / R2 — .pipeMICROSOFT##WIDtsqlquery
Запустил пару скриптов из этого поста, но мне это никак не помогло:
http://zetslash.blogspot.com/2017/06/wsus.html
https://itblog.ru.net/ws/wsus/wsus-cleanup-powershell/
Еще раз запустил мастер очистки, оставил его на ночь и тут случилось чудо:
Самое печальное, что очистка прошла, а места больше на диске так и не стало.
Попробовал сделать через PowerShell:
[reflection.assembly]::LoadWithPartialName(«Microsoft.UpdateServices.Administration»)` | out-null
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
$cleanupScope = new-object Microsoft.UpdateServices.Administration.CleanupScope;
$cleanupScope.DeclineSupersededUpdates = $true
$cleanupScope.DeclineExpiredUpdates = $true
$cleanupScope.CleanupObsoleteUpdates = $true
$cleanupScope.CompressUpdates = $true
$cleanupScope.CleanupObsoleteComputers = $true
$cleanupScope.CleanupUnneededContentFiles = $true
$cleanupManager = $wsus.GetCleanupManager();
$cleanupManager.PerformCleanup($cleanupScope);
Вероятно необходима реиндексация базы.
Попробовал реиндексировать вот таким скриптом:
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
Но снова место на диске так и не появилось.
Попробовал еще один скрипт:
DECLARE IndexCursor CURSOR FOR
SELECT sys.indexes.name AS IndexName
,sys.objects.name AS TableName
FROM sys.indexes
INNER JOIN sys.objects
ON sys.indexes.object_id = sys.objects.object_id
WHERE sys.objects.type = ‘U’
AND sys.indexes.is_disabled = 0
AND NOT sys.indexes.name IS NULL
ORDER BY TableName ASC
,IndexName ASC;
DECLARE @IndexName nvarchar(max), @TableName nvarchar(max);
DECLARE @ExecSql nvarchar(max);
OPEN IndexCursor;
FETCH NEXT FROM IndexCursor INTO @IndexName, @TableName;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @TableName + ‘.’ + @IndexName;
SET @ExecSql = ‘ALTER INDEX [‘ + @IndexName + ‘] ON [‘ + @TableName + ‘] REBUILD;’;
EXEC (@ExecSql);
FETCH NEXT FROM IndexCursor INTO @IndexName, @TableName;
END
CLOSE IndexCursor;
DEALLOCATE IndexCursor;
Но все это добавило лишь несколько мегабайт свободного места.
Скорее всего больше нечего реиндексировать.
ЭТО ВСЕ, ЧТО УДАЛОСЬ ПОЧЕРПНУТЬ ПО ДАННОМУ ВОПРОСУ.
P.S.
Если правил на WSUS не много и можно их потом быстро настроить, то можно переставить WSUS с нуля или резать по живому, это уже кому как виднее и удобнее…
Попробуем резать по живому.
Как корректно и правильно «зачистить» папку WSUSContent я так не нашел, а именно она сейчас занимает все место на диске.
Останавливаем службу в IIS.
Удаляем все, что есть в папке WSUSContent, сразу видим, что диск опустел:
Запускаем службу
Нажимаем Синхронизировать сейчас, но ничего не происходит, так как в базе осталась информация что все обновления на месте, хотя по факту их уже нет.
Чтобы повторно установить WSUS с чистой базой данных, то есть предыдущей конфигурации:
Запустите Windows Powershell в качестве администратора и используйте следующие команды:
- Uninstall-WindowsFeature -Name UpdateServices,Windows-Internal-Database -Restart
- Повторите перезагрузку, удалите ВСЕ в C:WindowsWID(для Win 2012 r2).
- Затем запустите следующую команду для повторной установки WSUS:
Install-WindowsFeature UpdateServices -Restart
Кажется, что удаление WSUS а также WID Database опция фактически не удаляет базу данных WID.
- База данных WID можно удалить, удалив Windows Internal Database особенность.
- Вам также потребуется вручную удалить файл C:windowsWIDDatasusdb.mdf перед повторной установкой все снова.
Надеемся WSUS 4.0 не за горами и версия без подобных «багов» все же появится в продакшине, хотя, как мне показалось, Microsoft почему-то уже давно «забил» на WSUS.
Всем хорошей работы!!!
13.02.2019 —
Posted by |
ms windows server 2016
Sorry, the comment form is closed at this time.
Обнаружил сегодня, что мой WSUS отказывается запускаться и причиной тому является невозможность запуска базы данных WID(MICROSOFT##SSEE). Статья по восстановлению БД ни к чему не привела, а попытка переустановки WSUS закончилась крахом по причине невозможности обнаружить указанную в настройках базу данных. Решение которое помогло в моём случае заключалось в том, что необходимо изменить настройку WSUS отвечающую на вопрос установлена ли на данном сервере база WID (WYukon).
Выставив в ключе реестра
HKLMSOFTWAREMicrosoftUpdate ServicesServerSetupwYukonInstalled
значение 0 (ноль), а также переименовав папку UpdateServicesDbFiles, я смог без проблем удалить и установить заново WSUS.
Надеюсь данное решение поможет кому-нибудь сэкономить время на поиск решения в случае поломки WSUS.