# 帳票設計書 7-sp_BlitzBackups

## 概要

本ドキュメントは、SQL Server First Responder Kitのsp_BlitzBackupsストアドプロシージャが出力するバックアップ分析帳票の設計を記述する。

### 本帳票の処理概要

sp_BlitzBackupsは、バックアップ履歴からRPO（目標復旧時点）とRTO（目標復旧時間）を推定し、データ損失リスクを分析するストアドプロシージャである。msdbのbackupsetテーブルを基に、バックアップの頻度、サイズ、スループット、およびリカバリ時間を計算し、潜在的な問題を特定する。

**業務上の目的・背景**：バックアップはデータ保護の最後の砦であり、適切なバックアップ戦略は事業継続に不可欠である。本帳票は、DBAがバックアップの健全性を評価し、RPO/RTO要件を満たしているかを確認することを目的としている。バックアップギャップの検出やリカバリ時間の見積もりにより、災害対策計画の改善に貢献する。

**帳票の利用シーン**：
- バックアップ戦略の定期レビュー
- DR（災害対策）計画の策定
- SLA要件の検証
- バックアップ問題の調査
- 容量計画とコスト分析

**主要な出力内容**：
1. RPOWorstCaseMinutes：最悪ケースの目標復旧時点（分）
2. RTOWorstCaseMinutes：最悪ケースの目標復旧時間（分）
3. FullMBpsAvg/Min/Max：フルバックアップのスループット
4. DiffMBpsAvg/Min/Max：差分バックアップのスループット
5. LogMBpsAvg/Min/Max：ログバックアップのスループット
6. バックアップギャップの検出
7. バックアップトレンド（過去12ヶ月）

**帳票の出力タイミング**：
- ストアドプロシージャ `EXEC sp_BlitzBackups` の手動実行時
- SQL Server Agentジョブによる定期実行時
- DR訓練時の事前確認

**帳票の利用者**：
- データベース管理者（DBA）
- ITインフラ管理者
- 事業継続計画担当者
- コンプライアンス担当者

## 帳票種別

バックアップ分析レポート / RPO/RTO評価帳票

## 利用画面

| 画面No | 画面名 | URL/ルーティング | 出力操作 |
|--------|--------|-----------------|---------|
| N/A | SQL Server Management Studio | N/A | `EXEC sp_BlitzBackups` 実行 |
| N/A | Azure Data Studio | N/A | `EXEC sp_BlitzBackups` 実行 |
| N/A | コマンドライン | sqlcmd | スクリプト実行 |

## 出力形式

### 基本仕様

| 項目 | 内容 |
|-----|------|
| ファイル形式 | 複数結果セット |
| 用紙サイズ | N/A（結果セットとして出力） |
| 向き | N/A |
| ファイル名 | N/A |
| 出力方法 | 結果セット返却 |
| 文字コード | NVARCHAR（Unicode） |

### 出力結果セット構成

| 結果セット | 説明 |
|------------|------|
| 1 | バックアップサマリー（RPO/RTO/スループット） |
| 2 | 回復可能性分析 |
| 3 | バックアップトレンド（過去12ヶ月） |
| 4 | 警告一覧 |

## 帳票レイアウト

### レイアウト概要

```
┌─────────────────────────────────────────────────────────────────────────────┐
│  結果セット1: バックアップサマリー                                           │
├─────────────────────────────────────────────────────────────────────────────┤
│  database_name | RPOWorstCase | RTOWorstCase | FullMBpsAvg | DiffMBpsAvg | │
│  ------------- | ------------ | ------------ | ----------- | ----------- | │
│  UserDB        | 120 min      | 45 min       | 150 MB/s    | 200 MB/s    | │
│  ReportDB      | 60 min       | 30 min       | 180 MB/s    | 220 MB/s    | │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────────┐
│  結果セット4: 警告一覧                                                       │
├─────────────────────────────────────────────────────────────────────────────┤
│  CheckId | Priority | DatabaseName | Finding | Warning                       │
└─────────────────────────────────────────────────────────────────────────────┘
```

### 出力カラム詳細（バックアップサマリー）

