# 機能設計書 39-Get-DbaLastBackup

## 概要

本ドキュメントは、dbatools PowerShellモジュールの`Get-DbaLastBackup`コマンドレットに関する機能設計書です。このコマンドは、データベースバックアップコンプライアンス監視のために、最終バックアップ日時を取得します。

### 本機能の処理概要

Get-DbaLastBackupは、msdbバックアップ履歴をクエリして、各データベースの最新のフル、差分、トランザクションログバックアップ日時を取得します。DBAが迅速にバックアップギャップを特定し、バックアップポリシーへのコンプライアンスを検証できるよう、各バックアップタイプの最終実行日時を表示します。

**業務上の目的・背景**：バックアップポリシーへのコンプライアンス確認は、データ保護の基本です。この機能により、各データベースの最終バックアップ日時を一覧で確認し、バックアップが期待通りに実行されているか、保持ポリシーを満たしているかを迅速に把握できます。

**機能の利用シーン**：
- バックアップコンプライアンスの日次/週次監視
- バックアップ問題の早期発見と対応
- SLAレポート作成のためのバックアップ状況確認
- 新規データベースのバックアップ未実施検出

**主要な処理内容**：
1. 指定されたSQL Serverインスタンスへの接続
2. Get-DbaDbBackupHistoryによる最終フル/差分/ログバックアップ取得
3. 各バックアップタイプの最終日時とコピーオンリーフラグの抽出
4. 経過時間とステータスの計算
5. 結果のPSCustomObject構築と出力

**関連システム・外部連携**：
- Get-DbaDbBackupHistory（バックアップ履歴取得の基盤）

**権限による制御**：msdbへの読み取りアクセス権限が必要です。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 22 | バックアップ履歴 | 補助機能 | 最終バックアップ日時の取得 |

## 機能種別

データ取得処理 / 監視クエリ

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | Yes | SQL Serverインスタンス（複数可） | パイプライン入力対応 |
| SqlCredential | PSCredential | No | 接続資格情報 | - |
| Database | object[] | No | 対象データベース | ワイルドカード対応 |
| ExcludeDatabase | object[] | No | 除外データベース | - |
| EnableException | switch | No | 例外処理を有効化 | - |

### 入力データソース

- msdb.dbo.backupset（Get-DbaDbBackupHistory経由）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverホスト名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全インスタンス名 |
| Database | string | データベース名 |
| RecoveryModel | string | リカバリモデル |
| LastFullBackup | DbaDateTime | 最終フルバックアップ日時 |
| LastDiffBackup | DbaDateTime | 最終差分バックアップ日時 |
| LastLogBackup | DbaDateTime | 最終ログバックアップ日時 |
| SinceFull | DbaTimeSpan | フルバックアップからの経過時間 |
| SinceDiff | DbaTimeSpan | 差分バックアップからの経過時間 |
| SinceLog | DbaTimeSpan | ログバックアップからの経過時間 |
| LastFullBackupIsCopyOnly | bool | 最終フルバックアップがコピーオンリーか |
| LastDiffBackupIsCopyOnly | bool | 最終差分バックアップがコピーオンリーか（常にfalse） |
| LastLogBackupIsCopyOnly | bool | 最終ログバックアップがコピーオンリーか |
| DatabaseCreated | datetime | データベース作成日時 |
| DaysSinceDbCreated | int | データベース作成からの日数 |
| Status | string | バックアップ状態 |

### 出力先

- PowerShellパイプライン（PSCustomObject）
- Select-DefaultViewで主要プロパティを表示

## 処理フロー

### 処理シーケンス

