RemoveMissingVMs
Applies To: Virtual Machine Manager 2008 R2, Virtual Machine Manager 2008 R2 SP1
Occasionally, after a cluster failover, duplicate virtual machines may appear in the System Center Virtual Machine Manager (VMM) Administrator Console: one with a status of Missing, the other with a different status. The missing virtual machines can be difficult to remove. The script in this topic is a SQL Server script that removes the missing virtual machines for you.
Note
The script removes all virtual machines with the status of Missing from the VMM database. The script does not delete any virtual machines from any host computer, whether it is a Hyper-V, Virtual Server, or VMware-based host.
The following steps help you prepare your system and run the script:
Close the VMM Administrator Console.
Stop the Windows service named VMMService on the VMM server.
Make a full backup of the VMM database.
Install Microsoft SQL Server Management Studio Express on the same computer on which the VMM database is stored.
Tip
Microsoft SQL Server Management Studio Express is a free download from Microsoft that you can find on the Microsoft Download Center (https://go.microsoft.com/fwlink/?LinkId=190524).
Open SQL Server Management Studio Express, select the VMM database, and then run the following SQL Server script. This should delete all missing virtual machines with a status of Missing from the VMM database. If the script was successful, you will see the following output:
Commands(s) completed successfully.
After the SQL Server script has completed, restart the VMMService and open the VMM Administrator Console to verify that the missing virtual machines are now deleted.
BEGIN TRANSACTION T1
DECLARE custom_cursor CURSOR FOR
SELECT ObjectId
FROM dbo.tbl_WLC_VObject
WHERE ObjectState IN (225,220)
AND Name IN (
SELECT Name
FROM dbo.tbl_WLC_VObject
WHERE ObjectState IN (0,1,2,3,4,5,6,11,12,13,80,81,100,102,103,106,200,210,211,212,214,215)
-- AND Name NOT IN('VM Name1', 'VM Name2')
)
DECLARE @ObjectId uniqueidentifier
DECLARE @InUse int
OPEN custom_cursor
FETCH NEXT FROM custom_cursor INTO @ObjectId
WHILE(@@fetch_status = 0)
BEGIN
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
-- Check if entries which share the same VMCheckpointId exist in tbl_WLC_VObject, tbl_WLC_VMCheckpointRelation
SET @InUse = 0
SET @InUse += (SELECT COUNT(*) FROM dbo.tbl_WLC_VObject WHERE VMCheckpointId = @ObjectID)
SET @InUse += (SELECT COUNT(*) FROM dbo.tbl_WLC_VMCheckpointRelation WHERE VMCheckpointId = @ObjectID)
IF @InUse = 0
BEGIN
DELETE FROM dbo.tbl_WLC_VMCheckpoint WHERE VMId = @ObjectID
END
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
-- Check if entries which share the same VHDId exist in tbl_WLC_VDrive, tbl_WLC_VMCheckpointRelation
SET @InUse = 0
SET @InUse += (SELECT COUNT(*) FROM dbo.tbl_WLC_VDrive WHERE VHDId = @VHDId)
SET @InUse += (SELECT COUNT(*) FROM dbo.tbl_WLC_VMCheckpointRelation WHERE VHDId = @VHDId)
IF @InUse = 0
BEGIN
DELETE FROM dbo.tbl_WLC_VHD WHERE VHDId = @VHDId
DELETE FROM dbo.tbl_WLC_PhysicalObject WHERE PhysicalObjectId = @VHDId
END
END
IF(@ISOId IS NOT NULL)
BEGIN
-- Check if entries which refer same ISOId exist in tbl_WLC_VDrive
IF NOT EXISTS(SELECT TOP 1 * FROM dbo.tbl_WLC_VDrive WHERE ISOId = @ISOId)
BEGIN
DELETE FROM dbo.tbl_WLC_ISO WHERE ISOId = @ISOId
DELETE FROM dbo.tbl_WLC_PhysicalObject WHERE PhysicalObjectId = @ISOId
END
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
-- Check if entries which refer the same VFDId exist in tbl_WLC_VFloppy
IF NOT EXISTS(SELECT TOP 1 * FROM dbo.tbl_WLC_VFloppy WHERE VFDId = @vfdId)
BEGIN
DELETE FROM dbo.tbl_WLC_VFD WHERE VFDId = @vfdId
DELETE FROM dbo.tbl_WLC_PhysicalObject WHERE PhysicalObjectId = @vfdId
END
END
FETCH NEXT FROM floppy_cursor INTO @vfdId, @vFloppyId
END
CLOSE floppy_cursor
DEALLOCATE floppy_cursor
exec [dbo].[prc_VMMigration_Delete_VMInfoAndLUNMappings] @ObjectId
DECLARE @RefreshId uniqueidentifier
exec [dbo].[prc_RR_Refresher_Delete] @ObjectId, @RefreshId
-- Check if entries which refer the same VAdapterId exist in tbl_WLC_VDrive
IF NOT EXISTS(SELECT TOP 1 * FROM dbo.tbl_WLC_VDrive WHERE VAdapterId = @ObjectId)
BEGIN
DELETE FROM dbo.tbl_WLC_VAdapter WHERE HWProfileId = @ObjectId
END
DELETE FROM dbo.tbl_WLC_VNetworkAdapter WHERE HWProfileId = @ObjectId
DELETE FROM dbo.tbl_WLC_VCOMPort WHERE HWProfileId = @ObjectId
-- Check if entries which refer the same VMInstanceId exist in tbl_VMMigration_VMToLUNMapping
IF NOT EXISTS(SELECT TOP 1 * FROM dbo.tbl_VMMigration_VMToLUNMapping WHERE VMInstanceId = @ObjectId)
BEGIN
DELETE FROM dbo.tbl_WLC_VMInstance WHERE VMInstanceId = @ObjectId
END
-- Check if entries which refer the same ObjectID exist in tbl_RR_Refresh, tbl_WLC_VMInstance
SET @InUse = 0
SET @InUse += (SELECT COUNT(*) FROM dbo.tbl_RR_Refresh WHERE ObjectId = @ObjectID)
SET @InUse += (SELECT COUNT(*) FROM dbo.tbl_WLC_VMInstance WHERE ObjectId = @ObjectID)
IF @InUse = 0
BEGIN
DELETE FROM dbo.tbl_WLC_VObject WHERE ObjectId = @ObjectId
END
-- Check if entries which refer the same HWProfileId in tbl_WLC_VFloppy, tbl_WLC_VAdapter, tbl_WLC_VObject
SET @InUse = 0
SET @InUse += (SELECT COUNT(*) FROM dbo.tbl_WLC_VFloppy WHERE HWProfileId = @ObjectID)
SET @InUse += (SELECT COUNT(*) FROM dbo.tbl_WLC_VAdapter WHERE HWProfileId = @ObjectID)
SET @InUse += (SELECT COUNT(*) FROM dbo.tbl_WLC_VObject WHERE HWProfileId = @ObjectID)
IF @InUse = 0
BEGIN
DELETE FROM dbo.tbl_WLC_HWProfile WHERE HWProfileId = @ObjectId
END
FETCH NEXT FROM custom_cursor INTO @ObjectId
END
CLOSE custom_cursor
DEALLOCATE custom_cursor
COMMIT TRANSACTION T1