Сборка данных о бэкапах старше Х дней

Powershell Logo
При аудите серверов БД возникла необходимость проверить состояние бэкапов примерно на сотне серверов Microsoft SQL. Почесав затылок от перспективы «с пользой» провести массу времени, предпринял попытку вспомнить инструментарий который позволяет достичь поставленной задачи.

По первым линкам найденным в интернете выяснилось что некоторые продукты стоят денег, некоторые дают не ту информацию, некоторые дают совсем не ту информацию.

Выдохнул, включил в процесс голову и в процессе поисков наткнулся на SQL-скрипт для достижения нужного результата. Примерно за пять минут дописал к нему обертку из powershell-а и вот что получилось.

# get-backup-statistics.ps1

# получаем список серверов из заранее приготовленного файла
$servers = get-content servers.txt

foreach ($server in $servers) {
Write-Output "======"
Write-Output $server
# создаем соединение
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
# задаем строку соединения
$SqlConnection.ConnectionString = "Server=$($server);Database=master;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand

# сам запрос
$SqlCmd.CommandText = "SELECT database_name = sd.name, backup_finish_date, type
FROM master.dbo.sysdatabases sd LEFT OUTER JOIN (
SELECT bs.database_name, backup_finish_date, type = case type WHEN ‘D’ THEN ‘Database’
WHEN ‘I’ THEN ‘Database Differential’
WHEN ‘L’ THEN ‘Log’
WHEN ‘F’ THEN ‘File or Filegroup’
end, backup_size
FROM msdb.dbo.backupset bs, (
SELECT database_name,max_backup_finish_date = max(backup_finish_date)
FROM msdb.dbo.backupset group by database_name) bs1
WHERE bs.database_name = bs1.database_name
AND bs.backup_finish_date = bs1.max_backup_finish_date ) bs3
ON bs3.database_name = sd.name
WHERE sd.name NOT IN (‘tempdb’)
AND (backup_finish_date < getdate() -7 or backup_finish_date IS NULL
)
ORDER BY sd.name ASC, backup_finish_date DESC"

$SqlCmd.Connection = $SqlConnection

$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd

$DataSet = New-Object System.Data.DataSet

$SqlAdapter.Fill($DataSet)

$SqlConnection.Close()
$DataSet.Tables[0]
}

В приведенном примере из файла servers.txt берется список серверов БД и к ним выполняется запрос на получения списка баз данных для которых не выполнялись бэкапы более семи дней.

Буду благодарен, если поделитесь этой статьей:

Приглашаю присоединиться ко мне в следующих сервисах:
facebook Google Plus вКонтакте Twitter
Если Вам понравилась статья, то вы можете подписаться на RSS. А также бесплатно подписаться по E-mail и получать актуальную информацию в числе первых.
Получать обновления на email

Вы можете оставить комментарий.

Добавить комментарий

XHTML: Вы можете использовать тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>