Diff backups older than expected
Alert is disabled by default but can be enabled in dbo.alerts by changing enabled from 0 to 1.
Alert will be thrown if the last differential backup is older than expected. The alert can be configured by editing the statement in the sql column in dbo.alerts.
The values for when the alert should trigger can be configured by the following values:
declare @diffBackupIntervalInHours int = 24 declare @maxFullBackupTimeInHours int = 6
@diffBackupIntervalInHours defines how many hours there are between the backups.
@maxFullBackupTimeInHours defines the maximum time it takes for the full backup (not the differential backup) to complete.
To query the Performance Store database for diff backups that are older than expected, use:
declare @diffBackupIntervalInHours int = 24 declare @maxFullBackupTimeInHours int = 6 declare @localManagementDatabase nvarchar(128) select @localManagementDatabase = c.value from dbo.config c where c.name = 'LocalManagementDatabase' declare @dummyDatabaseName nvarchar(128) select @dummyDatabaseName = c.value from dbo.config c where c.name = 'DummyDatabaseName' select s1.server_name, s1.database_name, s1.last_backup_date from ( select s3.server_name, s3.database_name, max(s3.last_backup_date) last_backup_date, s3.last_failover_date, s3.availability_group_name, s3.create_date from ( select s2.server_name, s2.database_name , case when isnull(s2.last_full_backup_date, 0) > isnull(s2.last_diff_backup_date, 0) then last_full_backup_date else s2.last_diff_backup_date end last_backup_date , s2.last_failover_date, s2.availability_group_name, s2.create_date from ( select d.server_name, d.database_name, d.last_diff_backup_date, null last_full_backup_date, d.last_failover_date, d.availability_group_name, d.create_date from dbo.v_databases d inner join ( select d1.group_database_id, max(isnull(d1.last_diff_backup_date, 0)) last_diff_backup_date, max(isnull(d1.last_failover_date, 0)) last_failover_date from dbo.v_databases d1 where d1.group_database_id is not null group by d1.group_database_id ) s on s.group_database_id = d.group_database_id and s.last_diff_backup_date = d.last_diff_backup_date and d.role_desc = 'PRIMARY' union all select d.server_name, d.database_name, null last_diff_backup_date, d.last_full_backup_date, d.last_failover_date, d.availability_group_name, d.create_date from dbo.v_databases d inner join ( select d1.group_database_id, null last_diff_backup_date, max(isnull(d1.last_full_backup_date, 0)) last_full_backup_date, max(isnull(d1.last_failover_date, 0)) last_failover_date from dbo.v_databases d1 where d1.group_database_id is not null group by d1.group_database_id ) s on s.group_database_id = d.group_database_id and s.last_full_backup_date = d.last_full_backup_date and d.role_desc = 'PRIMARY' ) s2 ) s3 group by s3.server_name, s3.database_name, s3.last_failover_date, s3.availability_group_name, s3.create_date union all select d.server_name, d.database_name , case when d.last_full_backup_date > d.last_diff_backup_date then last_full_backup_date else d.last_diff_backup_date end last_backup_date , d.last_failover_date, d.availability_group_name, d.create_date from dbo.v_databases d where d.group_database_id is null and d.state_desc = 'ONLINE' ) s1 inner join dbo.v_servers s2 on s2.server_name = s1.server_name where s1.last_backup_date < dateadd(hour, -(@diffBackupIntervalInHours + @maxFullBackupTimeInHours), getdate()) and s1.create_date < dateadd(hour, -(@diffBackupIntervalInHours + @maxFullBackupTimeInHours), getdate()) and s2.sample_time > dateadd(hour, -(@diffBackupIntervalInHours + @maxFullBackupTimeInHours), getutcdate()) and s1.last_backup_date > s1.create_date and (s1.availability_group_name is null or (s1.last_failover_date is null or s1.last_failover_date < dateadd(hour, -(@diffBackupIntervalInHours + @maxFullBackupTimeInHours), getutcdate()))) and s1.database_name not in (@localManagementDatabase, N'tempdb', N'model', N'master', N'distribution', N'msdb', @dummyDatabaseName) and s2.is_production = 1
To exclude specific servers from this alert, see how to use the dbo.team_alert_exclude table in Alerting.