Blog of Khlebalin Dmitriy

(Дорогу осилит идущий…)

Таиланд. Пхукет 11 лет спустя (часть 1).

ИНТРО.

Изначально наш маршрут не предполагал пребывание на Пхукете, и мы должны были отправиться на Самуи-Панган-Тао. Но данный пазл никак не складывался без значительных финансовых или временных потерь. Билеты на самолет до Бангкока были куплены по акции еще летом. Далее два варианта: или напрямую лететь на Самуи «Тайскими авиалиниями» или «Бангкок Эирвейз» из Суварнамбхуми, что безусловно удобнее, но дорого (нам так и не удалось поймать акцию на этот перелет), или как обычно, выдвигаться в доместик аэропорт Дон Муанг и оттуда лететь каким-либо лоукостером, далее шаттл и паром соответственно (так на Самуи мы уже ездили). Но тут возникла проблема: самая большая стыковка между рейсами оказалась 3 часа, с учетом пробок по Бангкоку и возможной задержки самолета из Москвы из-за снегопада или еще каких-либо причин, мы сильно рисковали не успеть на стыковочный рейс, а он в этот день был уже последним. Пришлось бы часов на 18 задержаться в Бангкоке, а этот вариант нам никак не подходил. Поэтому, рассмотрев разные варианты, и пришли к выводу, что лучше всего в этот раз нам снова отправиться на Пхукет. На Пхукете мы были ровно 11 лет назад, тогда это был наш первый визит в Тай, мы прибывали в дикой эйфории от всего увиденного и сказанного. Сейчас наш визит сюда должен был быть более четким и осмысленным.

ПЕРЕЛЕТ И ТРАНСФЕР.

В этот раз у нас прямой перелет авиакомпанией «Аэрофлот» до Бангкока (обратно соответственно также из Бангкока).  Вечерний вылет, ночной перелет 9 часов. Доделав дела на работе, отправляемся в аэропорт «Шереметьево», «пробки» удалось миновать и до самолета еще есть время. Быстро проходим пограничный контроль и располагаемся в зале ожидания вылета.

Снегопада в этот день не было, поэтому наш рейс отправляется согласно расписанию почти без задержек.

Нам показалось, что авиакомпания «Аэрофлот» максимально сократила издержки при перелетах. Еда неплохая, но наверно несколько хуже, чем была пару лет назад, снеков, мороженного, закусок более в экономе никто не предлагает. Про спиртное я уже молчу.

Перелет прошел штатно, без происшествий на борту, все было тихо и спокойно, и это безусловно радовало. В 8.20 по местному времени мы совершили посадку в аэропорту Бангкока, как ни странно, достаточно быстро прошли пограничный контроль и на бесплатном автобусе от выхода №3 отправляемся в доместик аэропорт (не забываем распечатать или сохранить на телефон билеты на следующий рейс из доместик аэропорта, иначе на автобус Вас просто не посадят).

При передвижении между аэропортами необходимо всегда учитывать время суток и соответственно «пробки» Бангкока. В определенное время можно добраться до следующего аэропорта за 45 минут, но в этот раз с учетом утренних пробок, нам потребовалось 1 час 40 минут, что есть очень долго.

Ночной перелет, тем более сразу после рабочего дня дается нам достаточно не просто. До следующего рейса на Пхукет у нас еще есть время, поэтому заводим будильник и ложимся спать.

Обычно на внутренних перелетах в ЮВА мы предпочитаем авиакомпанию «AirAsia”, но в этот раз решили попробовать что-то другое и выбрали «Nokair»:

https://www.nokair.com

тем более что билеты у Нок обходились еще и на 1000р дешевле чем у «AirAsia”. Но это с одной стороны хорошо, а с другой, наш вылет задержали на 40 минут. Мы уже никуда не спешили, но тем не менее с пунктуальностью у «AirAsia” дела обстоят несколько лучше.

Примерно через 1 час 10 минут мы уже в аэропорту Пхукета. Теперь нам необходимо добраться до пляжа Патонг. Добраться можно несколькими способами: такси (не наш вариант), шаттл или автобус. Выходим из аэропорта и сразу идем налево до конца, на стоянке видим автобусы и карту маршрутов каждого (до Патонга стоимость 170 бат с человека), изначально мы планировали воспользоваться именно автобусом. Но тут прям на автобусной остановке откуда ни возьмись посвился водитель шаттла и предложил нам доехать прям до отеля за 150 бат с человека. Отнеслись к этому с некоторым недоверием, но решили попробовать и не ошиблись, нас действительно доставили прямо ко входу в отель. Обратите внимание при посадке в автобус или шаттл: едем именно до Патонг бич, а не до Пхукет таун.

Вечерние «пробки» на Пхукете ничем не уступают Бангкоку. От аэропорта до пляжа Патонг 40 км, ехали мы их примерно также 1 час 40 минут. Мы находились в дороге уже примерно 25 часов, сказывался ночной перелет и усталость, хотелось как можно быстрее заселиться в отель, поесть и лечь спать.

ПРО ОТЕЛЬ.

Выбор отеля это для нас всегда непростая задача. Всегда хочется найти что-то недорогое и приличное, но получается всегда по-разному. Учитывая то, что в Тайских отелях мы проводим минимум времени, то мы всегда предпочитаем 2 или 3 звезды. В этот раз в ходе изучения вопроса решили остановиться на отеле: «Memory Patong»

