powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите написать запрос
3 сообщений из 3, страница 1 из 1
Помогите написать запрос
    #39970008
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,

Мне нужно создать список всех файлов бекапов баз на сервере, начиная с последнего полного, затем последнего differential (если он существует) и всех бекапов логов, которые произошли с последнего differential (если он существует) или с последнего полного ( (если differential не существует).

Вот что у меня получилось (ниже). Проблема с неопределенностью differential бекапа. У некоторых баз он может быть, а у некоторых нет. Если последний юнион соединять с полным бекапом, то получится куча ненужных бекапов логов. Если с differential бекапом и он отсутствует, вообще ничего путного не получится.

Запрос ниже также не предусматривает ситуации, когда differential бекап существует, но он раньше полного.

Как мне обойти эту неопределенность в запросе?

Спасибо.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
declare @last_full_backup table (database_name sysname, last_lsn numeric(25,0))  
declare @last_diff_backup table (database_name sysname, last_lsn numeric(25,0))  

declare @hostname sysname, @groupid int =14 
select @hostname = '\\' + substring(@@SERVERNAME, 1, CHARINDEX('\', @@SERVERNAME)-1) + '\X$\'

insert into @last_full_backup (database_name, last_lsn)
select database_name, MAX(last_lsn) 
from msdb.dbo.backupset b 
INNER JOIN msdb.dbo.backupmediafamily m ON b.media_set_id = m.media_set_id
where type = 'D'  and is_copy_only = 0 
group by database_name
order by database_name

insert into @last_diff_backup (database_name, last_lsn)
select database_name, MAX(last_lsn) 
from msdb.dbo.backupset b 
INNER JOIN msdb.dbo.backupmediafamily m ON b.media_set_id = m.media_set_id
where type = 'I'  and is_copy_only = 0 
group by database_name
order by database_name


select @@servername as ServerName, @groupid as DBGroupID, b.database_name as DBName, type as [BackupType], b.backup_finish_date, REPLACE(m.physical_device_name, 'X:\', @hostname)
from msdb.dbo.backupset b 
INNER JOIN msdb.dbo.backupmediafamily m ON b.media_set_id = m.media_set_id
join @last_full_backup lfb
on b.last_lsn = lfb.last_lsn and b.database_name = lfb.database_name
where type = 'D' and is_copy_only = 0
union
select @@servername as ServerName, @groupid as DBGroupID, b.database_name as DBName, type as [BackupType], b.backup_finish_date, REPLACE(m.physical_device_name, 'X:\', @hostname)
from msdb.dbo.backupset b 
INNER JOIN msdb.dbo.backupmediafamily m ON b.media_set_id = m.media_set_id
join @last_diff_backup lfb
on b.last_lsn = lfb.last_lsn and b.database_name = lfb.database_name
where type = 'I' and is_copy_only = 0
union
select @@servername as ServerName, @groupid as DBGroupID, b.database_name as DBName, type as [BackupType], b.backup_finish_date, REPLACE(m.physical_device_name, 'X:\', @hostname)
from msdb.dbo.backupset b 
INNER JOIN msdb.dbo.backupmediafamily m ON b.media_set_id = m.media_set_id
join @last_full_backup lfb
on b.database_name = lfb.database_name
where b.last_lsn >= lfb.last_lsn  and type = 'L' and is_copy_only = 0
order by backup_finish_date 
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39970029
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну чем тебя можно утешить?
Дифференциальные бякапы БЕСПОЛЕЗНЫ для восстановления журнала.
Журнал восстанавливается от полного бякапа.

Поэтому суп отдельно и мухи отдельно.

Но если желание неизбывно...

1. Список ВСЕХ полных, дифф., логов в порядке следования
полн1
лог1
дифф1
дифф2
лог3
лог4
дифф3
лог5
лог6
полн2

2. Нумеруем все по-порядку

1 полн1
2 лог1
3 дифф1
4 лог2
5 дифф2
5 лог3
7 лог4
8 дифф3
9 лог5
10 лог6
11 полн2

4. Выбираем все полные
5. Выбираем для каждого полного 1 дифф с максимальным номером, но меньшим полного. Если такого нет - выбираем номер полного.
6. Выбираем для каждого полного ВСЕ лог с номером меньше номера полного и больше номера дифф.
...
Рейтинг: 0 / 0
Помогите написать запрос
    #39970078
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222Дифференциальные бякапы БЕСПОЛЕЗНЫ для восстановления журнала.
Журнал восстанавливается от полного бякапа.С чего бы это? Бэкапы лога отлично применяются после восстановления диф-бэкапа.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите написать запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]