-
Notifications
You must be signed in to change notification settings - Fork 0
MS_SQLServerDisasterRecovery
- 戻る(SQL Server)
障害復旧に関するオプションの説明。
SQL Server では、「データ消失に対する保護」、「性能」、および
「ディスクとテープの容量」などの要件に対応するための目的とした
**3 種類の「復旧モデル」**が用意されている。
このため、「復旧モデル」を選択する場合は、
次の業務上の条件とトレードオフを考慮する必要がある。
- コミットされたトランザクションの消失など、「データ消失の可能性」。
- インデックスの作成や一括ロードなど、大量操作の「性能」。
- 「トランザクション ログ」が使用する領域の「容量」。
- バックアップ リストアの「手順の単純さ」。
実行する操作の種類によっては、適切な「復旧モデル」が複数あることもある。
「復旧モデル」を選択した後は、バックアップ、リストアの手順を計画する必要がある。
- 「単純 復旧モデル」は、処理性能に優れる一括コピーであるが、
「チェック ポイント」が発生するたびに
「トランザクション ログ」が切り捨てられる。 - このため、必要なスペースを抑制できるが、
最新の「完全バックアップ」または「差分バックアップ」の時点にしか復旧できない。- バックアップ、リストアの手順は、
「完全バックアップ」または「差分バックアップ」のみサポートしている。 - 「トランザクション ログ」が切り捨てられるため、
「トランザクション ログ バックアップ」はサポートされない。
- バックアップ、リストアの手順は、
- 最小限の管理で済むが、「データ ファイル」が損傷を受けた場合の
データ消失の可能性が高い。- 最新の変更内容の消失が許されない OLTP システムの場合、
顧客要件や、ストレージの信頼性によるが、
「単純 復旧モデル」は適切ではない場合がある。 - ケース バイ ケースで、「データ消失」と「性能」を考慮した
バックアップ間隔に調整する。- バックアップのオーバーヘッドが業務に影響しない程度に長い間隔に調整する。
- 大量のデータを消失しないで済む程度に短い間隔に調整する。
- 最新の変更内容の消失が許されない OLTP システムの場合、

データが最大限に保護される。
このモデルは「トランザクション ログ」からデータを復旧することができる。
- 「完全 復旧モデル」では、全てのトランザクションが
「トランザクション ログ」に記録されるため、完全な復旧が可能である。 - 「トランザクション ログ」には、全ての操作が記録される。このため、
- 大規模な操作の場合は、性能が問題となる。
- 「トランザクション ログ」を保持する、ある程度のログ領域が必要になる。
- 復元の手順は、
- 「完全バックアップ」のリストア、
- 「差分バックアップ」のリストア、
- 「トランザクション ログ バックアップ」のリストアを実施する。

データが最大限に保護される。
このモデルは「トランザクション ログ」からデータを復旧することができる。
- 「一括ログ 復旧モデル」では、特定の大規模な操作を除いた
全てのトランザクションが「トランザクション ログ」に記録されるため、
ほぼ完全な復旧が可能である。 - 特定の大規模操作の際に、「トランザクション ログ」には
エクステントのビットだけが記録される。
このため、高い性能を実現し、「トランザクション ログ」のスペースを抑制できる。
「一括ログ 復旧モデル」でログが記録されない大規模操作は以下のとおり。-
SELECT INTO操作(検索結果をテーブルに挿入する処理) -
bcpユーティリティを使用した大量データのインポート、エクスポート -
BULK INSERTを使用した大量データのインポート -
CREATE INDEX(その他、INDEX のデフラグなど) - text 操作と、image 操作
-
- 大規模操作を実行した後に「トランザクション ログ」をバックアップすれば、
その際に、「データ ファイル」のエクステントから、
最後のバックアップ以降の大規模操作が
「トランザクション ログ バックアップ」に反映される。 - このため、大規模操作を実行した後は、
「トランザクション ログ バックアップ」を利用した
データの(指定時点への)復旧ができなくなるが、
大規模操作後、直ちに「トランザクション ログ」をバックアップすれば、
その時点までの復旧が可能になる。 - 「完全 復旧モデル」では、「一括読み込み」「インデックス作成」などの
大規模操作に長い時間がかかるので、場合によっては、
「完全 復旧モデル」と「一括ログ 復旧モデル」を切り替える。

