DPM Modify Protection Group Error 31224

Chiyo OdikaDPM, SQL, SYSTEM CENTERLeave a Comment

Here’s a Scenario:

I protected some SQL data sources in DPM in a bid to ensure that transaction logs got backed up, and I configured my DPM protection group synchronization frequency accordingly, but wasn’t seeing my data getting backed up as frequently as expected.

To remediate this, I modified my protection group by unprotecting said data, and re-protecting by defining desired settings in another protection group. At this point my data was protected and had several recovery points, but not with the desired frequency. I then unprotected to test with different settings, and upon attempting to protect the data again, I encountered the following error below:

Modify protection group: [group name] failed:

Error 31224: [data path] has recently been migrated. You cannot migrate [data path] again until the recovery points on the previous replica volume are available.


This is fairly intuitive right? Yes! And what it’s essentially saying in not so many words is that you cannot re protect this data because DPM will attempt to associate the recovery points for the now inactive protected data with the new protected data (which is great in itself), but DPM can only support the association of 2 such recovery points (the current and current but one). Hence if you have more than 2 such recovery points you will have to delete all but the last two in order to re-protect the data.

Note that this assessment is based on what I found in my testing. Tested in an installation of DPM 2012 R2 UR 9.

So how to delete previous recovery points for a given data source? The GUI doesn’t appear to be of help there. Enter PowerShell.  I found a useful script here that enumerates all protected data sources in DPM, enables you to select a data source, and determine if multiple replicas exist for that data source. It can then remove the replicas or recovery points after which you can then protect your data source in DPM. Now I know that there are various scripts out there that can do very similar or the same thing this does, and even a cmdlet or two to remove a DPM data source recovery point. I’m simply pointing out how incredibly easy this script makes the process.

The script was initially written for DPM 2010, but is fully tested and functional on DPM 2012 R2. I tested on DPM 2012 R2 UR 9. See build number reference here.


I cannot verify functionality in DPM 2016. Find detailed guidance on the script here: https://blogs.technet.microsoft.com/dpm/2010/11/03/protect-unprotect-protect-unprotect-understanding-how-dpm-2010-retention-works/#commentmessage

#begin script


$dss = @(Get-ProtectionGroup (&hostname) | foreach {Get-Datasource $_})

$dss += Get-Datasource -Inactive

for ($i=0; $i -lt $dss.Count; $i++) {Write-Host "[$i] $($dss[$i].name) on $($dss[$i].productionservername)"}

$ds = $dss[(Read-Host "Select index " )]

$DPMInstallPath= (Get-ItemProperty ‘HKLM:\SOFTWARE\Microsoft\Microsoft Data Protection Manager\setup’).InstallPath

$paths = @(Get-ChildItem ($DPMInstallPath + "Volumes\Replica") -Recurse -Filter "*$($ds.id.guid)*" | ? {$_.PsIscontainer})

if ($paths.Count -lt 2) {Write-Host "No multiple replicas found, aborting…";exit 0}

$cutoff = ($paths | sort creationtime -Descending)[0].creationtime

$rp = @(Get-RecoveryPoint $ds | ? {$_.representedpointintime -lt $cutoff})

$resp = @(Read-Host "Confirm deleting [$($rp.count)] recovery points from `"$($ds.name) _on_ $($ds.productionservername)`" y/N")

if ($resp[0] -ne "y") {write-host "Aborting…"; exit 0}

$rp | foreach {    Remove-RecoveryPoint $_ -ForceDeletion }

#end script


The following two tabs change content below.
Strategist. Technologist. Skeptic. Friend.
Chiyo OdikaDPM Modify Protection Group Error 31224