# インフラ設計書

## 概要

本ドキュメントは、SQL Server First Responder Kit（以下、FRK）の実行環境およびデプロイメントに関するインフラ設計を記載します。FRKはSQL Serverのパフォーマンス診断・管理用ストアドプロシージャ集であり、専用のアプリケーションサーバーを必要とせず、SQL Serverインスタンス上で直接実行されます。

## システム構成

### 全体構成

FRKはクライアント-サーバー型のアーキテクチャに基づき、以下の構成で運用されます：

1. **SQL Serverインスタンス**: FRKのストアドプロシージャがインストールされる対象サーバー
2. **管理クライアント**: SQL Server Management Studio（SSMS）、Azure Data Studio、またはその他のSQL接続ツール
3. **CI/CD環境**: GitHub Actionsによる自動テスト環境

```
┌─────────────────────────────────────────────────────────────────┐
│                     管理クライアント                             │
│  ┌──────────────────┐  ┌──────────────────┐  ┌────────────────┐ │
│  │      SSMS        │  │ Azure Data Studio│  │   sqlcmd CLI   │ │
│  └────────┬─────────┘  └────────┬─────────┘  └───────┬────────┘ │
└───────────┼─────────────────────┼────────────────────┼──────────┘
            │                     │                    │
            └─────────────────────┼────────────────────┘
                                  │ TDS (TCP/1433)
                                  ▼
┌─────────────────────────────────────────────────────────────────┐
│                    SQL Server インスタンス                       │
│  ┌────────────────────────────────────────────────────────────┐ │
│  │                     master データベース                     │ │
│  │  ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐  │ │
│  │  │  sp_Blitz   │ │sp_BlitzCache│ │  sp_BlitzFirst等    │  │ │
│  │  └─────────────┘ └─────────────┘ └─────────────────────┘  │ │
│  └────────────────────────────────────────────────────────────┘ │
│  ┌────────────────────────────────────────────────────────────┐ │
│  │                   システムDMV・カタログ                     │ │
│  │  sys.dm_exec_query_stats, sys.dm_os_wait_stats 等          │ │
│  └────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
```

### サーバー構成

| サーバー種別 | 役割 | スペック | 台数 |
| --- | --- | --- | --- |
| SQL Serverインスタンス | FRKストアドプロシージャ実行環境 | Microsoftサポート対象バージョン | 1以上 |
| GitHub Actions Runner | CI/CDテスト実行 | Ubuntu Latest | 1（並列3マトリックス） |

### ネットワーク構成

FRKは既存のSQL Server環境に組み込まれるため、独自のネットワーク構成は不要です。以下は標準的な接続要件です：

- **プロトコル**: TDS（Tabular Data Stream）
- **ポート**: TCP/1433（既定）または環境固有のポート
- **認証**: SQL Server認証またはWindows認証（Active Directory統合）
- **暗号化**: TLS 1.2以上推奨（SQL Server設定に依存）

## ミドルウェア

| ミドルウェア | バージョン | 用途 |
| --- | --- | --- |
| SQL Server | 2017, 2019, 2022, 2025 | ストアドプロシージャ実行環境 |
| SQL Server on Linux | 対応バージョン | Linux環境での実行（sp_DatabaseRestore除く） |
| Amazon RDS SQL Server | 対応バージョン | AWSクラウド環境での実行 |
| Azure SQL DB | 制限付き対応 | 一部プロシージャのみ動作（Install-Azure.sql使用） |
| PowerShell SqlServer Module | 最新版 | CI/CDテスト実行用 |

### サポート対象バージョン詳細

FRKはMicrosoftがサポートする全てのSQL Serverバージョンで動作します。バージョンごとのサポート終了日については https://sqlserverupdates.com を参照してください。

### プラットフォーム別対応状況

| プラットフォーム | 対応状況 | 制限事項 |
| --- | --- | --- |
| SQL Server on Windows | 完全対応 | なし |
| SQL Server on Linux | 対応 | sp_DatabaseRestoreは非対応（xp_cmdshell未提供） |
| Amazon RDS SQL Server | 完全対応 | なし |
| Azure SQL DB | 非公式対応 | DMVの変更により一部機能が動作しない可能性あり |

## 外部サービス連携

| サービス名 | 用途 | 接続方式 |
| --- | --- | --- |
| GitHub Actions | CI/CDパイプライン（自動テスト） | HTTPS API |
| Azure OpenAI / OpenAI | sp_BlitzCache @AskAI機能（SQL Server 2025以降） | HTTPS REST API |
| Linked Server | sp_BlitzBackupsによるバックアップ履歴集約 | TDS over TCP |

### GitHub Actions CI/CD構成

```yaml
# テストマトリックス
SQL_ENGINE_VERSION: [2017, 2019, 2022]
COLLATION: [SQL_Latin1_General_CP1_CS_AS]
```

CI/CD環境では以下のコンポーネントが使用されます：
- **mssqlsuite Action**: SQL Serverエンジンのインストール
- **PowerShell SqlServer Module**: データベース操作
- **Pester**: PowerShellテストフレームワーク