| 復旧モデル | データ消失の影響度 | 性能 | 運用手順の難易度 | 必要なログ領域の容量 |
|---|---|---|---|---|
| 単純 | 大 | 高 | 容易 | 小 |
| 完全 | 最小 | 低 | 普通 | 大 |
| 一括ログ | 小 | 中 | 難しい | 中 |
補足(実務ではほぼ「単純」か「完全」の二択): 一括ログ 復旧モデルは
常用するものではなく、大規模操作の間だけ一時的に切り替えるものである。
ケース 復旧モデル 開発・検証、日次バッチで作り直せる DWH 単純 業務 OLTP(1 件の消失も許されない) 完全 完全運用中の夜間の大量ロード・索引再構築の間だけ 一括ログ(終わったら完全へ戻す) 「完全 復旧モデルにしたのにログ バックアップを取っていない」というのが
最も多い事故で、この場合トランザクション ログが際限なく増え続けて
ディスクを食い潰す(SQL Server のバックアップを参照)。
完全復旧モデルの採用は、ログ バックアップの運用とセットである。
- 既定の「復旧モデル」を変更するには、
modelDB の「復旧モデル」を変更する。 - 作成済みの DB の「復旧モデル」を変更するには、各 DB の「復旧モデル」を変更する。
- オブジェクト エクスプローラーから、変更したいデータベースを選択
- データベースを右クリックし、「プロパティ」を選択
- プロパティ・ダイアログの「オプション」ページを開く
- 「復旧モデル」ドロップダウン メニューから、変更したい復旧モデルを選択
- 「OK」をクリックして変更を保存
ALTER DATABASE ステートメントの RECOVERY 句で設定する。
ALTER DATABASE [DB名] SET RECOVERY [復旧モデル][復旧モデル] に指定する文字列は以下の通り。
| 指定値 | 復旧モデル |
|---|---|
FULL |
完全 復旧モデル |
BULK_LOGGED |
一括ログ 復旧モデル |
SIMPLE |
単純 復旧モデル |
DB に設定された「復旧モデル」は、DATABASEPROPERTYEX 関数に
Recovery プロパティを設定し、調べることができる。
SELECT DATABASEPROPERTYEX('[DB名]','Recovery')移行メモ(見出しの表記): 元ページは本項の見出しを
「sp_configureによる設定」としているが、
復旧モデルはsp_configureでは設定できない
(sp_configureはサーバー インスタンス単位の構成オプション用で、
復旧モデルはデータベース単位のプロパティである)。
実際に本文が示しているとおりALTER DATABASE ... SET RECOVERYが正しい。
後述の「recovery interval」オプションのほうがsp_configureの対象である。
切り替えのパターン
- 完全復旧 → 一括ログ復旧
- 一括ログ復旧 → 完全復旧
必要な操作(共通)
- バックアップの計画に変更はない。
- 「トランザクション ログ バックアップ」を実施すれば、
「データ ファイル」のエクステントから、最後のバックアップ以降の大規模操作が
「トランザクション ログ バックアップ」に反映される。
必要な操作(個別)
- 完全復旧 → 一括ログ復旧
大規模操作はトランザクション ログに記録されないようになるので、
大規模操作のバックアップが重要な場合は、
適宜「トランザクション ログ バックアップ」を実施する。 - 一括ログ復旧 → 完全復旧
切り替え後、指定日時への復旧が重要な場合は、
切り替え直後に「トランザクション ログ バックアップ」を実行する。
切り替えのパターン
- 完全復旧 → 単純復旧
- 一括ログ復旧 → 単純復旧
必要な操作(共通)
- 切り替え直前に「トランザクション ログ」をバックアップすると、
その時点の状態にまで復旧できる。 - 切り替え後は、「トランザクション ログ」が無効になるので、
「単純 復旧モデル」用のバックアップの計画に変更する。
切り替えのパターン
- 単純復旧 → 完全復旧
- 単純復旧 → 一括ログ復旧
必要な操作(共通)
- 切り替え後に「トランザクション ログ」が有効になるため、
切り替え直後に「トランザクション ログ バックアップ」のベースとなる
「完全バックアップ」、「差分バックアップ」を実行する。 - その後、「完全 復旧モデル」、「一括ログ 復旧モデル」用の
バックアップの計画に変更する。
補足(この 3 パターンの覚え方): 切り替えの前後どちらで
バックアップを取るかは、**「ログの鎖(log chain)が切れるかどうか」**で
決まる。
切り替え ログの鎖 対処 完全 ⇄ 一括ログ 切れない 変更後に必要に応じて 完全/一括ログ → 単純 切れる(ログが捨てられる) 変更前に取っておく 単純 → 完全/一括ログ 鎖が無い(起点が要る) 変更後に完全バックアップ 「単純に落とす前に取る、単純から上げた後に取る」と覚えればよい。
障害発生後、SQL Server インスタンスの再起動時に発生する
復旧処理の最大時間(分単位) を設定する。
復旧処理では、
- ロールバック
- ロールフォワード
が行われる。
- SQL Server インスタンスは、この設定と内部アルゴリズムにより、
「自動チェック ポイントの実行頻度」を判断し、
復旧時間が「recovery interval」オプションで指定された時間以上に
ならないようにする。
SQL Server インスタンスは内部の処理量に応じて、
「チェック ポイント」の間隔を決める。 - 内部の作業量(データ変更処理など)が多いほど、
「チェック ポイント」処理は頻繁に実行される。
これは、「データ ファイル」にフラッシュされていないデータ変更が少ないほど、
復旧時の処理時間が短くなるためである。
「チェック ポイント」処理とは、
「バッファ キャッシュ」中のデータを「データ ファイル」に
フラッシュする処理である。
※ データ変更は、コミット、未コミットに関係なく、
すべて「トランザクション ログ ファイル」に書き込まれる。

