System Center 2012 R2 DPM - Ошибка удаления диска из Storage Pool -System.Data.SqlClient.SqlException (0x80131904): The DELETE statement conflicted with the REFERENCE constraint "FK_tbl_SPM_Extent_tbl_SPM_Disk".

imageПри плановой замене дисков из пула Storage Pool в System Center 2012 R2 DPM столкнулся с проблемой удаления высвобожденного диска из пула. Ранее описанный способ удаления диска из пула с предварительным переносом бэкапов на другой диск в завершающей стадии (в тот момент, когда освобождённый от бэкапов диск должен быть удалён из пула) завершился с ошибкой. Перейдя в консоль DPM я увидел, что диск уже действительно не имеет активных бэкапов (Protected data) и при этом помечен как неисправный/либо отсутствующий.

image

Попытки удаления диска из консоли DPM всегда приводили к одинаковому результату – внезапному закрытию консоли DPM. При этом в event-логе сервера сначала фиксировалось исключение в базе данных DPM… 

Log Name:      Application
Source:        MSDPM
Date:          22.08.2016 11:29:01
Event ID:      945
Level:         Error
Computer:      KOM-AD01-SCDP01.holding.com
Description:
... 
Unable to connect to the DPM database because of a general database failure.  Make sure that SQL Server is running and that it is configured correctly.
Problem Details: <__System>19164448/22/2016 8:29:01 AMDpmThreadPool.cs163TrueSqlExceptionThe DELETE statement conflicted with the REFERENCE constraint "FK_tbl_SPM_Extent_tbl_SPM_Disk". The conflict occurred in database "DPMDB_KOM_AD01_SCDP11", table "dbo.tbl_SPM_Extent", column 'DiskID'. The statement has been terminated.System.Data.SqlClient.SqlException (0x80131904): The DELETE statement conflicted with the REFERENCE constraint "FK_tbl_SPM_Extent_tbl_SPM_Disk". The conflict occurred in database "DPMDB", table "dbo.tbl_SPM_Extent", column 'DiskID'... ... Error Number:547,State:0,Class:16

… а сразу после этого фиксировалось второе событие, говорящее о падении службы DPM.

Log Name:      System
Source:        Service Control Manager
Date:          22.08.2016 11:29:02
Event ID:      7031
Level:         Error
Computer:      KOM-AD01-SCDP01.holding.com
Description:
The DPM service terminated unexpectedly.  It has done this 1 time(s).  The following corrective action will be taken in 100 milliseconds: Restart the service.

Физическое удаление диска из оснастки управления дисками с последующим отключением оного от сервера ситуацию никак не изменило. В итоге мы пришли к раскладу, при котором диска на сервере уже нет физически, но DPM упорно не хочет удалять его из своей БД.  

Как видно из текста первого события исключение клиента SQL Server вызвал некий конфликт содержимого таблицы dbo.tbl_SPM_Extent.

Подключимся к базе данных сервера DPM (DPMDB) с помощью SQL Management Studio и посмотрим содержимое таблицы dbo.tbl_SPM_Extent, например с помощью выборки первых 1000 значений из таблицы – Select Top 1000 Rows

image

Как видим, в нашем случае, в таблице 248 записей о дисковых томах используемых в DPM с привязкой к физическим дискам по полю DiskID, о котором фигурирует информация в тексте ранее приведённой ошибки. По зависимостям объектов (для выбранной таблицы - пункт контекстного меню View Dependencies) узнаем о том, что у этой таблицы есть связь с таблицей dbo.tbl_SPM_Disk

image

Заглянув, в свою очередь, в таблицу dbo.tbl_SPM_Disk мы увидим список дисков, зарегистрированных в DPM c их идентификаторами DiskID. Как видно, в нашем случае, один из дисков имеет установленный признак в поле IsMissing. Похоже на наш проблемный диск.

image

Дополнительно можно сверить идентификаторы с выводом информации о дисках с помощью командлета DPM:

Get-DPMDisk | fl *

Определившись с идентификатором DiskID нашего проблемного диска, попробуем вычистить записи из таблицы dbo.tbl_SPM_Extent, имеющие отсылку к этому диску, так как именно эти записи не позволяют нам нормально удалить информацию о уже несуществующем диске из DPM.

Перед манипуляциями в базой данных DPM закрываем консоль DPM и останавливаем все службы связанные с DPM (в моём случае было запущено 3 службы):

net stop MSDPM & net stop DPMAMService & net stop DpmWriter

Делаем резервную копию базы данных DPM на тот случай, если после наших "очумелых ручек" серверу DPM совсем "поплохеет". Ибо возможность отката должна быть предварительно организована всегда.

Возвращаемся к таблице dbo.tbl_SPM_Extent и делаем выборку записей, которые относятся к отсутствующему диску:

SELECT * FROM dbo.tbl_SPM_Extent
WHERE DiskID = '693183c8-5818-4e62-bd8d-93fcf85686b5'

В моём случае из 248 существующих в таблице записей было возвращено 136 записей, относящихся к несуществующему диску.

Удаляем эти записи следующим SQL-запросом:

DELETE FROM dbo.tbl_SPM_Extent
WHERE DiskID = '693183c8-5818-4e62-bd8d-93fcf85686b5'

После этого запускаем службы DPM:

net start MSDPM & net start DPMAMService & net start DpmWriter

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

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

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