Esclarecimento direto : Estou usando RPO para descrever "Perda de dados estimada" e RTO para descrever "Tempo de recuperação estimado" nesta pergunta. Percebo que não são definições exatas, mas estão próximas o suficiente para o bem da questão.
Na parte inferior deste artigo, há um excelente bloco de código usado para calcular o RPO para uma determinada instância habilitada para Always-On:
--@EstimatedDataLoss (RPO)
WITH DR_CTE ( replica_server_name, database_name, last_commit_time)
AS
(
select ar.replica_server_name, database_name, rs.last_commit_time
from master.sys.dm_hadr_database_replica_states rs
inner join master.sys.availability_replicas ar on rs.replica_id = ar.replica_id
inner join sys.dm_hadr_database_replica_cluster_states dcs on dcs.group_database_id = rs.group_database_id and rs.replica_id = dcs.replica_id
where replica_server_name != @@servername
)
select ar.replica_server_name, dcs.database_name, rs.last_commit_time, DR_CTE.last_commit_time 'DR_commit_time', datediff(ss, DR_CTE.last_commit_time, rs.last_commit_time) 'lag_in_seconds'
from master.sys.dm_hadr_database_replica_states rs
inner join master.sys.availability_replicas ar on rs.replica_id = ar.replica_id
inner join sys.dm_hadr_database_replica_cluster_states dcs on dcs.group_database_id = rs.group_database_id and rs.replica_id = dcs.replica_id
inner join DR_CTE on DR_CTE.database_name = dcs.database_name
where ar.replica_server_name = @@servername
order by lag_in_seconds desc
E com algumas de minhas próprias modificações, uma consulta semelhante pode ser derivada para RTO:
--@EstimatedRecoveryTime (RTO)
select ar.replica_server_name, dcs.database_name, rs.redo_queue_size, rs.redo_rate, rs.redo_queue_size/rs.redo_rate as TRedo
from master.sys.dm_hadr_database_replica_states rs
inner join master.sys.availability_replicas ar on rs.replica_id = ar.replica_id
inner join sys.dm_hadr_database_replica_cluster_states dcs on dcs.group_database_id = rs.group_database_id and rs.replica_id = dcs.replica_id
where ar.replica_server_name != @@servername
Essas métricas funcionarão bem para meus ambientes Always-On, no entanto, estou procurando aplicar o mesmo para SQL Mirroring em alguns ambientes anteriores a 2012.
Existem objetos de sistema semelhantes para calcular as mesmas métricas para espelhamento de SQL?
Nota: Minhas referências ao que conta como RTO e RPO vêm deste artigo da Mircosoft:
https://msdn.microsoft.com/en-us/library/dn135338(v=sql.110).aspx
sp_dbmmonitorresults irá gerar os dados que você procura. Você pode registrá-lo periodicamente em uma tabela (se desejar coletar dados históricos) ou executá-lo ad-hoc, armazenando os dados em uma tabela temporária para poder consultar e derivar as métricas desejadas.
Você também pode usar contadores Perfmon para rastrear isso se quiser integrá-lo a uma ferramenta de monitoramento que dependa do Perfmon.
Como um aparte, eu evitaria usar RPO e RTO nesta circunstância (apesar do que a Microsoft diz). Espelhamento/AGs devem ser tratados como alta disponibilidade, não como recuperação de desastres. Um usuário descartando uma tabela não pode ser protegido por um grupo de disponibilidade ou espelho - eles repetirão alegremente esse erro em seus nós secundários.
Usar esses termos com pessoas não familiarizadas com a tecnologia pode ser enganoso.