Archive for the ‘Microsoft DPM 2007 /2010 Server’ Category

Microsoft DPM Server does not remove old recovery points (after expiration of retention period)

April 11, 2010



I have been using DPM of about 6 months until now. The story is that i have of about 4 DPM 2007 production servers. I have various protection groups which protects databases,file system, system state e.t.c. 

After creation of that protection groups everything seemed fine. But after a month ago I kept running out of free space of recovery point volumes for every member of the particular protection group. What I’ve done is that I had some free space on my storage which is used by DPM and every time I increased free space of that particular member. For example I have protection group for database server SRV1 which includes three protected databases db1, db2, db3. I was keeping recovery points for 7 days. Finally I discovered that there are recovery points on Recovery tab of DPM for the whole month. It wasn’t keeping them only for 7 days. The solution I found is to delete the old recovery points manually through PowerShell.  Although there are many sources for that, here is my guide how to do delete them.

1.List of dpm protection groups
get-protectiongroup Srv1

2.Store the output in variable $pglist

$pglist=get-protectiongroup Srv1
output only to count 0,1,2,3,4…

Foreach($pg in $pgList){write-host($pg.FriendlyName)}  // this is only for to see display of members

so you should count members of the protection group always from 0 after that 1,2,3 e.t.c

Db1  -count 0

DB2 -count 1

DB3 -count 2

the statement above will print out the list of protection group in your DPM
server. the first protection group should be referred to $pglist[0], the second one
should be referred to as $pglist[1] and so on

3.Get the source of protected group

$dslist = get-datasource($pglist[X]) for example 6

check to see if you have more than one data source by issuing this command:
write-host $ if you are not getting any output this means that there are multiply data source. For example in DB1 i have multible data sources every 15 minutes because i’ve made synchronization with consistency check every 15 minutes. If this is the cause you need to select which one you are going to use.

foreach($ds in $dslist){write-host $}

master -1

model -2

DB1 -3

For Example i want to delete recovery points from DB1 which is count 3.

4. Get recoverypoints

get-recoverypoint $dslist[3]       //only to verify 

The output is something like:

DB1 12-1-2010 1:05:09   SRV1\DB1… Disk //count 0
DB1 13-1-2010 1:05:41   SRV1\DB1… Disk //count1
DB1 14-1-2010 1:05:48   SRV1\DB1… Disk
DB1 15-1-2010 11:55:40  SRV1\DB1… Disk
DB1 15-1-2010 11:59:42  SRV1\DB1… Disk
DB1 16-1-2010 1:06:43   SRV1\DB1… Disk
DB1 17-1-2010 1:05:28   SRV1\DB1… Disk
5. Optional step for review only

$rplist=get-recoverypoint $dslist[x] example 0
foreach($rp in $rplist){write-host $rp.representedpointintime}

12-1-2010 1:05:09 //count 0
13-1-2010 1:05:41 //count 1
14-1-2010 1:05:48 //count2
15-1-2010 11:55:40
15-1-2010 11:59:42

5.Remove recovery points
remove-recoverypoint -recoverypoint $rplist[x]  //0,1,2 and so on

Here is the whole simple script:

get-protectiongroup SRV1
$pglist=get-protectiongroup SRV1
Foreach($pg in $pgList){write-host($pg.FriendlyName)}
$dslist = get-datasource($pglist[1])
write-host $
foreach($ds in $dslist){write-host $} //count which recovery point you should delete from 0,1,2
get-recoverypoint $dslist[4]
$rplist=get-recoverypoint $dslist[4]
foreach($rp in $rplist){write-host $rp.representedpointintime}
remove-recoverypoint -recoverypoint $rplist[0]

Here is the othe approach. If  write-host $ outputs some result here is the steps need to be taken.

write-host $

systemstate – this is an example

$rplist=get-recoverypoint $dslist

foreach($rp in $rplist) {write-host $rp.representendpointintime}

remove-recoverypoint -recoverypoint $rplist[0]  //and $rplist[1],2 and so on

or if it refjuses to delete recovery points

remove-recoverypoint -recoverypoint $rplist[0] -ForceDeletion