Exchange 2007 Failover and Failback with SCR

I’ve been doing a bit of work with SCR lately, the point being to achieve a “poor man’s failover” for the mailbox server role. Not everyone needs the immediacy, or the expense, of a cluster, and SCR was a welcome addition to the redundacy capabilities of Exchange 2007 – but I couldn’t find a complete step-by-step resource for failover and failback so, after having worked it all out myself, here it all is.

What SCR is, and isn’t

I am not going to rehash the SCR documentation – but I will add some observations of my own.

  • SCR is not a cluster.
  • SCR is a way of copying the mail databases to another server where they can be activated without too much fuss – though there is nothing instantaneous about it because it is not a cluster.
  • SCR failover can be achieved through database portability or through setup /m:Recover.
    • The setup option actually rebuilds your standby server as the primary so it is not a good choice if you expect the primary to be back in business at some point.
    • Database portability is a better choice for most failover scenarios.
  • Database portabilty should really be compared to restoring mail databases from backup rather than clustering (because remember, it’s not a cluster) – where it compares very favorably because:
    • it’s a lot faster as the data is already there on the standby server, and doesn’t need to be restored off tape, and
    • it’s a heck of a lot more up-to-date than a tape backup is likely to be.
  • And finally – the failback takes a lot longer than the failover.

Preparing the Servers

Again all the information about setting up SCR is on technet here so I’m just going to add some description about the storage group config, which had not been immediately obvious to me. Let’s say you have storage group SG1 containing mailbox database MBX1 on SRV1. You want SRV2 to be able to mount the database in case of corruption on SRV1, or all out failure of SRV1. The logs and data locations are as follows:

SG1 Logs E:\Logs\SG1
SG1 System E:\Logs\SG1
MBX1 Data F:\Data\SG1

The first thing you have to do is create the exact same folders in the exact same paths on the target server – but just leave them empty.

The next thing you do, and this is not an immediately obvious step, is to create a placeholder storage group and mail database on SRV2. If the time comes to failover you will actually mount the database copy in this placeholder DB – but you can’t give it the same name as the original. Got that?

Following the example naming from technet, create storage group SG1PORT and mail database MBX1PORT on SRV2. Mount the db, just to check it works, and then dismount again.

Failover Steps

The time has come to move MBX1 to the standby server. These steps should be easily achievable in half an hour. It is assumed SRV1 is down, or at least the MBX1 database is not mounted on SRV1.

1. Prepare storage group for restore operation

Open the Exchange Management Shell on SRV2 and run the following commands.

Restore-StorageGroupCopy SRV1SG1 -StandbyMachine SRV2

Use the "-force" switch if the source server is down.

2. Repair database copy

Test current state of database copy. Look for “Clean Shutdown” or “Dirty Shutdown”.

eseutil /mh "F:DataSG1MBX1.edb"

Repair database if in “Dirty Shutdown” state. Replace n with the number on the log files in the Log folder.

eseutil /r E0n

Confirm “Clean Shutdown” state:

eseutil /mh "F:DataSG1MBX1.edb"

3. Move the folder locations of SG1PORT so they point to the SCR copied locations

Move-StorageGroupPath SRV2SG1PORT -SystemFolderPath "E:LogsSG1" -LogFolderPath "E:LogsSG1" -ConfigurationOnly Move-DatabasePath SRV2SG1PORTMBX1PORT -EdbFilePath "F:DataSG1MBX1.edb" -ConfigurationOnly

4. Set the databases to over-writable and Mount them

Set-MailboxDatabase SRV2SG1PORTMBX1PORT -AllowFileRestore:$true Mount-Database SRV2SG1PORTMBX1PORT

5. Change user homeMDB values to the new database locations

Get-Mailbox -Database SRV1SG1MBX1 |where {$_.ObjectClass -NotMatch '(SystemAttendantMailbox|ExOleDbSystemMailbox)'}| Move-Mailbox -ConfigurationOnly -TargetDatabase SRV2SG1PORTMBX1PORT

Your users should now be able to re-access their mailboxes.

Failing Back

Now you have SRV1 back up and running and you want to move the mailbox database back. Unfortunately this is going to involve copying the entire EDB file while the mailbox database is dismounted. If the file is large, this could take a while.

Your alternative is to make SRV2 the new primary – but keep in mind that you will have to reconfigure SCR to work in the opposite direction.

If a manual reseed is required you’ll end up having to copy the EDB file anyway, so you won’t have saved yourself any downtime. The method for failing back is a straight forward database move.

1. Dismount the mail databases

Open the Exchange Management Shell on SRV2 and run the following commands.

Dismount-Database -Identity SRV1SG1MBX1 Dismount-Database -Identity SRV2SG1PORTMBX1PORT

2. Delete all logs from SRV1

Remove-Item -path "\SRV1E$LogsSG1*" -Recurse

3. Set the mail database on SRV1 to over-writable

Set-MailboxDatabase SRV1SG1MBX1 -AllowFileRestore:$true

4. Copy the EDB file from SRV2 to SRV1

Copy-Item -Path \SRV2F$DataSG1MBX1.edb -Destination \SRV1F$DataSG1MBX1.edb

5. Mount the mail database on SRV1

Mount-Database -Identity SRV1SG1MBX1

6. Change user homeMDB attributes back to SRV1

Get-Mailbox -Database SRV2SG1PORTMBX1PORT |where {$_.ObjectClass -NotMatch '(SystemAttendantMailbox|ExOleDbSystemMailbox)'}| Move-Mailbox -ConfigurationOnly -TargetDatabase SRV1SG1MBX1

The mail service is now restored, but you still need to get SCR working again.

7. Change SG1PORT back to original folders

Move-StorageGroupPath srv-exch2SG1PORT -SystemFolderPath "E:LogsSG1PORT" -LogFolderPath "E:LogsSG1PORT" -ConfigurationOnly Move-DatabasePath srv-exch2SG1PORTMBX1PORT -EdbFilePath "F:DataSG1PORTMBX1PORT.edb" -ConfigurationOnly

8. Clear out SG1 folders on SRV2

Remove-Item -Path "E:LogsSG1*" -Recurse Remove-Item -Path "F:DataSG1MBX1.edb"

You should now be able to re-enable the SCR replication from SRV1 to SRV2.