$ServerList = Invoke-SQLCmd -ServerInstance dbcms -Database dba_toolbox -Query $Query | Where-Object ServerName -NotMatch $ExcludeServers | Select-Object -ExpandProperty ServerName #Get Backup information query $BKQuery = @" SELECT bk.database_name AS Name, bk.recovery_model AS RecoveryModel, bk.backup_finish_date AS LastBackupDate, bk.Type, bk.backup_size AS LastBackupSize FROM msdb.dbo.backupset AS bk INNER JOIN ( SELECT database_name, MAX(backup_finish_date) AS LastBackupDate, Type FROM msdb.dbo.backupset GROUP BY database_name,Type ) AS bkmax ON bk.database_name = bkmax.database_name and bk.backup_finish_date = bkmax.LastBackupDate and bk.type = bkmax.type "@ $BackupSets = ForEach ($db in $ServerList) { Write-Verbose "$(Get-Date): Working on $db..." $BaseName = $db.Split(".")[0] Try { $Version = ([version](Invoke-SQLCmd -ErrorAction Stop -ServerInstance $db -Database Master -Query "SELECT SERVERPROPERTY('productversion') AS [Version]").Version).Major } Catch { [PSCustomObject]@{ Server = $db Database = $_ "Recovery Model" = "" "Last Backup" = "" "Last T-Log Backup" = "" "Backup Size" = "" "Days Since Last Backup" = "" "Backup Status" = "Error" } Write-Error "Unable to access $db because ""$_""" Continue } $Databases = Invoke-SQLCmd -ServerInstance $db -Database Master -Query "SELECT name,recovery_model_desc AS RecoveryModel FROM sys.databases WHERE name != 'tempdb' AND state = 0 AND source_database_id IS NULL AND state_desc ='ONLINE'" | Where-Object Name -notmatch $ExcludeDB If ($db -like "popdbclient*") { $Databases = $Databases | Where-Object Name -match $PopdbclientIncludes } $MirrorInfo = Invoke-SQLCmd -ServerInstance $db -Database Master -Query "SELECT sys.name AS Name FROM sys.databases AS sys JOIN sys.database_mirroring AS mir ON sys.database_id = mir.database_id WHERE mir.mirroring_role = 2" | Select-Object -ExpandProperty Name $Backup = Invoke-SQLCmd -ServerInstance $db -Database Master -Query $BKQuery $AGInfo = @{} If ($Version -gt 10) { $AGInfo = Invoke-SQLCmd -ServerInstance $db -Database Master -Query "SELECT adc.database_name AS Name,hadr.primary_replica AS [Primary] FROM sys.dm_hadr_availability_group_states AS hadr JOIN sys.availability_databases_cluster AS adc ON hadr.group_id = adc.group_id" | Group-Object Name -AsHashTable } ForEach ($Database in $Databases) { If ($AGInfo) { If ($AGInfo.ContainsKey($Database.Name) -and $AGInfo[$Database.Name].Primary -ne $BaseName) { Continue } } If ($MirrorInfo -contains $Database.Name) { Continue } $LastFull = $Backup | Where-Object { $_.Name -eq $Database.Name -and $_.Type -eq "D" } | Select-Object -ExpandProperty LastBackupDate $LastDiff = $Backup | Where-Object { $_.Name -eq $Database.Name -and $_.Type -eq "I" } | Select-Object -ExpandProperty LastBackupDate $LastBK = $null $LastBKDesc = $null $BackupState = "Success" If ($LastFull -gt $LastDiff) { $LastBKDesc = "$(Get-Date $LastFull -format "g") (Full)" $DaysSince = (New-TimeSpan -Start $LastFull -End (Get-Date)).Days If ((New-TimeSpan -Start $LastFull -End (Get-Date)).TotalDays -gt 1.5) { $BackupState = "Failed" } } ElseIf ($LastDiff) { $LastBKDesc = "$(Get-Date $LastDiff -format "g") (Diff)" $DaysSince = (New-TimeSpan -Start $LastDiff -End (Get-Date)).Days If ((New-TimeSpan -Start $LastDiff -End (Get-Date)).TotalHours -gt 36) { $BackupState = "Failed" } } Else { $BackupState = "Failed" $DaysSince = "Never" } [PSCustomObject]@{ Server = $db Database = If ($Database.Name.Length -gt 50) { $Database.Name.SubString(0,50) } Else { $Database.Name } "Recovery Model" = $Database.RecoveryModel "Last Backup" = $LastBKDesc "Last T-Log Backup" = $Backup | Where-Object { $_.Name -eq $Database.Name -and $_.Type -eq "L" } | Select-Object -ExpandProperty LastBackupDate "Backup Size" = Get-Size -Size ($Backup | Where-Object { $_.Name -eq $Database.Name -and $_.LastBackupDate -eq $LastBK } | Select-Object -ExpandProperty LastBackupSize) "Days Since Last Backup" = $DaysSince "Backup Status" = $BackupState