復旧処理では、「データ ファイル」にフラッシュされていなかった変更を
「トランザクション ログ」上の記録を元に、「データ ファイル」に反映する。
この際、
- 「コミット」されたトランザクションは、「ロール フォワード」され、
- 「未コミット」のトランザクションは、「ロール バック」される。

補足(WAL とチェック ポイント): この仕組みは
WAL(Write Ahead Logging:ログ先行書き込み) と呼ばれ、
商用 RDBMS に共通する。更新 ──> [ログ ファイル] へ即時書き込み(順次 I/O・速い) └> [バッファ キャッシュ] を更新(メモリ) │ チェック ポイント(まとめて) ▼ [データ ファイル](ランダム I/O・遅い)「コミット時にデータ ファイルへ書かない」ことで性能を稼ぎ、
障害時はログから作り直す。したがって、
- ログ ファイルは別ディスクに置く(順次 I/O を邪魔しない)
- ログ ファイルを失うと復旧できない
という設計上の要請が出てくる
(SQL Server のファイルの配置)。
「recovery interval」オプションで復旧時間を短く設定する。
この場合、「チェック ポイント」処理は頻繁に実行されるため I/O が増える。
「recovery interval」オプションで復旧時間を長く設定すれば、
「チェック ポイント」処理の間隔を長くすることができる。
このため、I/O が減少するので、(I/O に関する)性能向上が期待できる。
- オブジェクト エクスプローラーでサーバー インスタンスを右クリックし
[プロパティ] をクリック - [データベースの設定] ノードを選び、[復旧] の [復旧間隔 (分単位)] ボックスで、
0 ~ 32767 の値を入力するか選択
- 既定値は 0。この場合、復旧時間は 1 分未満。
- 値を 5 に設定した場合、復旧時間は 5 分未満になる。
EXEC sp_configure 'recovery interval', n
RECONFIGURE
EXEC sp_configure
GOn の単位は、分で指定する。
移行メモ(最新化:間接チェックポイント): SQL Server 2016 以降、
新規に作成したデータベースの既定は「間接チェックポイント」
(TARGET_RECOVERY_TIME = 60秒)になっている。
自動チェックポイント(従来) 間接チェックポイント(既定) 設定 sp_configure 'recovery interval'(インスタンス単位・分)ALTER DATABASE ... SET TARGET_RECOVERY_TIME(DB 単位・秒)動作 ログ量から間隔を推定 ダーティ ページ数を継続的に制御 復旧時間 ばらつく 予測しやすい ALTER DATABASE [DB名] SET TARGET_RECOVERY_TIME = 60 SECONDS;
TARGET_RECOVERY_TIMEが 0 より大きい DB では、
本ページのrecovery intervalは効かない。
考え方(復旧時間と I/O のトレードオフ)は本ページの記述どおりである。
補足(さらに新しい選択肢:ADR): SQL Server 2019 以降には
ADR(Accelerated Database Recovery:高速データベース復旧) がある。
長時間トランザクションのロールバックをほぼ即座に終わらせ、
起動時の復旧時間を大幅に短縮する(その分ストレージを消費する)。
「巨大な更新を ROLLBACK したら何時間も終わらない」という
従来の問題への回答である。
-
復旧モデル (SQL Server)
https://learn.microsoft.com/sql/relational-databases/backup-restore/recovery-models-sql-server -
データベースの復旧モデルの表示または変更
https://learn.microsoft.com/sql/relational-databases/backup-restore/view-or-change-the-recovery-model-of-a-database -
データベース チェックポイント (SQL Server)
https://learn.microsoft.com/sql/relational-databases/logs/database-checkpoints-sql-server -
高速データベース復旧の管理
https://learn.microsoft.com/sql/relational-databases/accelerated-database-recovery-management
-
SQL Server の復旧モデルとトランザクション ログ - 松本崇博 Blog(SQL Server Tips)
http://d.hatena.ne.jp/matu_tak/20091224/1261710845 -
SQL Server 2008 以降のログの切り捨て - SE の雑記
https://engineermemo.wordpress.com/2011/06/29/sql-server-2008-%E4%BB%A5%E9%99%8D%E3%81%AE%E3%83%AD%E3%82%B0%E3%81%AE%E5%88%87%E3%82%8A%E6%8D%A8%E3%81%A6/
Tags: 移行, データアクセス, SQL Server, 障害対応
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。