Nasz zespół DBA nie weryfikuje kopii zapasowych za pomocą poniższych TSQL
(które można łatwo wykonać po utworzeniu kopii zapasowej i nie zajmuje prawie czasu, więc nie rozumiem, dlaczego nie):
RESTORE VERIFYONLY
FROM DISK = 'D:\Backups\LOCATION'
W przeszłości mieli problemy, więc nawet gdybyśmy myśleli, że się z tego wyciągną, nie zrobią tego. Stworzyłem skrypt Powershell, aby to zrobić, ponieważ mamy około 100 serwerów i chcę uruchomić ten skrypt na wszystkich kopiach zapasowych, aby upewnić się, że są one prawidłowe. Poniższy skrypt działa poprawnie (w tym sensie, że nie psuje się ani nie rzuca błędów), jestem ciekawy, czy istnieje sposób na odzyskanie wydrukowanej wiadomości w Powershell, którą normalnie otrzymalibyśmy w SSMS, tam gdzie jest napisane, że zestaw kopii zapasowych w pliku 1 to ważny jako weryfikacja.
$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()
}
źródło
invoke-sqlcmd -verbose
?Invoke-SqlCmd ... -Verbose
jest również przydatny, jeśli chcesz przekierować dane wyjściowe do późniejszego wykorzystania, zamiast po prostu wydrukować je natychmiast na hoście.Odpowiedzi:
Przechwytywanie danych wyjściowych InfoMessage (PRINT, RAISERROR) z SQL Server za pomocą PowerShell
Sztuczka, jak zauważa Jonathan, polega na tym, że do menedżera połączeń musi być podłączony odbiornik nasłuchujący działań drukowania lub błędów.
Potokowałem również wyjście dodawania parametru,
Out-Null
ponieważ to był hałas, którego nie potrzebowałem.źródło