Skip to content

Database Management

Purpose

If you operate an Exchange Database Availability Group (DAG) with 2 or more servers, you may need to do maintenance to one of the members, and during that maintenance, it's possible that one of the databases of the server that was rebooted etc will be out-of-date. In case this happens, it may suspend the database replication to one of the DAG's member servers.

Checking DAG Database Replication Status

You will want to first log into one of the DAG servers and open the "Exchange Management Shell". From there, run the following command to get the status of database replication. An example of the kind of output you would see is below the command.

Get-MailboxDatabaseCopyStatus * | Format-Table Name, Status, CopyQueueLength, ReplayQueueLength, ContentIndexState
Name Status CopyQueueLength ReplayQueueLength ContentIndexState
DB01\MX-DAG-01 Mounted 0 0 Healthy
DB01\MX-DAG-02 Healthy 0 0 Healthy

Example Output Breakdown

In the above example output, you can see that there are two member servers in the DAG, MX-DAG-01 and MX-DAG-02. Then you will see that there is a status of Mounted, this means that MX-DAG-01 is the active production server; this means that it is handling all mailflow and web requests / webmail.

CopyQueueLength: This is a number of database "transaction logs" that have taken place since a replica database stopped getting updates. This is the queue of all database transactions that are being copied from the production (mounted) database to replica databases. This data is not immediately written to the replica database(s).

CopyReplayLength: This represents the queue of all data that was successfully copied from the production database to the replica database on the given DAG member that still needs to process on the replica database. The "CopyQueueLength" will need to reach zero before the "CopyReplayLength" will start making meaningful progress to reaching zero.

When both the "CopyQueueLength" and "CopyReplayLength" queues have reached zero, the replica database(s) will have reached 100% parity with the production (active/mounted) database.

Changing Active/Mounted DAG Member

You may find that you need to perform work on one of the DAG members, and that requires you to failover the responsibility of hosting the Exchange environment to one of the other members of the DAG. You can generally do this with one command, seen below:

Move-ActiveMailboxDatabase -Identity "DB01" -ActivateOnServer "MX-DAG-02" -MountDialOverride BestAvailability

Argument Breakdown

-MountDialOverride Specifies how tolerant Exchange should be to database copy health when mounting a database on the target server. This setting controls the level of availability Exchange requires before mounting the mailbox database after the move.

-MountDialOverride Instructs Exchange to mount the database as long as at least one healthy copy is available. This option maximizes uptime by allowing a database to mount even if some copies are unhealthy, prioritizing availability over strict health checks.

Troubleshooting

You may run into issues where either the Status or ContentIndexState are either Unhealthy, Suspended, or Failed. If this happens, you need to resume replication of the database from the production active/mounted server to the server that is having issues. In the worst-case, you would re-seed the replica database from-scratch.

If Status is Unhealthy or Suspended

If one of the DAG members has a status of "Unhealthy", you can run the following command to attempt to resume replication.

Resume-MailboxDatabaseCopy -Identity "DB01\MX-DAG-02"

If this fails to cause replication to resume, you can try telling the database to just focus on replication, which tells it to copy the queues and replay them on the replica database, while avoiding interacting with the "ContentIndexState" which can be individually fixed in the commands below:

Resume-MailboxDatabaseCopy -Identity "DB01\MX-DAG-02" -ReplicationOnly

If Status is ServiceDown

If you see this, it generally means that the Exchange Services for some reason or another are not running. You can remediate this with a powershell script. You will then have to double-check your work to ensure that all "Microsoft Exchange" services that have a startup mode of "Automatic" are running, if not, manually start them, then check on the status of the DAG again to see if the status changes from ServiceDown to Healthy. Depending on the speed of the Exchange server, it may take a few minutes, 5-10 minutes, for the services to fully initialize and be ready to handle requests. Go get a coffee and come back and check on the status of the DAG at that time.

Restart Exchange Services Script

If ContentIndexState is Unhealthy or Suspended

If you see that the "ContentIndexState" is unhappy, you can run the following command to force it to re-seed / rebuild itself. (This is non-destructive this this is happening on a replica database).

Update-MailboxDatabaseCopy "DB01\MX05" -CatalogOnly -BeginSeed

If Replica Database is FUBAR

If the replica database just is not playing nice, you can take the nuclear option of completely rebuilding the replica database.

Warning

This will destroy the replica database, so be careful to ensure you have a backup (if possible) before you do this. The following command will completely replace the replica database and replicate the data from the production active/mounted database to the newly-created replica database.

Update-MailboxDatabaseCopy -Identity "DB01\MX-DAG-02" -SourceServer "MX-DAG-01"