はじめに
アプリケーションの接続が残った状態で取得可能なオンラインバックアップはオフラインバックアップの上位互換のようにも思えます。
今回はパフォーマンスやデータの断面ではなく、データ復旧を行うリストア時の違いという観点にて分かりやすく説明しました。
コマンド実行環境
- DB2 v11.5
- CentOS Linux 7 (Core)
オフラインバックアップとは?
アプリケーションの接続を全て切断することでデータベースに対して更新が入らない状態、いわゆる「静止点」を作り出してからバックアップを取る手法です。
実際には以下のようなコマンド群で接続を切断して
$ db2 force application all
$ db2 connect reset
以下コマンドでバックアップを取得します。
$ db2 backup db sample to /tmp/
オンラインバックアップとは?
こちらはアプリケーションを接続しながらバックアップを取得できます。
while true do db2 "insert into sales (SALES_DATE, SALES_PERSON,REGION,SALES) values ('2000/01/01','Hoge1','Hoge2','3')" sleep 1 done
例えば上記のように明示的に接続をかけた状態でも
$ db2 backup db sample online to /tmp/ Backup successful. The timestamp for this backup image is : ...
バックアップファイルが取得できます。
オンラインバックアップのデメリット
一件上位互換のように見えるオンラインバックアップにはデメリットもあり、それはトランザクションログが紛失すればリストアができなくなります。
というのもオフラインバックアップは取得したイメージを指定すれば
$ db2 restore db sample from /tmp taken at ... without rolling forward
リストアに成功します。
しかしオンラインバックアップで取得したイメージに対して同コマンドを発行すると以下のエラーとなります。
SQL2537N Roll-forward is required following the Restore.
これは「オンラインバックアップ実行中にデータベースへ行われた変更を反映し、データベースを整合状態にするためにロールフォワードが必須」だから、要はロールフォワード用のファイルが必要になります。
これらのファイルのありかはdb2 get db cfg
にて確認でき例えば以下のようなパスにログとして保管されています。
Path to log files = /database/data/db2inst1/NODE0000/SQL00003/LOGSTREAM0000/
そして、同ログファイルが破損した場合はイメージはあるのに以下のようにリストアに失敗してしまいます。
$ db2 rollforward database sample to end of backup and complete SQL1273N An operation reading the logs on database "SAMPLE" cannot continue because of a missing log file "S0000003.LOG" on database partition "0" and log stream "0".
このようにリストア時に必要なデータに違いがあります。
終わりに
オンラインバックアップとオフラインバックアップの違いは「トランザクションログが必須か否か」にあります。
公式サイトにも以下のように場合分けがあり、詳細は割愛しますがオフラインを実現できる環境であればオフラインを選択肢として提示しています。
以上、ご参考になれば幸いです。