Eu tenho muitos servidores para gerenciar querer fazer isso manualmente em cada servidor, então gostaria de automatizar de alguma forma isso usando o módulo dbatools e a consulta abaixo para coletar as informações do conjunto de backup.
WITH BackupsSize AS(
SELECT TOP 1000
rn = ROW_NUMBER() OVER (ORDER BY DATEPART(year,[backup_start_date]) ASC, DATEPART(month,[backup_start_date]) ASC)
, [Year] = DATEPART(year,[backup_start_date])
, [Month] = DATEPART(month,[backup_start_date])
, [Backup Size GB] = CONVERT(DECIMAL(10,2),ROUND(AVG([backup_size]/1024/1024/1024),4))
, [Compressed Backup Size GB] = CONVERT(DECIMAL(10,2),ROUND(AVG([compressed_backup_size]/1024/1024/1024),4))
FROM
msdb.dbo.backupset
WHERE
[database_name] = N'A1000370D1'
AND [type] = 'D'
AND backup_start_date BETWEEN DATEADD(mm, - 13, GETDATE()) AND GETDATE()
GROUP BY
[database_name]
, DATEPART(yyyy,[backup_start_date])
, DATEPART(mm, [backup_start_date])
ORDER BY [Year],[Month])
--SECTION 1 END
--SECTION 2 BEGIN
SELECT
b.Year,
b.Month,
b.[Backup Size GB],
0 AS deltaNormal,
b.[Compressed Backup Size GB],
0 AS deltaCompressed
FROM BackupsSize b
WHERE b.rn = 1
UNION
SELECT
b.Year,
b.Month,
b.[Backup Size GB],
b.[Backup Size GB] - d.[Backup Size GB] AS deltaNormal,
b.[Compressed Backup Size GB],
b.[Compressed Backup Size GB] - d.[Compressed Backup Size GB] AS deltaCompressed
FROM BackupsSize b
CROSS APPLY (
SELECT bs.[Backup Size GB],bs.[Compressed Backup Size GB]
FROM BackupsSize bs
WHERE bs.rn = b.rn - 1
) AS d
Eu tenho uma lista de servidores sentados na tabela em um banco de dados e planejo carregar uma variável $sqlinstance com minha lista de instâncias usando invoke-dbaquery.
O que não tenho certeza e preciso de ajuda é como usar o script SQL acima para reunir os dados históricos de backup para todos os bancos de dados em todos os servidores de uma só vez. Como posso percorrer cada banco de dados enquanto também percorro minha lista de instâncias?
Você pode capturar tudo isso com
Get-DbaDbBackupHistory
fromdbatools
, sem necessidade de loops (ele faz um loop internamente).Você pode querer se aprofundar nas propriedades
Totalsize
eCompressedBackupSize
para obter o número bruto de MB ou GB sem formatação.Você deve ser capaz de gravar essa saída em uma tabela com
Write-DbaDbTableData
Se você precisar percorrer cada instância SQL e banco de dados um por um, esta é a abordagem que eu usaria:
No entanto, prefiro esta abordagem melhor:
Para obter mais informações, consulte os exemplos 3 e 4
Invoke-DbaQuery
no site de ajuda do dbatools