DB2DBA: 増分バックアップ・差分バックアップ

# DB2の増分バックアップ・差分バックアップ
バックアップの際にDB全体を対象とするのではなく、前回のバックアップ取得時から変更された部分だけを対象とすることで、バックアップファイルを小さくし、所要時間を短縮することができます。

変更された部分のみバックアップする方法としてDB2は増分バックアップと差分バックアップの2種類の方式を提供していますが、マニュアルではそれぞれの違いが以下のように説明されています。

- 増分 (Incremental Backup)
    - 増分バックアップ・イメージは、最新の正常実行された全バックアップ操作の後に変更された、 すべてのデータベース・データのコピーです。 これは累積バックアップ・イメージともいいます。 増分バックアップを取るたびに、その前の増分バックアップ・イメージの内容が含まれるからです。 増分バックアップ・イメージの先行処理イメージは、 常に同じオブジェクトの最新の正常実行された全バックアップになります。

- 差分 (Delta Backup)
    - 差分、または増分差分のバックアップ・イメージは、 当該表スペースの正常実行された最終バックアップ (全、増分、 または差分) の後に変更されたすべてのデータベース・データのコピーです。 これは差分または非累積バックアップ・イメージともいいます。 差分バックアップ・イメージの先行処理イメージは、 その差分バックアップ・イメージ中の個々の表スペースのコピーを含む、 正常実行された最新バックアップになります。

これを読むと、DB2の増分バックアップ・差分バックアップは、一般的な呼び方と意味するところが逆になっていることが分かります。英語のDelta BackupというのもDB2独特の名称です。


# 使用方法
## DB構成パラメータの変更
増分バックアップ・差分バックアップを実行するには、事前にDB構成パラメータ```TRACKMOD```を```ON```にしておく必要があります。デフォルトは```OFF```になっています。TRACKMODの変更を反映するにはDBを再起動する必要があります。

```
db2 => update db cfg using trackmod on
DB20000I  UPDATE DATABASE CONFIGURATION コマンドが正常に完了しました。
SQL1363W  即時変更のためにサブミットされた 1
つ以上のパラメーターが動的に変更されませんでした。
これらの構成パラメーターの場合、構成パラメーターの変更が有効になる前に、データベ
ースをシャットダウンして再アクティブ化する必要があります。
db2 => connect reset
DB20000I  SQL コマンドが正常に完了しました。
db2 => deactivate db sample
DB20000I  DEACTIVATE DATABASE コマンドが正常に完了しました。
db2 => connect to sample

   データベース接続情報

 データベース・サーバー = DB2/NT64 11.1.2.2
 SQL 許可 ID            = SVC34
 ローカル・データベース別名 = SAMPLE

db2 => get db cfg

       データベースのデータベース構成

-- 省略

トラック変更ページ                           (TRACKMOD) = YES

-- 省略
```

## 増分バックアップ
```BACKUP DB```コマンドにオプション```INCREMENTAL```を指定します。

```
BACKUP DB dbname INCREMENTAL TO dir
```

## 差分バックアップ
```BACKUP DB```コマンドにオプション```INCREMENTAL DELTA```を指定します。

```
BACKUP DB dbname INCREMENTAL DELTA TO dir
```

## リストア
リストアコマンドにオプション```INCREMENTAL AUTO```を指定すると、datetimeで識別される増分バックアップ・差分バックアップイメージをリストアするために必要な全てのバックアップイメージが、適切な順序で自動的にリストアされます。

```
RESTORE DB dbname INCREMENTAL AUTO FROM dir TAKEN AT datetime
```


# 試してみた
## シナリオ
フルバックアップ、増分バックアップ、差分バックアップを1つずつ取得します。その後、削除されたデータを差分バックアップから復旧してみます。

SAMPLEデータベースを使用していますが、事前にアーカイブロギング方式にしてあります。

## 手順と実行結果
### フルバックアップ取得
増分バックアップ・差分バックアップを実行するため、一度フルバックアップをとっておきます。

