Saturday, April 30, 2011

Removing "Update Failed" VMs from the VMM Administrator Console

Recently getting annoyed by the increasing number of VMs with status "Update
Failed". The last thing I remember that this happened after the one of my
Hyper-V host crashed, and ended up 2 identical VMs appear after the quick
migration took place.

Found this blog
http://blogs.technet.com/m2/archive/2010/04/16/removing-missing-vms-from-the-vmm-administrator-console.aspx
and below are my summary of the steps :

1. Close VMM Administrator Console
2. Stop "Virtual Machine Manager" service.
3. Backup the VMM database (optional)
4. Download and install "Microsoft SQL Server Management Studio Express"
from
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796.
5. Launch "Microsoft SQL Server Management Studio Express", select VMM
database and execute script below.
6. Start the "Virtual Machine Manager" service.
7. The VMs with "Update Failed" should have gone by now.

===========Start Script========
BEGIN TRANSACTION T1

DECLARE custom_cursor CURSOR FOR
SELECT ObjectId from
dbo.tbl_WLC_VObject WHERE [ObjectState] = 220

DECLARE @ObjectId uniqueidentifier
OPEN custom_cursor
FETCH NEXT FROM custom_cursor INTO @ObjectId

WHILE(@@fetch_status = 0)
BEGIN

DECLARE vdrive_cursor CURSOR FOR
SELECT VDriveId, VHDId, ISOId from
dbo.tbl_WLC_VDrive WHERE ParentId = @ObjectId

DECLARE @VDriveId uniqueidentifier
DECLARE @VHDId uniqueidentifier
DECLARE @ISOId uniqueidentifier


OPEN vdrive_cursor
FETCH NEXT FROM vdrive_cursor INTO @VDriveId, @VHDId, @ISOId
WHILE(@@fetch_status = 0)
BEGIN
DELETE FROM dbo.tbl_WLC_VDrive
WHERE VDriveId = @VDriveId
if(@VHDId is NOT NULL)
BEGIN

DELETE FROM dbo.tbl_WLC_VHD
WHERE VHDId = @VHDId
DELETE FROM dbo.tbl_WLC_PhysicalObject
WHERE PhysicalObjectId = @VHDId
END
if(@ISOId is NOT NULL)
BEGIN

DELETE FROM dbo.tbl_WLC_ISO
WHERE ISOId = @ISOId
DELETE FROM dbo.tbl_WLC_PhysicalObject
WHERE PhysicalObjectId = @ISOId
END

FETCH NEXT FROM vdrive_cursor INTO @VDriveId, @VHDId, @ISOId
END
CLOSE vdrive_cursor
DEALLOCATE vdrive_cursor

-----------------
DECLARE floppy_cursor CURSOR FOR
SELECT VFDId, vFloppyId from
dbo.tbl_WLC_VFloppy WHERE HWProfileId = @ObjectId

DECLARE @vFloppyId uniqueidentifier
DECLARE @vfdId uniqueidentifier

OPEN floppy_cursor
FETCH NEXT FROM floppy_cursor INTO @vfdId, @vFloppyId
WHILE(@@fetch_status = 0)
BEGIN
DELETE FROM dbo.tbl_WLC_VFloppy
WHERE VFloppyId = @vFloppyId

if(@vfdid is NOT NULL)
BEGIN
DELETE FROM dbo.tbl_WLC_VFD
WHERE VFDId = @vfdId
DELETE FROM dbo.tbl_WLC_PhysicalObject
WHERE PhysicalObjectId = @vfdId

END
FETCH NEXT FROM floppy_cursor INTO @vfdId, @vFloppyId
END
CLOSE floppy_cursor
DEALLOCATE floppy_cursor

----------------
DECLARE checkpoint_cursor CURSOR FOR
SELECT VMCheckpointId from
dbo.tbl_WLC_VMCheckpoint WHERE VMId = @ObjectId

DECLARE @vmCheckpointId uniqueidentifier
OPEN checkpoint_cursor
FETCH NEXT FROM checkpoint_cursor INTO @vmCheckpointId
WHILE(@@fetch_status = 0)
BEGIN
DELETE FROM dbo.tbl_WLC_VMCheckpointRelation
WHERE VMCheckpointId = @vmCheckpointId


FETCH NEXT FROM checkpoint_cursor INTO @vmCheckpointId
END
CLOSE checkpoint_cursor
DEALLOCATE checkpoint_cursor

-------------------------
---------Clean checkpoint

DELETE FROM dbo.tbl_WLC_VMCheckpoint
WHERE VMId = @ObjectID


exec [dbo].[prc_VMMigration_Delete_VMInfoAndLUNMappings] @ObjectId

DECLARE @RefreshId uniqueidentifier
exec [dbo].[prc_RR_Refresher_Delete] @ObjectId, @RefreshId


DELETE FROM dbo.tbl_WLC_VAdapter
WHERE HWProfileId = @ObjectId


DELETE FROM dbo.tbl_WLC_VNetworkAdapter
WHERE HWProfileId = @ObjectId


DELETE FROM dbo.tbl_WLC_VCOMPort
WHERE HWProfileId = @ObjectId

DELETE FROM dbo.tbl_WLC_HWProfile
WHERE HWProfileId = @ObjectId

DELETE FROM dbo.tbl_WLC_VMInstance
WHERE VMInstanceId = @ObjectId

DELETE FROM dbo.tbl_WLC_VObject
WHERE ObjectId = @ObjectId

FETCH NEXT FROM custom_cursor INTO @ObjectId
END
CLOSE custom_cursor
DEALLOCATE custom_cursor

COMMIT TRANSACTION T1
===========End Script===========

The above method does not work for me all time. In case you have the same
issue after the steps above are performed, you may try to remove host
cluster from the VMM.


This is my last resource and it always works for me ☺