| No | 項目名 | 説明 | データ型 | 表示形式 |
|----|-------|------|----------|---------|
| 1 | database_name | データベース名 | NVARCHAR(128) | テキスト |
| 2 | database_guid | データベースGUID | UNIQUEIDENTIFIER | GUID |
| 3 | RPOWorstCaseMinutes | 最悪RPO（分） | DECIMAL(18,1) | 数値 |
| 4 | RTOWorstCaseMinutes | 最悪RTO（分） | DECIMAL(18,1) | 数値 |
| 5 | FullMBpsAvg | フルバックアップ平均MB/s | DECIMAL(18,2) | 数値 |
| 6 | FullMBpsMin | フルバックアップ最小MB/s | DECIMAL(18,2) | 数値 |
| 7 | FullMBpsMax | フルバックアップ最大MB/s | DECIMAL(18,2) | 数値 |
| 8 | FullSizeMBAvg | フルバックアップ平均サイズ | DECIMAL(18,2) | MB |
| 9 | DiffMBpsAvg | 差分バックアップ平均MB/s | DECIMAL(18,2) | 数値 |
| 10 | LogMBpsAvg | ログバックアップ平均MB/s | DECIMAL(18,2) | 数値 |
| 11 | RPOWorstCaseMoreInfoQuery | 詳細クエリ | XML | XML |
| 12 | RTOWorstCaseMoreInfoQuery | 詳細クエリ | XML | XML |

### 警告カラム詳細

| No | 項目名 | 説明 | データ型 |
|----|-------|------|----------|
| 1 | CheckId | チェックID | INT |
| 2 | Priority | 優先度 | INT |
| 3 | DatabaseName | データベース名 | NVARCHAR(128) |
| 4 | Finding | 検出内容 | VARCHAR(256) |
| 5 | Warning | 警告メッセージ | VARCHAR(8000) |

## 出力条件

### 入力パラメータ

| パラメータ名 | データ型 | デフォルト値 | 説明 |
|-------------|----------|-------------|------|
| @Help | TINYINT | 0 | 1でヘルプ表示 |
| @HoursBack | INT | 168 | 何時間前までのデータを分析（168=7日） |
| @MSDBName | NVARCHAR(256) | 'msdb' | バックアップ履歴のDB名 |
| @AGName | NVARCHAR(256) | NULL | 可用性グループ名 |
| @RestoreSpeedFullMBps | INT | NULL | フル復元速度（MB/s）オーバーライド |
| @RestoreSpeedDiffMBps | INT | NULL | 差分復元速度（MB/s）オーバーライド |
| @RestoreSpeedLogMBps | INT | NULL | ログ復元速度（MB/s）オーバーライド |
| @Debug | TINYINT | 0 | デバッグモード |
| @PushBackupHistoryToListener | BIT | 0 | リスナーへのプッシュ |
| @WriteBackupsToListenerName | NVARCHAR(256) | NULL | 書き込み先リスナー名 |
| @WriteBackupsToDatabaseName | NVARCHAR(256) | NULL | 書き込み先DB名 |
| @WriteBackupsLastHours | INT | 168 | 書き込み対象時間 |

### ソート順

| 優先度 | 項目 | 昇順/降順 |
|-------|------|---------|
| 1 | RPOWorstCaseMinutes | 降順（最も問題のあるDB優先） |

### 改ページ条件

結果セットのため改ページなし。

## データベース参照仕様

### 参照テーブル一覧

| テーブル名 | 用途 | 結合条件 |
|-----------|------|---------|
| msdb.dbo.backupset | バックアップ履歴 | database_name, database_guid |
| msdb.dbo.backupmediafamily | メディア情報 | media_set_id |
| sys.databases | データベース一覧 | name |

### テーブル別参照項目詳細

#### msdb.dbo.backupset

| 参照項目（カラム名） | 帳票項目との対応 | 取得条件 | 備考 |
|-------------------|----------------|---------|------|
| database_name | database_name | - | データベース名 |
| database_guid | database_guid | - | データベース識別子 |
| type | backup_type | D/I/L | フル/差分/ログ |
| backup_size | FullSizeMBAvg等 | - | バイト単位 |
| compressed_backup_size | CompressedSizeMBAvg等 | - | 圧縮後サイズ |
| backup_start_date | 計算用 | - | 開始時刻 |
| backup_finish_date | 計算用 | - | 終了時刻 |
| first_lsn | LSN計算 | - | 開始LSN |
| last_lsn | LSN計算 | - | 終了LSN |

## 計算仕様

### 計算項目一覧

| 項目名 | 計算式 | 端数処理 | 備考 |
|-------|-------|---------|------|
| MBps | backup_size / DATEDIFF(ss, start, finish) / 1048576 | 整数 | スループット |
| RPOWorstCaseMinutes | MAX(backup_gap_seconds) / 60 | 小数点以下1桁 | 最大バックアップギャップ |
| RTOWorstCaseMinutes | (full_size + diff_size + log_size) / restore_speed / 60 | 小数点以下1桁 | 復元時間推定 |

## 処理フロー

### 出力フロー