https://www.booking.com/hotel/th/memory-patong.ru.html?aid=315714;label=memory-patong-R1D35a6o88y0iA0dGuvAQQS166826346712%3Apl%3Ata%3Ap1%3Ap2%3Aac%3Aap1t1%3Aneg%3Afi%3Atikwd-42741867603%3Alp9047025%3Ali%3Adec%3Adm;sid=54e9b0418410e45974045e4e517e8fc0;dest_id=-3406238;dest_type=city;dist=0;hapos=1;hpos=1;room1=A%2CA;sb_price_type=total;srepoch=1551335372;srfid=6fb4e53826b41b613c4e5bcadd43434820cd9014X1;srpvid=e9f42da5f2f70031;type=total;ucfs=1&#hotelTmpl

Остановлюсь на плюсах и минусах:

— Соотношение «цена-качество».

— Удобное расположение, тихое уютное место в переулке. До пляжа Патонг 10 минут пешком. До Цейлона также минут 10 пешком.

— Отличный персонал, как многие пишут, во многом пытаются помочь и решить возникшие вопросы, все как-то по-домашнему чтоль (брали пару раз нож нарезать фрукты, утюг с гладильной доской-ноу проблем).

— Быстрый Wi-fi для меня это сильно важно, так как приходится иногда работать в отпуске.

— Достаточно мягкие подушки (спать на них будет комфортно), в меру жесткий матрац.

— Убираются каждый день. Все чисто и комфортно.

— Телевизор показывает один канал на русском, иногда смотрели новости.

— В душе горячая, а не теплая вода, как бывает во многих отелях Тая.

— Холодильник, чайник (попросили поменять чайник, без проблем поменяли), кофе, 2 бесплатные бутылки воды в день.

— Кондиционер с пультом, это важно, что не надо вставать ночью что-то руками включать или выключать.

— Сейф в номере, сначала не разобрался как пользоваться, но персонал подсказал.

— Фен в номере, что не свойственно для отеля такого класса.

— Внизу бильярд, можно погонять шары, вечером пару раз прикоснулись.

— Важный момент, мотобайк в аренду без залога и паспорта (но об этом отдельно).

Но как обычно, без ложки дегтя не бывает. И теперь о минусах, их немного, но некоторые фундаментальны и достаточно неприятны:

-Картонные двери и стены, слышно буквально все, что происходит вокруг. Решите поспать днем, сделать это будет достаточно не просто. Пару дней с нами рядом жили громкие соседи, которые приходили в час ночи и разговаривали на весь коридор достаточно громко, хотелось уже выйти и внести тишину. Это фундаментальный минус данного отеля.

-Ключ в единственном числе, вытаскиваешь из гнезда номера, гаснет кондиционер, и самое важное, телефон на зарядке тоже не заряжается, второго чтоб оставить в гнезде в номере нет, но это мелочь.

В остальном все просто ГУД.

Продолжение следует…

Всем хороших путешествий!!!

28.02.2019 Posted by | как я отдыхал... | 1 комментарий

Отпуск.

Очередные пол года работы позади, вновь пришло время предаться релаксу и отдохнуть, в этот раз нормального отпуска не получится, так как необходимо будет решать рабочие вопросы удаленно.

Stay tuned !!!

14.02.2019 Posted by | как я отдыхал... | Комментарии к записи Отпуск. отключены

Очистка и индексация базы WSUS (troubleshooting).

Место на нашем 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:\scripts\WSUS_Cleanup.log

powershell.exe d:\scripts\WSUS_Cleanup.ps1 >> d:\scripts\WSUS_Cleanup.log

@echo Finished cleanup: %date% %time% >> d:\scripts\WSUS_Cleanup.log

Но в итоге после некоторых раздумий сервер выдал:

Печаль…

Как поправить ошибку пока не понятно…

Вот здесь как раз человек объясняет ситуацию:

http://zetslash.blogspot.com/2017/06/wsus.html

Процедура запуска сценария будет разной для разных вариантов установки SUSDB (Windows Internal Database или SQL Server). Для того, чтобы определить, где развёрнута база данных WSUS необходимо на сервере WSUS проверить значение реестра SQLServerName в разделе HKLM\Software\Microsoft\Update Services\Server\Setup. Если в значении присутствуют ##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:\Windows\WID\Log — открываем error.log, где в самом начале файла указана используемая версия SQL, для которой нам нужно скачать SSMS Express.
  • В Windows Server 2008 R2 и ниже — C:\Windows\SYSMSI\SSEE\MSSQL.2005\MSSQL\LOG — также открываем error.log и в самом начале файла смотрим версию.

Пытаюсь понять какая версия SQL у меня установлена:

Но ничего не понятно, и в файле ничего нет, хотя вроде должно быть.

В итоге устанавливаю консоль SQL Server Management Studio Express 2016 (она благополучно установилась):

Запускаем консоль  Management Studio с правами администратора.

Подключаемся к базе, указав следующее имя сервера:

  • в Windows Server 2008 / R2  — \\.\pipe\mssql$microsoft##ssee\sql\query
  • в Windows Server 2012  / R2 — \\.\pipe\MICROSOFT##WID\tsql\query

Запустил пару скриптов из этого поста, но мне это никак не помогло:

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:\Windows\WID\(для Win 2012 r2).
  • Затем запустите следующую команду для повторной установки WSUS:

Install-WindowsFeature UpdateServices -Restart

Кажется, что удаление WSUS а также WID Database опция фактически не удаляет базу данных WID.

  • База данных WID можно удалить, удалив Windows Internal Database особенность.
  • Вам также потребуется вручную удалить файл C:\windows\WID\Data\susdb.mdf перед повторной установкой все снова.

Надеемся WSUS 4.0 не за горами и версия без подобных «багов» все же появится в продакшине, хотя, как мне показалось, Microsoft почему-то уже давно «забил» на WSUS.

Всем хорошей работы!!!

13.02.2019 Posted by | ms windows 2016 | Комментарии к записи Очистка и индексация базы WSUS (troubleshooting). отключены