【SQL入門】バックアップについてまとめ
データベースのバックアップ
データベースのバックアップとは、データベースのデータを別のストレージに複製し、保存することです。
情報はメモリなどの一時的な保存領域ではなくハードディスクなどの磁気記録媒体に記録される。
しかし、ハードディスクも物理的な存在である以上、ある日データを読み書きできなくなってしまう可能性もある。
そのため、多くのDBMSでは、万が一のデータの消失に備えてバックアップの仕組みを備えている。
→ データベースの全内容(テーブル構成や格納されたデータなど)をファイルに出力できるということ
通常の業務システムの場合、バックアップは毎日や毎週などの定期的な間隔で自動的に行われるように設定されている。
出力されたバックアップファイルは、データベースから独立した別の記憶媒体(磁気記憶装置やテープ装置など)にコピーし、大切に保管しなければならない。
万が一にも失われることが許されない極めて重要なデータの場合、地震などで建物ごと破壊されることも想定して、災害復旧対策(Disaster Recovery)の一環としてバックアップ媒体をいくつかの遠隔地に輸送して保管することもある。
バックアップの仕組み
バックアップは、通常、以下の手順で行われます。
-
データの取得
データベースシステムが、その時点でのデータ(テーブル、インデックスなど)をすべて読み取ります。 -
圧縮・整形
取得したデータを、効率的な保存のために圧縮したり、特定の形式に整形したりします。 -
別ストレージへの保存
圧縮・整形されたデータを、バックアップ先として指定された別のストレージ(例: NAS, クラウドストレージ, 外付けHDD)に転送し、保存します。
このプロセスにより、元のデータベースに障害が発生した場合でも、バックアップデータを使ってデータベースを以前の状態に復元できます。これにより、データの損失を防ぎ、システムの可用性を高めることができます。
バックアップの整合性
もし、INSERT文などでデータベースの内容を書き換えている間にバックアップが行われると、作成したバックアップファイルは中途半端な状態となり、バックアップデータとして整合性がとれなくなるリスクがある。
整合性を保ちつつバックアップを行なう最も簡単な方法はオフラインバックアップです。
これは、データベースを停止してからバックアップを行ないます。
しかし、オフラインバックアップ中は一切のデータ処理が行えなくなってしまう。
データベースのバックアップにはデータ量によって短くても数分、長いと数時間かかることもある。この間、データベースが停止してしまうことは状況によっては許されないかもしれません。
そのため、多くのDBMSは、稼働しながら整合性のあるバックアップデータを取得できるオンラインバックアップ機能も備えている。
この機能は便利な反面、制約を伴うこともあるので、製品マニュアルはよく確認する必要がある。
ログファイルのバックアップ
通常のバックアップは1日ごとなどの低い頻度で行なう代わりにデータベースが出力するログファイルを10分周期や1時間周期といった高頻度でバックアップする
高い頻度でバックアップを行えばいいが、バックアップは時間がかかる処理で、あまり頻繁に行なうわけにはいかない
2つのファイルをバックアップ
- データベースの内容: 低頻度(日次、週次、月時など)
- ログファイルの内容: 高頻度(数分ごと〜数時間ごとなど)
データベースのバックアップ (フルバックアップ)
これは、特定の時点におけるデータベース全体の完全なコピーです。
テーブル、インデックス、ビューなど、すべてのデータが含まれます。
目的
災害やハードウェア障害、人為的なミスなど、重大な問題が発生した場合に、その時点の状態までデータベースを完全に復元することです。
特徴
バックアップには時間がかかり、多くのストレージ容量を消費します。
通常、毎日や毎週といった比較的長い間隔で実行されます。
ログファイルのバックアップ (トランザクションログ)
ログファイルには、データベースに対して行われたすべての変更(トランザクション)の記録が、実行された順序で保存されています。これは「ジャーナル」とも呼ばれます。
目的
最後のフルバックアップ以降に行われた変更を、データベースに適用(ロールフォワード)するために使用されます。
これにより、最新の状態まで復旧できます。
また、進行中のトランザクションを元に戻す(ロールバック)ためにも使われます。
特徴
ログファイルは非常に小さく、バックアップも短時間で終わります。そのため、通常は数分から数時間おきといった短い間隔で頻繁に実行されます。
両者の関係と復旧プロセス
両者は組み合わせて使用されます。
まず、直近のデータベースのフルバックアップを使って、データベースを特定の時点の状態に復元します。
次に、その時点以降に取得されたログファイルのバックアップを時系列順に適用し、データベースを障害発生直前の状態まで復旧させます。
このように、データベースのバックアップが「ある時点の静止画」であるのに対し、ログファイルのバックアップは「静止画以降のすべての動き(変更履歴)」であり、両方を組み合わせることで、データの整合性を保ちながら最新の状態への復旧が可能になります。
DBMSが出力するログファイルは、そもそも人間が読むためのものではない
データベースのログはREDOログ(アーカイブログ)またはトランザクションログなどとも呼ばれ、その内容は「それまでに実行したすべてのSQL文」に他ならない
このログファイルを高い頻度でバックアップしておくと、データ消失時にも以下の手順を踏むことで、消失直前の時点までのデータを復元することができる
バックアップからのデータ復元方法
- 最後に取得したデータベースのバックアップを復元する
- ログに記録されているSQL文のうち、「最後のデータベースバックアップ以降に実行されたもの」を再実行する
ロールフォワード(roll forward)
ログに記録されているSQL文を再実行して、障害が発生する直前の状態までデータを更新する処理のこと
まだ実行されていない処理を実行する
cf. ロールバック: 実行した処理を取り消す
参考図書
『スッキリわかるSQL入門 第2版』
Discussion