前回のブログで、メンテナンスプランを使ってバックアップを取る記事を投稿させていただきました。
前回の記事
今回は、そのバックアップの種類について、SQL Serverで採用されている「ログ先行書き込み(Write-Ahead Logging, WAL)」という仕組みを踏まえて調べた内容を記載します。
ログ先行書き込み(Write-Ahead Logging, WAL)について
SQL Serverで扱うファイルの種類は以下2つがあります。
- トランザクションログファイル(.ldf)
- データファイル(.mdf)
実際のデータは「データファイル(.mdf)」に格納されています。
感覚的には、実際に「データファイル(.mdf)」の更新処理を行った後、ログ「トランザクションログファイル(.ldf)」を残すという順番が正しいように思いますが、
ログ先行書き込みにおいては、DBに対して更新リクエストがあった場合、「トランザクションログファイル(.ldf)」にだけ先に書き込んだ後、「データファイル(.mdf)」に書き込みます。
DBの更新プロセス
「データファイル(.mdf)」へはどのタイミングでデータが更新されるかというと、チェックポイントと呼ばれる処理が実行されたときに書き込みが行われます。
チェックポイント処理では定期的にバッファキャッシュをスキャンし、差分があればデータファイルへ書き込みを行います。
成功通知タイミングも踏まえて図解すると以下のようになります。
この方法で更新プロセスを行うことによる主なメリットは3つです。
ディスクI/Oの負荷軽減:
データファイルへの書き込みよりも、ログファイルへの書き込みのほうが低コストであり、データファイルへの書き込みはチェックポイントのタイミングで一括で行われるため、都度データファイルを書き換えに行くときと比較して、I/Oの負荷は軽減されます。
一貫性の確保:
データの変更がディスクに書き込まれる前に、すべての変更内容がトランザクションログに記録されるため、システム障害が発生してもデータの一貫性が保たれます(中途半端な状態のデータが生まれません)。
障害発生の直前まで復旧が可能:
システム障害が発生してもトランザクションログを使用して、データベースをシステム障害の直前の状態まで復旧することが可能です。
※注意※
復旧モデルが「完全」or「一括ログ」に設定されている時のみに限られ「単純」のときは対象外です。
これは復旧モデルが「単純」のとき、チェックポイント処理のたびにトランザクションログの切り捨てが行われるためです。
「完全」or「一括ログ」のときはバックアップを契機にトランザクションログの切り捨てが行われるため、定期的にバックアップを取ることでトランザクションログの内容を復旧に使用することが可能です。
バックアップの種類
主なバックアップの種類としては以下4つがあり、バックアップの種類によって .mdf .ldf の扱いも変わります。
完全バックアップ(full backup)
⇒データファイル(.mdf)や、トランザクションログファイル(.ldf)を含むすべての情報をバックアップ
差分バックアップ(differential backup)
⇒直近の完全バックアップからの差分のみをバックアップ
トランザクションログバックアップ(transaction log backup)
⇒トランザクションログファイル(.ldf)のみバックアップ
※トランザクションログバックアップについては、復旧モデルが「完全」「一括ログ」の時のみ使用でき、「単純」の場合は使用できません。
また、前述のとおりバックアップを契機にトランザクションログレコードの切り捨てが行われるため、このバックアップ処理を定期的に行わないとトランザクションログファイルの肥大化につながります。
ログ末尾バックアップ (tail-log backup)
⇒システム障害発生した際に、まだトランザクションログバックアップがされていない内容をバックアップ
※定期的なメンテナンス等で取得するものではなく、リストアの際に可能な限り直前まで復元するために使用されます。
トランザクションログバックアップと同様に、復旧モデルが「完全」「一括ログ」の時のみ使用できます。