После подключения нового файлового кластера на базе Windows Server 2012 R2 в качестве сервера Библиотеки (Library Server) System Center 2012 R2 Virtual Machine Manager (VMM) через консоль VMM попытались выполнить удаление ранее используемого файлового кластера на Windows Server 2008 R2 и что-то в процессе удаления пошло не так… Сервера-участники кластера были успешно удалены из консоли, в том числе были удалены агенты VMM с этих серверов, однако сам объект кластера удалён не был с ошибкой "Ошибка (13805). Не удалось связаться со службой кластеров на KOM-AD01-FSCLS.", хотя сам кластер при этом находился во вполне вменяемом состоянии…
Последующие попытки удалить запись о кластере Библиотеки VMM заканчивались также безуспешно..
Манипуляции с PowerShell командлетом предназначенным для удаления сервера Библиотеки VMM Remove-SCLibraryServer не помогли, так как командлет на текущий момент не имеет возможности форсированного удаления объектов.
Стало понятно, что для решения проблемы нужно искать какой-то обходной метод. Попавшиеся на глаза статья Darryl van der Peijl - Force Remove Virtual Machine Manager library несколько обнадёжила, и несмотря на то, что речь в ней шла о System Center 2012 VMM, я решил попробовать описанную в них методику чистки БД VMM применительно своего экземпляра System Center 2012 R2 VMM.
Перед описанной процедурой обязательно нужно сделать резервную копию БД VMM, так как в случае чего, БД с “фантомной” записью сервера Библиотеки – меньшее зло, чем сломанная вовсе БД.
Итак, чтобы узнать внутренний идентификатор нашего кластерного сервера Библиотеки который мы хотим удалить из БД (в нашем случае имя этого сервера KOM-AD01-FSCLS), подключаемся к БД VMM и выполняем SQL запрос:
USE VirtualManagerDB
SELECT LibraryID,ComputerName FROM dbo.tbl_ADHC_Library
Запоминаем полученный идентификатор сервера из колонки LibraryID…
Согласно приведённым ранее ссылкам выполняем запрос к таблицам tbl_ADHC_HostDisk и tbl_ADHC_HostVolume выбрав записи по LibraryID нашего сервера
USE VirtualManagerDB
SELECT * FROM tbl_ADHC_HostDisk WHERE LibraryServerID LIKE '[LibraryID]'
SELECT * FROM tbl_ADHC_HostVolume WHERE LibraryServerID LIKE '[LibraryID]'
Видим что в этих таблицах с нашим старым файловым кластером связано несколько записей о физических и логических дисках. Выполняем их удаление запросом:
USE VirtualManagerDB
DELETE FROM tbl_ADHC_HostDisk WHERE LibraryServerID LIKE '[LibraryID]'
DELETE FROM tbl_ADHC_HostVolume WHERE LibraryServerID LIKE '[LibraryID]'
Теперь пробуем с помощью специальной процедуры БД VMM выполнить запрос на удаление записи о самом сервере:
EXEC prc_ADHC_Library_Delete '[LibraryID]'
Получаем сообщение об ошибке:
Msg 547, Level 16, State 0, Procedure prc_ADHC_Library_Delete, Line 16
The DELETE statement conflicted with the REFERENCE constraint "FK_tbl_ADHC_HostBusAdapter_tbl_ADHC_Library". The conflict occurred in database "VirtualManagerDB", table "dbo.tbl_ADHC_HostBusAdapter", column 'LibraryServerID'.
The statement has been terminated.
Это значит что выполнить удаление записи о сервере невозможно потому что на этот объект ссылается таблица tbl_ADHC_HostBusAdapter в колонке LibraryServerID, и пока мы не удалим зависимые объекты, – не сможем удалить запись о сервере.
Пытаемся выяснить что есть в зависимой таблице по нашему идентификатору LibraryID:
SELECT * FROM tbl_ADHC_HostBusAdapter WHERE LibraryServerID LIKE '[LibraryID]'
Видим что имеется одна запись в которой хранится информация о хост-адаптере. Пытаемся удалить эту запись:
DELETE FROM tbl_ADHC_HostBusAdapter WHERE LibraryServerID LIKE '[LibraryID]'
И снова получаем ошибку зависимости:
Msg 547, Level 16, State 0, Line 3
The DELETE statement conflicted with the REFERENCE constraint "FK_tbl_ADHC_HostFibreChannelHba_tbl_ADHC_HostBusAdapter". The conflict occurred in database "VirtualManagerDB", table "dbo.tbl_ADHC_HostFibreChannelHba", column 'FCHbaID'.
The statement has been terminated.
Запрашиваем в таблице tbl_ADHC_HostFibreChannelHba записи по нашему хост-адаптеру. ID хост-адаптера берем из предыдущего запроса из колонки HbaID (на предыдущем скриншоте)
SELECT * FROM tbl_ADHC_HostFibreChannelHba WHERE FCHbaID='[HbaID]'
В нашем случае была возвращена одна запись
Пытаемся удалить эту запись…
DELETE FROM tbl_ADHC_HostFibreChannelHba WHERE FCHbaID='[HbaID]'
…и снова получаем ошибку зависимости…
Msg 547, Level 16, State 0, Line 2
The DELETE statement conflicted with the REFERENCE constraint "FK_tbl_ADHC_FCHbaToFibrePortMapping_tbl_ADHC_HostFibreChannelHba". The conflict occurred in database "VirtualManagerDB", table "dbo.tbl_ADHC_FCHbaToFibrePortMapping", column 'FCHbaID'.
The statement has been terminated.
На эту запись ссылаются записи в таблице tbl_ADHC_FCHbaToFibrePortMapping. Посмотрим на них:
SELECT FROM tbl_ADHC_FCHbaToFibrePortMapping WHERE FCHbaID = '[FCHbaID]'
Пытаемся удалить эти записи…
DELETE FROM tbl_ADHC_FCHbaToFibrePortMapping WHERE FCHbaID='[FCHbaID]'
На этот раз, в моём случае удаление записей прошло успешно. И теперь по цепочке удаляем всё что не смогли удались по зависимостям, то есть идём обратно снизу вверх…
DELETE FROM tbl_ADHC_HostFibreChannelHba WHERE FCHbaID='[HbaID]'
DELETE FROM tbl_ADHC_HostBusAdapter WHERE LibraryServerID LIKE '[LibraryID]'
Позже выясняется ещё одна зависимость (по мапингу к виртуальным сетям), - удаляем соответствующие записи:
DELETE FROM tbl_ADHC_LibraryServerVMNetworkRelation WHERE LibraryID='[LibraryID]'
После этого конечное удаление сервера прошло успешно:
EXEC prc_ADHC_Library_Delete '[LibraryID]'
Перезапускаем консоль VMM и проверяем результат.
Понятно, что такой сценарий нельзя считать официально поддерживаемым и даже просто рекомендуемым, - исключительно на Ваш страх и риск. Остаётся только надеяться на то, что в перспективе команда разработчиков VMM добавит возможность форсированного удаления информации о сервере Библиотеки.
Добавить комментарий