```
db2 => backup db sample online to C:\DB2\bkup\test

バックアップは成功しました。 このバックアップ・イメージのタイム・スタンプは
20180225012324 です。
```

### 更新1回目 & 増分バックアップ
DBに対する更新処理としてテーブルを1つ作成し、増分バックアップを取得します。

```
db2 => connect to sample

   データベース接続情報

 データベース・サーバー = DB2/NT64 11.1.2.2
 SQL 許可 ID            = SVC34
 ローカル・データベース別名 = SAMPLE

db2 => create table test(id int)
DB20000I  SQL コマンドが正常に完了しました。
db2 => backup db sample online incremental to C:\DB2\bkup\test

バックアップは成功しました。 このバックアップ・イメージのタイム・スタンプは
20180225012453 です。
```

### 更新2回目 & 差分バックアップ
先ほど作成したtestテーブルにレコードをINSERTし、差分バックアップを取得します。

```
db2 => connect to sample

   データベース接続情報

 データベース・サーバー = DB2/NT64 11.1.2.2
 SQL 許可 ID            = SVC34
 ローカル・データベース別名 = SAMPLE

db2 => insert into test values(999)
DB20000I  SQL コマンドが正常に完了しました。
db2 => select * from test

ID
-----------
        999

  1 レコードが選択されました。

db2 => backup db sample online incremental delta to C:\DB2\bkup\test

バックアップは成功しました。 このバックアップ・イメージのタイム・スタンプは
20180225012521 です。
```

### バックアップの確認
バックアップファイルのサイズが フル > 増分 > 差分 となっていることが分かります。

```
db2 => !dir C:\DB2\bkup\test
 ドライブ C のボリューム ラベルは Windows です
 ボリューム シリアル番号は 4A74-5036 です

 C:\DB2\bkup\test のディレクトリ

2018/02/25  01:25    <DIR>          .
2018/02/25  01:25    <DIR>          ..
2018/02/25  01:23       176,390,144 SAMPLE.0.DB2.DBPART000.20180225012324.001
2018/02/25  01:24        99,233,792 SAMPLE.0.DB2.DBPART000.20180225012453.001
2018/02/25  01:25        11,055,104 SAMPLE.0.DB2.DBPART000.20180225012521.001
               3 個のファイル         286,679,040 バイト
               2 個のディレクトリ  30,853,083,136 バイトの空き領域
db2 => list history backup since 201802250123 for sample

                    sample の履歴ファイルのリスト

突き合わせファイル項目数 = 3


 Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
 -- --- ------------------ ---- --- ------------ ------------ --------------
  B  D  20180225012324001   N    D  S0000001.LOG S0000001.LOG
 ----------------------------------------------------------------------------
  4 個の表スペースを含みます:

 00001 SYSCATSPACE
 00002 USERSPACE1
 00003 IBMDB2SAMPLEREL
 00004 IBMDB2SAMPLEXML
 ----------------------------------------------------------------------------
    Comment: DB2 BACKUP SAMPLE ONLINE
 開始時刻: 20180225012324
   終了時刻: 20180225012329
     状況: A
 ----------------------------------------------------------------------------
  EID: 10 ロケーション: C:\DB2\bkup\test


 Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
 -- --- ------------------ ---- --- ------------ ------------ --------------
  B  D  20180225012453001   O    D  S0000004.LOG S0000004.LOG
 ----------------------------------------------------------------------------
  4 個の表スペースを含みます:

 00001 SYSCATSPACE
 00002 USERSPACE1
 00003 IBMDB2SAMPLEREL
 00004 IBMDB2SAMPLEXML
 ----------------------------------------------------------------------------
    Comment: DB2 BACKUP SAMPLE ONLINE
 開始時刻: 20180225012453
   終了時刻: 20180225012456
     状況: A
 ----------------------------------------------------------------------------
  EID: 14 ロケーション: C:\DB2\bkup\test


 Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
 -- --- ------------------ ---- --- ------------ ------------ --------------
  B  D  20180225012521001   E    D  S0000007.LOG S0000007.LOG
 ----------------------------------------------------------------------------
  4 個の表スペースを含みます:

 00001 SYSCATSPACE
 00002 USERSPACE1
 00003 IBMDB2SAMPLEREL
 00004 IBMDB2SAMPLEXML
 ----------------------------------------------------------------------------
    Comment: DB2 BACKUP SAMPLE ONLINE
 開始時刻: 20180225012521
   終了時刻: 20180225012522
     状況: A
 ----------------------------------------------------------------------------
  EID: 18 ロケーション: C:\DB2\bkup\test
```