## スケーリング設計

FRKはステートレスなストアドプロシージャ群であり、スケーリングはSQL Serverインスタンス自体のスケーリングに依存します。

### 水平スケーリング

- **複数インスタンスへのデプロイ**: 各SQL Serverインスタンスに個別にFRKをインストール
- **結果の集約**: sp_BlitzBackupsの `@PushBackupHistoryToListener` パラメータを使用してAvailability Groupリスナー経由でデータを集約可能

### 垂直スケーリング

- FRKの実行はSQL Serverのリソース（CPU、メモリ、I/O）に依存
- 大規模データベース環境では `@BringThePain = 1` パラメータで拡張実行モードを有効化

## 可用性設計

### 冗長構成

FRKはSQL Serverの可用性機能に完全に依存します：

- **Always On Availability Groups**: セカンダリレプリカでの実行対応
  - `@IgnoreReadableReplicaDBs = 0` で読み取り可能レプリカを含む分析が可能
  - 接続文字列に `ApplicationIntent = ReadOnly` が必要

- **フェイルオーバークラスタインスタンス（FCI）**: 標準対応

### フェイルオーバー方式

FRKストアドプロシージャはデータベースオブジェクトとしてバックアップ/リストアされ、フェイルオーバー時は自動的に新しいプライマリに引き継がれます。

## バックアップ設計

| 対象 | 方式 | 頻度 | 保持期間 |
| --- | --- | --- | --- |
| FRKストアドプロシージャ（masterデータベース） | SQL Serverデータベースバックアップ | 環境ポリシーに準拠 | 環境ポリシーに準拠 |
| 診断結果出力テーブル（BlitzFirst, BlitzCache等） | SQL Serverデータベースバックアップ | 日次推奨 | 30日以上推奨 |
| ソースコード | GitHub Repository | Push時 | 無期限 |

### 診断結果の保存

以下のテーブルに診断結果を永続化可能：

| テーブル名 | 用途 | 推奨保存先DB |
| --- | --- | --- |
| BlitzFirst | パフォーマンス診断結果 | DBAtools |
| BlitzFirst_FileStats | ファイル統計 | DBAtools |
| BlitzFirst_PerfmonStats | Perfmonカウンター | DBAtools |
| BlitzFirst_WaitStats | 待機統計 | DBAtools |
| BlitzCache | クエリキャッシュ分析 | DBAtools |
| BlitzWho | 実行中クエリスナップショット | DBAtools |

## 監視設計

### 推奨監視構成

FRKは監視ツールとして使用されるため、以下のスケジュール実行を推奨します：

| ストアドプロシージャ | 実行頻度 | 目的 |
| --- | --- | --- |
| sp_BlitzFirst | 15分ごと | リアルタイムパフォーマンス監視 |
| sp_Blitz | 日次/週次 | 包括的ヘルスチェック |
| sp_BlitzIndex | 週次/月次 | インデックス最適化分析 |
| sp_BlitzBackups | 日次 | バックアップRPO/RTO分析 |

### SQL Server Agent Jobによる自動化例

```sql
-- sp_BlitzFirstを15分ごとに実行しテーブルに保存
EXEC sp_BlitzFirst
    @OutputDatabaseName = 'DBAtools',
    @OutputSchemaName = 'dbo',
    @OutputTableName = 'BlitzFirst',
    @OutputTableNameFileStats = 'BlitzFirst_FileStats',
    @OutputTableNamePerfmonStats = 'BlitzFirst_PerfmonStats',
    @OutputTableNameWaitStats = 'BlitzFirst_WaitStats',
    @OutputTableNameBlitzCache = 'BlitzCache',
    @OutputTableNameBlitzWho = 'BlitzWho';
```

## デプロイメント

### インストール手順

1. **オンプレミス/VM環境**:
   ```bash
   sqlcmd -S <server> -d master -i "Install-All-Scripts.sql"
   ```

2. **Azure SQL DB**:
   ```bash
   sqlcmd -S <server>.database.windows.net -d <database> -i "Install-Azure.sql"
   ```

### アンインストール手順

```bash
sqlcmd -S <server> -d master -i "Uninstall.sql"
```

## 備考

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

- FRKストアドプロシージャは管理者権限（sysadmin、db_owner等）で実行する必要があります
- 診断結果にはセンシティブな情報（クエリテキスト、実行プラン等）が含まれる場合があります
- 出力テーブルへのアクセス権限を適切に制限することを推奨します

### パフォーマンス考慮事項

- 50以上のデータベースがある環境では `@CheckUserDatabaseObjects` が自動的に無効化されます
- 大規模環境では `@BringThePain = 1` と適切な `@Top` パラメータの設定が必要です
- 本番環境での初回実行時はオフピーク時間帯を推奨します

### ライセンス

MIT License - 商用・非商用を問わず自由に使用可能です。詳細は LICENSE.md を参照してください。