```mermaid
flowchart TD
    A[sp_BlitzBackups実行] --> B{@Help = 1?}
    B -->|Yes| C[ヘルプ表示して終了]
    B -->|No| D{@MSDBName存在確認}
    D -->|No| E[エラー: MSDB不存在]
    D -->|Yes| F{@PushBackupHistoryToListener?}
    F -->|Yes| G[リスナーへプッシュ処理]
    F -->|No| H[#Backups一時テーブル作成]
    H --> I[バックアップ履歴取得]
    I --> J[スループット計算]
    J --> K[RPO計算（バックアップギャップ）]
    K --> L[RTO計算（復元時間推定）]
    L --> M[#Warnings生成]
    M --> N[#Trending生成]
    N --> O[結果セット出力]
    O --> P[終了]
    G --> P
```

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 表示メッセージ | 対処方法 |
|----------|---------|--------------|---------|
| MSDB不存在 | @MSDBNameが存在しない | @MSDBName was specified, but the database does not exist | 正しいDB名を指定 |
| バックアップなし | 対象期間にバックアップがない | （警告として出力） | バックアップ設定を確認 |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定データ件数 | データベース数 × バックアップ頻度 |
| 目標出力時間 | 30秒以内（7日間のデータ） |
| 同時出力数上限 | 制限なし |

## セキュリティ考慮事項

- msdbデータベースへの読み取りアクセスが必要
- バックアップパス情報が出力される可能性あり
- データベース名一覧が出力される

## 備考

- バージョン: 8.29（2026年2月3日リリース）
- ライセンス: MIT License
- 公式サイト: http://FirstResponderKit.org
- 可用性グループ環境対応

---

## コードリーディングガイド

本帳票を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

まず、分析結果を格納する一時テーブルの構造を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_BlitzBackups.sql | `sp_BlitzBackups.sql` | 行124-165: #Backups一時テーブル定義 |
| 1-2 | sp_BlitzBackups.sql | `sp_BlitzBackups.sql` | 行167-190: #RTORecoveryPoints定義 |
| 1-3 | sp_BlitzBackups.sql | `sp_BlitzBackups.sql` | 行192-213: #Recoverability定義 |
| 1-4 | sp_BlitzBackups.sql | `sp_BlitzBackups.sql` | 行235-243: #Warnings定義 |

**読解のコツ**: RPO/RTO計算に必要なカラムと計算カラム（AS句）を確認すること。

#### Step 2: エントリーポイントを理解する

処理の起点となるストアドプロシージャのシグネチャとパラメータを確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_BlitzBackups.sql | `sp_BlitzBackups.sql` | 行4-20: ALTER PROCEDUREとパラメータ定義 |

**主要処理フロー**:
1. **行27**: バージョン情報の設定
2. **行34-97**: @Help=1の場合のヘルプ出力
3. **行255-315**: バックアップデータ取得SQL

#### Step 3: RPO/RTO計算を理解する

最悪ケースのRPO/RTO計算ロジックを確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sp_BlitzBackups.sql | `sp_BlitzBackups.sql` | 行318-361: RPO計算（バックアップギャップ） |
| 3-2 | sp_BlitzBackups.sql | `sp_BlitzBackups.sql` | 行376-431: RTO計算（復元時間推定） |

### プログラム呼び出し階層図

```
sp_BlitzBackups (エントリーポイント)
    │
    ├─ パラメータヘルプ表示 (@Help = 1)
    │
    ├─ MSDB存在確認
    │
    ├─ リスナープッシュ処理（@PushBackupHistoryToListener = 1時）
    │
    └─ メイン分析処理
           ├─ 一時テーブル作成
           │      ├─ #Backups
           │      ├─ #RTORecoveryPoints
           │      ├─ #Recoverability
           │      ├─ #Trending
           │      └─ #Warnings
           │
           ├─ バックアップ履歴取得
           │      └─ msdb.dbo.backupset
           │
           ├─ スループット計算
           │
           ├─ RPO計算（バックアップギャップ検出）
           │
           ├─ RTO計算（復元時間推定）
           │
           ├─ 警告生成
           │
           └─ 結果出力
```

### データフロー図

```
[入力]                         [処理]                         [出力]

@HoursBack指定 ──────────▶ sp_BlitzBackups ──────▶ バックアップサマリー
                               │                        │
msdb.dbo.backupset ◀───────────┤                        ├──▶ 回復可能性分析
                               │                        │
@RestoreSpeed* ◀───────────────┤                        ├──▶ トレンド
                               │                        │
                               │                        └──▶ 警告一覧
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sp_BlitzBackups.sql | `sp_BlitzBackups.sql` | ソース | メインストアドプロシージャ |
| Install-All-Scripts.sql | `Install-All-Scripts.sql` | スクリプト | 全スクリプトのインストール |
