Nossa equipe de DBA não verifica os backups usando o seguinte TSQL
(o que pode ser feito facilmente após o backup e quase não leva tempo, então não entendo por que não):
RESTORE VERIFYONLY
FROM DISK = 'D:\Backups\LOCATION'
Eles tiveram problemas no passado, então, embora pensássemos que eles aprenderiam com isso, eles não aprenderam. Criei um script Powershell para fazer isso porque temos mais de 100 servidores e só quero executar esse script em todos os backups apenas para garantir que sejam válidos. O script abaixo é executado corretamente (na medida em que não quebra ou lança erros), estou curioso para saber se há uma maneira de obter a mensagem impressa de volta no Powershell que normalmente receberíamos no SSMS, onde afirma O backup definido no arquivo 1 é válido como verificação.
$SqlCon = New-Object System.Data.SqlClient.SqlConnection
$SqlCon.ConnectionString = "SERVER=SERV\INST;Integrated Security=true;DATABASE=master"
$baks = Get-ChildItem "D:\Backups\" -Filter *.BAK
foreach ($bak in $baks)
{
$SqlCon.Open()
$cd = New-Object System.Data.SqlClient.SqlCommand
$cd.Connection = $SqlCon
$cd.CommandText = "RESTORE VERIFYONLY FROM DISK = @f"
$cd.Parameters.Add("@f", $bak.FullName)
$cd.ExecuteNonQuery()
$SqlCon.Close()
}
Capturando a saída de InfoMessage (PRINT, RAISERROR) do SQL Server usando o PowerShell
O truque, como aponta Jonathan, é que você precisa ter um ouvinte conectado ao gerenciador de conexões para ouvir as ações de impressão ou erro.
Eu também canalizei a saída de adicionar um parâmetro
Out-Null
, pois era um ruído que eu não precisava.