Estou usando o script de backup abaixo obtido do link http://www.ludovicocaldara.net/dba/sql-server-last-database-backup/ para auditar meus servidores em busca de backups. Isso funciona muito bem, exceto quando eu derramei backups.
Para backups divididos, ele fornece muitas linhas, dependendo do número. de arquivos de backup divididos. Por exemplo, se eu tiver 4 arquivos de backup COMPLETO divididos e 4 arquivos de backup diff divididos, isso fornecerá 16 linhas de saída. Isso é por causa do LEFT JOIN
usado. Preciso de ajuda para corrigir o script para remover todas as duplicatas e fornecer a saída correta. Por exemplo, ele deve fornecer apenas 4 arquivos de backup COMPLETO divididos e 4 arquivos de backup diff na saída.
WITH db
AS (SELECT [Instance] = @@SERVERNAME,
[Database] = name,
[RecoveryMode] = DATABASEPROPERTYEX(name, 'Recovery'),
[CreationTime] = crdate,
[Status] = DATABASEPROPERTYEX(name, 'Status')
FROM master..sysdatabases
WHERE name != 'tempdb'),
lastfull
AS (SELECT *
FROM
(
SELECT [Database] = s.database_name,
--[Type] = s.type,
[LastFullDate] = CONVERT( VARCHAR, s.backup_finish_date, 120),
--[LastFullSize] = s.backup_size,
[LastFullDevice] = f.physical_device_name,
--[LastFullDevTyp] = f.device_type,
[Nrank] = RANK() OVER(PARTITION BY s.database_name ORDER BY s.backup_finish_date DESC)
FROM msdb.dbo.backupset s,
msdb.dbo.backupmediafamily f
WHERE s.media_set_id = f.media_set_id
AND s.type = 'D'
-- and f.device_type = 7 -- only backup devices
) f
WHERE nrank = 1),
lastdiff
AS (SELECT *
FROM
(
SELECT [Database] = s.database_name,
--[Type] = s.type,
[LastDiffDate] = CONVERT( VARCHAR, s.backup_finish_date, 120),
--[LastDiffSize] = s.backup_size,
[LastDiffDevice] = f.physical_device_name,
--[LastDiffDevTyp] = f.device_type,
[Nrank] = RANK() OVER(PARTITION BY s.database_name ORDER BY s.backup_finish_date DESC)
FROM msdb.dbo.backupset s,
msdb.dbo.backupmediafamily f
WHERE s.media_set_id = f.media_set_id
AND s.type = 'I'
-- and f.device_type = 7 -- only backup devices
) d
WHERE nrank = 1),
lastlog
AS (SELECT *
FROM
(
SELECT [Database] = s.database_name,
--[Type] = s.type,
[LastLogDate] = CONVERT( VARCHAR, s.backup_finish_date, 120),
--[LastLogSize] = s.backup_size,
[LastLogDevice] = f.physical_device_name,
--[LastLogDevTyp] = f.device_type,
[Nrank] = RANK() OVER(PARTITION BY s.database_name ORDER BY s.backup_finish_date DESC)
FROM msdb.dbo.backupset s,
msdb.dbo.backupmediafamily f
WHERE s.media_set_id = f.media_set_id
AND s.type = 'L'
-- and f.device_type = 7 -- only backup devices
) l
WHERE nrank = 1)
SELECT db.[Instance] AS ServerName,
db.[Database] AS DatabaseName,
db.[RecoveryMode] AS ReconveyModel,
db.[CreationTime] AS DBCreationTime,
db.[Status] AS DatabaseStatus,
ISNULL(CONVERT( VARCHAR, lastfull.LastFullDate), 'Never') AS LastFullBackupDate,
ISNULL(lastfull.[LastFullDevice], 'None') AS LastFullBackupPath,
ISNULL(CONVERT( VARCHAR, lastdiff.LastDiffDate), 'Never') AS LastDiffBackupDate,
ISNULL(lastdiff.[LastDiffDevice], 'None') AS LastDiffBackupPath,
ISNULL(CONVERT( VARCHAR, lastlog.[LastLogDate]), 'Never') AS LastLogBackupDate,
ISNULL(lastlog.[LastLogDevice], 'None') AS LastLogBackupPath
FROM db
LEFT OUTER JOIN lastfull ON(db.[Database] = lastfull.[Database])
LEFT OUTER JOIN lastdiff ON(db.[Database] = lastdiff.[Database])
LEFT OUTER JOIN lastlog ON(db.[Database] = lastlog.[Database]);
Editar:
Digamos que estou fazendo meus backups Full e Diff conforme abaixo:
backup database AdventureWorks to disk =
'D:\MSSQL\AdventureWorks_1_041320161807.bak', disk =
'D:\MSSQL\AdventureWorks_2_041320161807.bak', disk =
'D:\MSSQL\AdventureWorks_3_041320161807.bak', disk =
'D:\MSSQL\AdventureWorks_4_041320161807.bak' with stats = 10;
backup database AdventureWorks
to disk = 'D:\MSSQL\AdventureWorks_1_041320161808.bak',
disk = 'D:\MSSQL\AdventureWorks_2_041320161808.bak',
disk = 'D:\MSSQL\AdventureWorks_3_041320161808.bak',
disk = 'D:\MSSQL\AdventureWorks_4_041320161808.bak'
with stats = 10, differential;
Com o script acima, estou obtendo o resultado abaixo. Observe que ele tem 16 linhas. 4*4.
O que eu preciso é que o script mostre a saída como 4 arquivos de backup completos e 4 arquivos de backup diferentes. Ou seja, apenas o número real do arquivo. Atualmente devido ao JOIN está dando 16 linhas. Por favor, deixe-me saber se você precisar de mais esclarecimentos.
Você precisa adicionar uma nova coluna às suas subconsultas para calcular o
ROW_NUMBER()
além doRANK()
, para que possa corresponder as linhas com o mesmoROW_NUMBER()
.Além disso, você precisa alterar o
LEFT JOIN
s paraFULL JOIN
s:alternativamente à resposta de spaghettidba , tenho usado este script, ele não possui tantas informações, mas pode ser adicionado se necessário.
parece ser mais rápido e você pode especificar se deseja que os backups completos ou de log sejam mostrados.
usei-o principalmente para descobrir essas perguntas: temos um backup, onde está, qual é o tamanho e quanto tempo geralmente leva para fazer o backup.