LIST HISTORYコマンドでは、TYPEからバックアップの種類が識別できます。

|TYPE|バックアップおよびリストア操作タイプ|
|:--:|:--------------------------------|
|D|デルタ・オフライン|
|E|デルタ・オンライン|
|F|オフライン|
|I|増分オフライン|
|M|Merged|
|N|オンライン|
|O|増分オンライン|
|R|再ビルド|



### 障害の発生
新人のS君が誤ってtestテーブルのデータをDELETEしてしまいました。

```
db2 => connect to sample

   データベース接続情報

 データベース・サーバー = DB2/NT64 11.1.2.2
 SQL 許可 ID            = SVC34
 ローカル・データベース別名 = SAMPLE

db2 => delete from test
DB20000I  SQL コマンドが正常に完了しました。
db2 => select * from test

ID
-----------

  0 レコードが選択されました。
```

### リストア
testテーブルのデータを復旧するため、最後に取得した差分バックアップをリストアします。

```
db2 => restore db sample incremental auto from C:\DB2\bkup\test taken at 20180225012521
SQL2539W  リストアするバックアップ・イメージに指定された名前がターゲット・データ
ベースの名前と同じになっています。
バックアップ・イメージ・データベースと同じ既存データベースをリストアすると、現行
のデータベースがバックアップ・バージョンによって上書きされます。
続けますか。 (y/n) y
DB20000I  RESTORE DATABASE コマンドが正常に完了しました。
db2 => rollforward db sample to end of backup and complete

                                 ロールフォワード状況

 入力データベース別名                   = sample
 状況を返したメンバーの数               = 1

 メンバー ID                            = 0
 ロールフォワード状況                   = 非ペンディング
 次に読み込むログ・ファイル             =
 処理したログ・ファイル            = S0000007.LOG - S0000008.LOG
 最後にコミットしたトランザクション     = 2018-02-24-16.25.20.000000 UTC

DB20000I  ROLLFORWARD コマンドが正常に完了しました。
```

RESTOREコマンドの結果には表示されていませんが、適用されるバックアップイメージの順序は以下のようにdb2ckrstコマンドで確認できます。

```
db2 => !db2ckrst -d sample -t 20180225012521

Suggested restore order of images using timestamp 20180225012521 for
database sample.
====================================================================
 restore db sample incremental taken at 20180225012521
 restore db sample incremental taken at 20180225012324
 restore db sample incremental taken at 20180225012453
 restore db sample incremental taken at 20180225012521
====================================================================
```

### 復旧の確認
無事データを復旧できました。

```
db2 => connect to sample

   データベース接続情報

 データベース・サーバー = DB2/NT64 11.1.2.2
 SQL 許可 ID            = SVC34
 ローカル・データベース別名 = SAMPLE

db2 => select * from test

ID
-----------
        999

  1 レコードが選択されました。
```

# 参考資料
- atmarkIT
    - [差分バックアップと増分バックアップの違い](http://www.atmarkit.co.jp/ait/articles/0306/14/news003.html) ※繰り返しになるが、DB2では両者の意味が逆転している
- IBM Knowledge Center
    - DB2 for Linux UNIX and Windows 11.1.0
        - [増分バックアップおよびリカバリー](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.admin.ha.doc/doc/c0006069.html)
        - [増分バックアップ・イメージからのリストア](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.admin.ha.doc/doc/t0006070.html)
        - [LIST HISTORYコマンド](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001991.html)
        - [db2ckrst - 増分リストア・イメージ順序の検査コマンド](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0004471.html)