You can monitor the percent completion of an AOAG sync using the below TSQL query:
select
local_database_name
, internal_state_desc
, start_time_utc
, database_size_bytes
, transferred_size_bytes
, transferred_size_bytes*100/database_size_bytes as [Percent Complete]
from
sys.dm_hadr_physical_seeding_stats stat
I post this first because I always find myself recreating it manually so hopefully that’s useful to you. Unfortunately it will also give you results that are a bit weird. Like this:

This is the type of result that Microsoft Minutes aspire to be when they grow up. You sit watching a database through the first 20% of the sync, calculate the expected completion time and go off to bed happy it will finish around 8 o’clock the next day and then rise to find it finished 5 minutes after you left it.
The numbers don’t make sense on face value. But they are also are absolutely telling the truth. The database IS that number of bytes, and the amount transferred IS the number that it says. There are a couple of missing pieces of the puzzle:
- The database_size_bytes column represents the entire database size, including white space in both the data and log file. It is quite literally the size of the data and log file, not the used space of the data and log file.
- The transferred_size_bytes is the number of bytes transferred. But that data is transferred compressed, so even in a full database you can expect to see the transfer byte size considerable smaller than the database byte size when the seeding completes.
So there you go, hopefully one small corner of the AOAG experience makes more sense to you today than it did yesterday. Key takeaway – you are not insane, reality is just more complicated than you think.