【入門】DBのバックアップ方式について

# はじめに
この記事では、**達人に学ぶDB設計徹底指南書**[^1]で学んだ内容をもとに、
DBのバックアップ方式について解説します。

DBのバックアップは、システムの安定運用において非常に重要な役割を果たします。
障害発生時にデータを復旧できるようにするためには、適切なバックアップ方式の理解が不可欠です。

それでは見ていきましょう。

# バックアップの基本分類
主要なバックアップ方針は以下の三つ


1. **フルバックアップ**
2. **差分バックアップ**
3. **増分バックアップ**

データベースのバックアップ設計において、この3つの方式を組み合わせて使用します。


# フルバックアップ

フルバックアップは、ある時点でのシステムに保持されている全てのデータをバックアップする方式です。

![full.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565050/7eb9cb64-4458-9b11-cfe0-0cb76644eb60.png)

フルバックアップは、シンプルで分かりやすいが、以下のデメリットを抱えている為、
この方式だけでは運用が出来ないケースが多い。

### デメリット
- バックアップ時間が長い
    - 全データをバックアップするため、他の方式と比べて時間がかかる
- ハードウェアへの負担が高い
    - データ量が多いため、ディスクI/O、メモリ、CPUの使用量が増えます
- サービスの停止が必要
    - データの整合性を保つために、バックアップ中はデータの変更ができません

# 差分バックアップ
差分バックアップは、前回のフルバックアップ以降に変更されたデータのみをバックアップする方式です。
これはトランザクションログをバックアップすることで実現します。

![difference.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565050/18b4e14a-9b78-50db-990b-7811206d04a7.png)

DBMSはユーザーからの変更を直接データファイルに反映するのではなく、まずトランザクションログに記録します。トランザクションログには、データベースに対する変更履歴が時系列順に保存されています。

差分バックアップでは、このトランザクションログをバックアップします。トランザクションログには、前回のフルバックアップ以降の変更履歴が全て含まれているため、これをバックアップすることで、その期間のデータベースの変更をリプレイできます。

図を見ると、②と③のデータは④のトランザクションログに含まれています。したがって、最新のデータを復旧するために必要なファイルは、フルバックアップの①と最新の差分バックアップである④だけです。



差分バックアップには以下のような利点があります。

### メリット
- バックアップ時間の短縮
    - 毎日フルバックアップを取る代わりに、差分バックアップを併用することで、変更された部分だけをバックアップすれば良いため、バックアップにかかる時間を大幅に短縮できます
- バックアップファイルの保存容量の節約
    - フルバックアップでは毎回全データをバックアップするため、保存容量が膨大になりがちです。差分バックアップを利用することで、保存容量を節約できます


### デメリット
一方、欠点としては、リカバリ時にフルバックアップに加えて差分ログの適用が必要となり、手順が増えることが挙げられます。


# 増分バックアップ

増分バックアップは、前回のバックアップ（フルバックアップまたは増分バックアップ）以降に変更されたデータのみをバックアップする方式です。差分バックアップと似ていますが、増分バックアップでは、前回の増分バックアップからの変更差分のみをバックアップします。

![incremental.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2565050/d0fc35a1-f931-dde4-ef03-34e6ca6b6269.png)


図を見ると、増分バックアップでは、各バックアップ間の変更差分のみが保存されています。

- ②は①からの変更差分
- ③は②からの変更差分
- ④は③からの変更差分

このように、増分バックアップでは、バックアップのたびに差分データが蓄積されていきます。

### メリット

- バックアップ時間が短い
    - 変更されたデータのみをバックアップするため、フルバックアップや差分バックアップと比較して、バックアップに要する時間が短くなります
- バックアップファイルの容量が小さい
    - 変更差分のみを保存するため、バックアップファイルの容量を最小限に抑えることができます


### デメリット

- リカバリ手順が複雑になる
    - リカバリする際は、最新のフルバックアップからリストアした後、その時点から最新の増分バックアップまでを順番に適用する必要があります。増分バックアップの数が多いほど、リカバリ手順が複雑になります
- 増分バックアップが破損すると、それ以降の増分バックアップが使えなくなる
    - 増分バックアップは、前回の増分バックアップからの差分のみを保存するため、途中の増分バックアップが破損すると、それ以降の増分バックアップは使えなくなります




# バックアップ方式まとめ
| バックアップ方式 | リカバリコスト | バックアップコスト |                 バックアップ対象                 |
| :--------------: | :------------: | :----------------: | :----------------------------------------------: |
| フルバックアップ |      低い      |        高い        |                     全データ                     |
| 差分バックアップ |     中程度     |       中程度       |       前回のフルバックアップからの変更差分       |
| 増分バックアップ |      高い      |        低い        | 前回のバックアップ（フル or 増分）からの変更差分 |



# まとめ

今回は、DBのバックアップ方式についてまとめました。フルバックアップ、差分バックアップ、増分バックアップにはそれぞれ長所と短所があるため、システムの特性や運用要件に応じて最適な方式を選択することが重要です。

ただし、バックアップファイルだけでは、データを障害発生直前の状態に完全に復旧することはできません。

例えば、毎日5:00にフルバックアップを取得していて、13:00に障害が発生したとします。この場合、5:00から13:00の間にユーザーが行った変更は、障害によって失われてしまいます。

したがって、データを障害直前の状態に復旧するためには、バックアップファイルをデータベースに戻すだけでなく、ユーザーが行った変更を反映させる必要があります。

障害復旧の詳細な手順については**参考文献**[^1]を確認してください。



[^1]: コミック. 達人に学ぶDB設計 徹底指南書 .翔泳社.