# バッチ設計書 7-sp_BlitzBackups

## 概要

本ドキュメントは、SQL Server First Responder Kitに含まれるsp_BlitzBackupsストアドプロシージャのバッチ設計書です。sp_BlitzBackupsはバックアップ履歴を分析し、データ損失リスクとリカバリ時間を評価するツールです。

### 本バッチの処理概要

sp_BlitzBackupsは、msdb.dbo.backupsetのバックアップ履歴を分析し、RPO（Recovery Point Objective：目標復旧時点）とRTO（Recovery Time Objective：目標復旧時間）の観点からバックアップ戦略を評価するストアドプロシージャです。

**業務上の目的・背景**：災害復旧計画において、「どれだけのデータを失う可能性があるか（RPO）」と「復旧にどれだけ時間がかかるか（RTO）」は最も重要な指標です。sp_BlitzBackupsは、実際のバックアップ履歴から最悪ケースのRPOとRTOを計算し、バックアップ戦略の問題点を可視化します。これにより、DBAはバックアップ頻度やバックアップ速度の改善が必要な箇所を特定できます。

**バッチの実行タイミング**：随時実行。定期的なバックアップ戦略レビュー、新しいバックアップポリシー導入後の検証、DR計画の策定時に実行されます。

**主要な処理内容**：
1. msdb.dbo.backupsetからバックアップ履歴を取得
2. データベースごとのバックアップ速度（Full/Diff/Log）を計算
3. バックアップ間のギャップ（RPO最悪ケース）を特定
4. 復旧に必要なファイルサイズと時間（RTO最悪ケース）を計算
5. バックアップサイズのトレンド分析
6. 警告の生成（欠落バックアップ、遅いバックアップ等）
7. 結果の出力

**前後の処理との関連**：sp_Blitzのバックアップチェック結果から詳細分析が必要な場合に使用されます。AG環境ではリスナーへの履歴プッシュ機能も提供します。

**影響範囲**：読み取り専用の診断ツールです。msdb.dbo.backupsetからデータを読み取るのみで、バックアップ設定や履歴を変更しません。

## バッチ種別

診断・分析

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時/週次 |
| 実行時刻 | 任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| SQL Serverバージョン | SQL Server 2008以降 |
| 必要権限 | msdb.dbo.backupsetへの読み取り権限 |
| 依存オブジェクト | なし |

### 実行可否判定

- @MSDBNameで指定されたデータベースが存在すること

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| @Help | TINYINT | No | 0 | ヘルプ表示 |
| @HoursBack | INT | No | 168 | 分析対象期間（時間）※デフォルト7日間 |
| @MSDBName | NVARCHAR(256) | No | 'msdb' | バックアップ履歴のあるDB |
| @AGName | NVARCHAR(256) | No | NULL | 可用性グループ名 |
| @RestoreSpeedFullMBps | INT | No | NULL | フル復元速度（MB/s） |
| @RestoreSpeedDiffMBps | INT | No | NULL | 差分復元速度（MB/s） |
| @RestoreSpeedLogMBps | INT | No | NULL | ログ復元速度（MB/s） |
| @Debug | TINYINT | No | 0 | デバッグモード |
| @PushBackupHistoryToListener | BIT | No | 0 | リスナーに履歴をプッシュ |
| @WriteBackupsToListenerName | NVARCHAR(256) | No | NULL | 書き込み先リスナー名 |
| @WriteBackupsToDatabaseName | NVARCHAR(256) | No | NULL | 書き込み先DB名 |
| @WriteBackupsLastHours | INT | No | 168 | 書き込み対象期間 |
| @Version | VARCHAR(30) | No | NULL | バージョン（OUTPUT） |
| @VersionDate | DATETIME | No | NULL | バージョン日付（OUTPUT） |
| @VersionCheckMode | BIT | No | 0 | バージョンチェックモード |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| msdb.dbo.backupset | テーブル | バックアップ履歴 |
| msdb.dbo.backupmediafamily | テーブル | バックアップメディア情報 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 結果セット1 | TABLE | RPO/RTO分析結果 |
| 結果セット2 | TABLE | バックアップ速度統計 |
| 結果セット3 | TABLE | リカバリ可能性分析 |
| 結果セット4 | TABLE | トレンド分析 |
| 結果セット5 | TABLE | 警告一覧 |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | 該当なし |
| 出力先 | 画面出力 |
| 文字コード | UTF-16 |
| 区切り文字 | 該当なし |

主要な出力カラム:
- database_name, RPOWorstCaseMinutes, RTOWorstCaseMinutes
- FullMBpsAvg, DiffMBpsAvg, LogMBpsAvg
- FullSizeMBAvg, DiffSizeMBAvg, LogSizeMBAvg

## 処理フロー

### 処理シーケンス

```
1. パラメータ検証
   └─ @MSDBName存在チェック、時間パラメータ調整
2. バックアップ統計収集
   └─ Full/Diff/Log別の速度・サイズ統計
3. RPO最悪ケース計算
   └─ バックアップ間の最大ギャップ特定
4. RTO最悪ケース計算
   └─ 復旧に必要な総ファイルサイズと時間
5. リカバリ可能性分析
   └─ 最初/最後のフルバックアップ、平均スループット
6. トレンド分析
   └─ 過去12期間のサイズ推移
7. 警告生成
   └─ 問題パターンの検出
8. 結果出力
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[パラメータ検証]
    B --> C{@MSDBName存在?}
    C -->|No| D[エラー終了]
    C -->|Yes| E[バックアップ統計収集]
    E --> F[RPO最悪ケース計算]
    F --> G[RTO最悪ケース計算]
    G --> H[リカバリ可能性分析]
    H --> I[トレンド分析]
    I --> J[警告生成]
    J --> K{@PushBackupHistory?}
    K -->|Yes| L[リスナーにプッシュ]
    K -->|No| M[結果出力]
    L --> M
    M --> N[バッチ終了]
```

## データベース操作仕様

### 操作別データベース影響一覧

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 履歴取得 | msdb.dbo.backupset | SELECT | バックアップ履歴 |
| 履歴取得 | msdb.dbo.backupmediafamily | SELECT | メディア情報 |

### テーブル別操作詳細

#### #Backups（一時テーブル）

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| INSERT | 統計情報 | backupsetからの集計 | DB/タイプ別統計 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | データベースエラー | @MSDBNameが存在しない | 正しいDB名を指定 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0 |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

### 障害時対応

- msdbへのアクセス権限を確認

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | READ UNCOMMITTED |
| コミットタイミング | 明示的管理なし |
| ロールバック条件 | 該当なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | バックアップ履歴レコード数 |
| 目標処理時間 | 数秒〜数分 |
| メモリ使用量上限 | 環境依存 |

## 排他制御

- 読み取り専用のため排他制御不要

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 進捗ログ | 各ステップ | 'Inserting to #Backups'等 |
| デバッグログ | @Debug=1時 | 実行SQL文 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 該当なし | - | - |

## 備考

- バージョン: 8.29（2026年2月3日）
- ライセンス: MIT License
- 特記事項:
  - @HoursBack=168（7日間）がデフォルト
  - @RestoreSpeed*パラメータで復元速度をオーバーライド可能
  - @PushBackupHistoryToListener=1でAGリスナーに履歴をプッシュ
  - IsBigDiff/IsBigLogフラグで大きな差分/ログを警告
