指定した復元日からのバックアップファイルリストをSQLで取得したい
1. ソース > データベースを指定したとき
2. 復元先 > タイムラインから特定の日付と時刻でジャンプしたとき
スクリプト > 新しいクエリエディターウィンドウでクエリを生成すると、既に取得したバックアップリストの一覧をベタ書きしたRESTOREコマンドができる
そうじゃなくて、どうやってリストアップしたかが知りたい
クエリには出てきてないように見える
こっちには記録されていそう
繋がりがまだ理解できていない
これで指定した日付以降にとった完全バックアップから最新のログチェーンを引っ張ってくることはできた
code:sql
/* これだと指定した日付以降にとった完全バックアップから最新のログチェーンを引っ張ってくるになる… */
with oldestfullbackuplsn(backup_log_chain_lsn) as (
select
min(bs.first_lsn)
from
msdb.dbo.backupset as bs
where
/* D:完全バックアップ */
bs.type = 'D'
/* データベース名(指定する) */
and bs.database_name = 'msdb'
/* バックアップ日(指定する) */
and bs.backup_start_date >= '2023-08-19 0:00:00'
)
, latestdiffbackuplsn(latest_checkpoint_lsn) as (
select
max(bs.checkpoint_lsn)
from
msdb.dbo.backupset as bs
right join oldestfullbackuplsn as ol
on ol.backup_log_chain_lsn is not null
and bs.database_backup_lsn = ol.backup_log_chain_lsn
where
/* I:差分バックアップ */
bs.type = 'I'
)
select
bs.backup_start_date
, backup_type = case
when bs.type = 'D'
and bs.is_copy_only = 0
then '完全バックアップ'
when bs.type = 'D'
and bs.is_copy_only = 1
then '完全(Copy Only)'
when bs.type = 'I'
then '差分バックアップ'
when bs.type = 'L'
then 'ログバックアップ'
else bs.type
end
, bs.database_name
, bs.name
, bmf.physical_device_name
, ol.backup_log_chain_lsn
, ll.latest_checkpoint_lsn
from
msdb.dbo.backupset as bs
left join msdb.dbo.backupfile as bf
on bs.backup_set_id = bf.backup_set_id
left join msdb.dbo.backupfilegroup as bfg
on bs.backup_set_id = bfg.backup_set_id
left join msdb.dbo.backupmediafamily as bmf
on bs.media_set_id = bmf.media_set_id
left join latestdiffbackuplsn as ll
on bs.checkpoint_lsn >= ll.latest_checkpoint_lsn
right join oldestfullbackuplsn as ol
on ol.backup_log_chain_lsn is not null
and (
(
bs.type = 'D'
and bs.first_lsn = ol.backup_log_chain_lsn
)
or (
bs.type = 'I'
and bs.first_lsn = ll.latest_checkpoint_lsn
)
or (
bs.type = 'L'
and bs.database_backup_lsn = ol.backup_log_chain_lsn
and bs.checkpoint_lsn >= ll.latest_checkpoint_lsn
)
)
where
bf.file_type = 'D'
order by
bs.backup_start_date asc
;