MSSQLのバックアップおさらい
MSSQLのややこしいバックアップまわりについてこれを読めばイメージ掴んでもらえるように書きます。
Contents
復旧モデル
MSSQLには復旧モデルという考えがあり、そのモデルによってバックアップとリストアの挙動が変わってきます。
単純復旧モデル、完全復旧モデル、一括ログ復旧モデルの3つがあり、一般的には完全復旧モデルが使用されるかと思います。完全復旧モデルは通常のバックアップに加え、トランザクションログのバックアップも取ることができ、より細かい範囲でリストアすることができます。
この記事では完全復旧モデルを使っている前提で書かせていただきます。
バックアップ方式
MSSQLのデータベース バックアップ方式は3種類あります。データベースファイル自体をバックアップするファイルバックアップといったやり方もありますが、ここではこの3つに注目したいと思います。
- フルバックアップ
- 差分バックアップ
- ログバックアップ
フルバックアップ
完全バックアップとも呼ばれます。
特定のデータベース (または一連のファイルやファイル グループ) 内のデータがすべて含まれ、さらに、データを復旧するために必要なログも含んだデータバックアップのことで、まさにフルバックアップです。
他のバックアップの起点にもなる重要なバックアップです。バックアップ取得中もトランザクションを行うことができます。
上図はフルバックアップの取得イメージです。単純にバックアップ開始時点のデータすべてを含むバックアップデータを作成します。
少し細かいステップを見るとこうなっています。
- フルバックアップが開始
- チェックポイントが作成される
- ダーティページの内容をディスクに書き込む
- データページの内容をバックアップする
- トランザクションログの内容をバックアップする
- フルバックアップ終了
これによりフルバックアップに含まれるデータは、チェックポイントまでのデータに加え、チェックポイント以前に開始してフルバックアップ完了の間に完了したトランザクションの内容、となります。
コマンド
BACKUP DATABASE your_database TO DISK = 'full.bak'
差分バックアップ
最新のフルバックアップ以後に変更されたデータエクステントのみを含んだバックアップのことです。データベースのうち、特定の部分だけ頻繁に更新されるような場合に有効な方式です。
リストアの際はフルバックアップから一旦リストアしたあとに、差分バックアップから再度リストアするという2段階の手順を踏む必要があります。
なお、差分バックアップをとった後さらに差分バックアップをとった場合でも最新のフルバックアップと最新の差分バックアップの2ファイルがあれば良いです。差分バックアップファイルを差分バックアップのたびに保持しておく必要はありません。
ログバックアップ
トランザクションログのバックアップです。
トランザクションログのバックアップの目的はトランザクション単位での復旧となります。フルバックアップからリストアした後にトランザクションログを元にロールフォワードが可能となります。なお、トランザクションログバックアップを使ったロールバックはできません。トランザクションログ自体でもロールバックはできません(トランザクションが未完了の際に自動的にロールバックされることはあります)
トランザクションログのバックアップ対象は、最新のフルバックアップ以降のトランザクションの内容もしくは、最新のトランザクションバックアップ以降のトランザクションの内容となります。
そのため正常にリストアするためには、フルバックアップとフルバックアップからチェーンが途切れていないトランザクションログバックアップが必要となります。
ところで、トランザクションログのバックアップには一般的に目的が2つあります。
- ひとつめは上記にも書いたバックアップとして
- もうひとつの目的は、トランザクションログの切り捨て
編集中です。
トランザクションログの戦略
リストア
3041エラーについて
トレース
参考サイト
- [1] https://academy.sqlbak.com/full-backup/
- [2] https://docs.microsoft.com/ja-jp/sql/relational-databases/backup-restore/sql-server-vss-writer-backup-guide?view=sql-server-ver15