```
1. begin ブロック
   └─ Get-DbaDateOrNull ヘルパー関数定義
   └─ StartOfTime 初期化（TimeSpan 0）

2. process ブロック（各SqlInstanceに対して）
   └─ Connect-DbaInstance（MinimumVersion 9）
   └─ tempdb除外のデータベース一覧取得
   └─ Database/ExcludeDatabaseフィルタ適用

3. バックアップ履歴取得
   └─ Get-DbaDbBackupHistory -LastFull -IncludeCopyOnly -Raw
   └─ Get-DbaDbBackupHistory -LastDiff -IncludeCopyOnly -Raw
   └─ Get-DbaDbBackupHistory -LastLog -IncludeCopyOnly -Raw

4. 各データベースに対して
   └─ 最終フル/差分/ログバックアップ日時抽出
   └─ Since*経過時間計算
   └─ IsCopyOnlyフラグ抽出
   └─ Status判定:
      ├─ 新規DB未バックアップ: "New database, not backed up yet"
      ├─ フル/差分なし: "No Full or Diff Back Up in the last day"
      ├─ Full+ログなし: "No Log Back Up in the last hour"
      └─ OK: "OK"

5. PSCustomObject構築と出力
   └─ Select-DefaultViewで主要プロパティ表示
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[ヘルパー関数定義]
    B --> C[foreach SqlInstance]
    C --> D[Connect-DbaInstance]
    D --> E[データベース一覧取得]
    E --> F[フィルタ適用]
    F --> G[Get-DbaDbBackupHistory -LastFull]
    G --> H[Get-DbaDbBackupHistory -LastDiff]
    H --> I[Get-DbaDbBackupHistory -LastLog]
    I --> J[foreach Database]
    J --> K[最終バックアップ日時抽出]
    K --> L[Since経過時間計算]
    L --> M[Status判定]
    M --> N[PSCustomObject構築]
    N --> O[Select-DefaultView出力]
    O --> J
    J --> C
    C --> P[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | tempdb除外 | tempdbは常に除外 | データベース一覧取得時 |
| BR-02 | 最小バージョン | SQL Server 2005以上が必要 | 接続時 |
| BR-03 | コピーオンリー含む | IncludeCopyOnlyで全バックアップを検索 | 常時 |
| BR-04 | Status判定 | 経過時間に基づくステータス自動判定 | 各DB処理時 |
| BR-05 | 差分コピーオンリー | 常にfalse（SQL Server仕様） | 常時 |

### 計算ロジック

Status判定ロジック：
```powershell
if ($daysSinceDbCreated -lt 1 -and $SinceFull_ -eq 0) {
    "New database, not backed up yet"
} elseif ($SinceFull_.Days -gt 0 -and $SinceDiff_.Days -gt 0) {
    "No Full or Diff Back Up in the last day"
} elseif ($RecoveryModel -eq "Full" -and $SinceLog_.Hours -gt 0) {
    "No Log Back Up in the last hour"
} else {
    "OK"
}
```

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| バックアップ履歴取得 | msdb.dbo.backupset等 | SELECT | Get-DbaDbBackupHistory経由 |
| データベース情報取得 | sys.databases | SELECT | SMO経由 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ConnectionError | インスタンス接続失敗 | 接続情報確認 |

### リトライ仕様

リトライ機能は実装されていません。

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

読み取り専用操作のためトランザクションは使用しません。

## パフォーマンス要件

- Get-DbaDbBackupHistoryを3回呼び出すため、大量DBでは時間がかかる
- LastFull/LastDiff/LastLogで最適化されたクエリを使用

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

- msdbへの読み取り権限が必要
- SqlCredentialで認証情報を安全に渡す

## 備考

- LastDiffBackupIsCopyOnlyは常にfalse（SQL Server仕様で差分はコピーオンリー不可）
- Status判定はFullリカバリモデルでのみログバックアップをチェック

---

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

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

### 推奨読解順序

#### Step 1: パラメータ定義を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaLastBackup.ps1 | `public/Get-DbaLastBackup.ps1` | パラメータ定義（98-107行目）、シンプルな構成 |

**読解のコツ**: 他のバックアップ関連コマンドと比べてシンプルなパラメータ構成。

#### Step 2: begin ブロックのヘルパー関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaLastBackup.ps1 | `public/Get-DbaLastBackup.ps1` | beginブロック（108-116行目）でのGet-DbaDateOrNull関数とStartOfTime |

**主要処理フロー**:
1. **109-114行目**: Get-DbaDateOrNull（TimeSpan 0の場合null返却）
2. **115行目**: StartOfTime初期化

#### Step 3: process ブロックのメイン処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaLastBackup.ps1 | `public/Get-DbaLastBackup.ps1` | processブロック（117-205行目）でのバックアップ履歴取得とStatus判定 |

**主要処理フロー**:
- **118-123行目**: Connect-DbaInstance（MinimumVersion 9）
- **125-133行目**: データベース一覧取得とフィルタ
- **135-137行目**: Get-DbaDbBackupHistory 3回呼び出し
- **138-180行目**: 各DB処理（最終日時/Since/IsCopyOnly/Status）
- **182-202行目**: PSCustomObject構築とSelect-DefaultView

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

```
Get-DbaLastBackup
    │
    ├─ begin ブロック
    │      │
    │      ├─ Get-DbaDateOrNull 定義
    │      └─ $StartOfTime 初期化
    │
    └─ process ブロック (foreach $instance)
           │
           ├─ Connect-DbaInstance (MinimumVersion 9)
           │
           ├─ $server.Databases (tempdb除外)
           │
           ├─ Database/ExcludeDatabase フィルタ
           │
           ├─ Get-DbaDbBackupHistory
           │      ├─ -LastFull -IncludeCopyOnly -Raw
           │      ├─ -LastDiff -IncludeCopyOnly -Raw
           │      └─ -LastLog -IncludeCopyOnly -Raw
           │
           └─ foreach $db
                  │
                  ├─ 最終バックアップ日時抽出
                  │      └─ Where-Object Database | Sort End | Select -First 1
                  │
                  ├─ Since経過時間計算
                  │      └─ New-TimeSpan -Start $Last*Backup
                  │
                  ├─ Status判定
                  │
                  └─ PSCustomObject + Select-DefaultView
```

### データフロー図

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

$SqlInstance ──────────▶ Connect-DbaInstance ─────────▶ $server
                                 │
$server.Databases ─────▶ tempdb除外 + フィルタ ───────▶ $dbs
                                 │
$dbs.Name ─────────────▶ Get-DbaDbBackupHistory ──────▶ $FullHistory
                         -LastFull                       $DiffHistory
                         -LastDiff                       $LogHistory
                         -LastLog
                                 │
各DB ──────────────────▶ 最終日時抽出 ────────────────▶ $LastFullBackup等
                                 │
                         Since計算 ────────────────────▶ $SinceFull_等
                                 │
                         Status判定 ───────────────────▶ $Status
                                 │
                         PSCustomObject構築
                                 │
                                 └─────────────────────▶ PSCustomObject[]
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaLastBackup.ps1 | `public/Get-DbaLastBackup.ps1` | ソース | メイン関数実装 |
| Get-DbaDbBackupHistory.ps1 | `public/Get-DbaDbBackupHistory.ps1` | ソース | バックアップ履歴取得基盤 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続 |
| Select-DefaultView.ps1 | `internal/functions/Select-DefaultView.ps1` | ソース | 出力整形 |
