System Center 2012 R2 Virtual Machine Manager - Удаляем из БД запись о Library Server

imageПосле подключения нового файлового кластера на базе Windows Server 2012 R2 в качестве сервера Библиотеки (Library Server) System Center 2012 R2 Virtual Machine Manager (VMM) через консоль VMM попытались выполнить удаление ранее используемого файлового кластера на Windows Server 2008 R2 и что-то в процессе удаления пошло не так… Сервера-участники кластера были успешно удалены из консоли, в том числе были удалены агенты VMM с этих серверов, однако сам объект кластера удалён не был с ошибкой "Ошибка (13805). Не удалось связаться со службой кластеров на KOM-AD01-FSCLS.", хотя сам кластер при этом находился во вполне вменяемом состоянии…

image

Последующие попытки удалить запись о кластере Библиотеки VMM заканчивались также безуспешно..

image

Манипуляции с 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

image

Согласно приведённым ранее ссылкам выполняем запрос к таблицам 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]'

image

Видим что в этих таблицах с нашим старым файловым кластером связано несколько записей о физических и логических дисках. Выполняем их удаление запросом:

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]'

image
Видим что имеется одна запись в которой хранится информация о хост-адаптере. Пытаемся удалить эту запись:

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]'

В нашем случае была возвращена одна запись

image

Пытаемся удалить эту запись…

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]'

image

Пытаемся удалить эти записи…

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 добавит возможность форсированного удаления информации о сервере Библиотеки.

Добавить комментарий