【備忘録】Db2 バックアップ・リストア手順 

# 1. はじめに

Db2 における データベースの **オフライン・バックアップ**、**オンライン・バックアップ**、および **リストア** の手順をまとめます。

# 2. 準備

**バックアップ**,**リストア**の手順を確認するにあたって、
Db2環境を準備し、必要なオブジェクト（データベース, テーブル）を作成します。

## 2-1. Db2環境準備

Db2環境を準備します。
Db2の導入方法については、以下リンク先の記事に記載しています。

・Qiita: 【備忘録】Db2 インストール手順まとめ（Linux）
https://qiita.com/Haruka-Ogawa/items/9576399209b32f3016ea

・Qiita: 【備忘録】Docker版 Db2環境 取得手順
https://qiita.com/Haruka-Ogawa/items/0a4696ded4fa40e5e983

ここでは Dockerで用意したDb2環境を使用します。

## 2-2. データベース・テーブル作成

バックアップ, リストアを実行するにあたって、
データベースとテーブルを作成します。


データベース(*SAMPDB*) を作成します。

```
$ db2 create db SAMPDB
DB20000I  The CREATE DATABASE command completed successfully.
```

・Knowledge Center：CREATE DATABASE コマンド
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001941.html


作成したデータベース(*SAMPDB*)に接続し、
テーブル(*tbl1*)を作成、データの挿入を行います。

- **データベース接続**

```
$ db2 connect to SAMPDB

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.5.0
 SQL authorization ID   = DB2INST1
 Local database alias   = SAMPDB
```

- **テーブル作成**

```
$ db2 "CREATE TABLE tbl1(col1 int not null, col2 char(10))"
DB20000I  The SQL command completed successfully.

$ db2 "INSERT INTO tbl1 VALUES(1, 'TEST1')"
DB20000I  The SQL command completed successfully.
```

・Knowledge Center：CREATE TABLE ステートメント
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000927.html

作成したテーブル(*tbl1*)を確認します。

```
$ db2 "SELECT * FROM tbl1"

COL1        COL2      
----------- ----------
          1 TEST1     

  1 record(s) selected.
```

・Knowledge Center：SELECT ステートメント
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000993.html


## 注意

今回は、ロールフォワードを用いて ログの最後までリストアします。
ロギング方式が "循環ロギング" に設定されている場合、ロールフォワードが実行できないので ご注意ください。

・簡単! Db2の運用: 第5回 ログと回復管理
https://developer.ibm.com/jp/articles/j-d-db2maintenance05/

・Knowledge Center： データベース・ロギング
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.ha.doc/doc/c0006073.html

#  3. バックアップ・リストア手順

## 3-1. オフライン・バックアップ

**オフライン・バックアップ**と**リストア**の大まかな流れは、
以下の通りになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174250/3e0034cb-fdaa-f2d1-e3b2-736e7e96781b.png)


以下に **オフライン・バックアップ**の手順を記述します。

### ① バックアップ

- **バックアップ取得**

**BACKUP DATABASE** コマンドで オフライン・バックアップを実行します。

構文は以下の通りです。

```
BACKUP DATABASE <DB名> TO <バックアップ・イメージ保管場所>
```


実行例は以下の通りです。

```
$ db2 "BACKUP DATABASE SAMPDB TO /work/backup/"

Backup successful. The timestamp for this backup image is : 20210310112038
```

Knowledge Center：BACKUP DATABASE コマンド
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001933.html

**タイムスタンプ**(*20210310112038*)はリストア時に使用するので 控えておきます。


### ② リストア準備

リストア処理の動作を確認するため、
テーブルを更新(データ挿入)し、擬似的に障害が発生したとして データベースを削除します。

- **テーブル更新**

テーブル(*tbl1*)に対し、更新(データ挿入)を実行します。
実行例は以下の通りです。

```
$ db2 "INSERT INTO tbl1 VALUES(2, 'TEST2')"
DB20000I  The SQL command completed successfully.
```

テーブル(*tbl1*) を確認すると、以下の通りになっています。

```
$ db2 "SELECT * FROM tbl1"

COL1        COL2      
----------- ----------
          1 TEST1     
          2 TEST2     

  2 record(s) selected.
```


- **ログのアーカイブ**

バックアップ取得後の更新を リストアしたデータベースに反映するためには ログによるロールフォワードが必要になります。
ここで ログのアーカイブを実施します。
アーカイブ実行の前に、DB(*SAMPDB*)から切断します。

```
$ db2 terminate
DB20000I  The TERMINATE command completed successfully.
```

**ARCHIVE** コマンドを実行し、ログをアーカイブします。

構文は以下の通りです。

```
ARCHIVE LOG FOR DATABASE <DB名>
```

実行例は以下の通りです。

```
$ db2 ARCHIVE LOG FOR DATABASE SAMPDB
DB20000I  The ARCHIVE LOG command completed successfully.
```

・Knowledge Center：ARCHIVE LOG コマンド
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0004476.html

- **データベース削除**

データベース(*SAMPDB*)の削除を実行します。
実行例は以下の通りです。

削除するにあたって、データベースを切断します。

```
$ db2 terminate
DB20000I  The TERMINATE command completed successfully.
```

データベースを削除します。

```
$ db2 drop db SAMPDB
DB20000I  The DROP DATABASE command completed successfully.
```

### ③ リストア

- **リストア**

**RESTORE DATABASE** コマンドで リストアを実行します。

コマンドの構文は以下の通りです。

```
RESTORE DATABASE <DB名> FROM <バックアップ・イメージ保管場所> TAKEN AT <タイムスタンプ>
```

実行例は以下の通りです。

```
$  db2 "RESTORE DATABASE SAMPDB FROM /work/backup TAKEN AT 20210310112038"
DB20000I  The RESTORE DATABASE command completed successfully.
```

・Knowledge Center：RESTORE DATABASE コマンド
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001976.html




- **ロールフォワード**

**ROLLFORWARD DATABASE**コマンドで ロールフォワードを実行します。
**TO**オプションでは**END OF LOGS** を指定し、
ログの最後までロールフォワードするようにします。

構文は以下の通りです。

```
ROLLFORWARD DATABASE <DB名> TO END OF LOGS
```

実行例は以下の通りです。

```
$ db2 "ROLLFORWARD DATABASE SAMPDB TO END OF LOGS"

                                 Rollforward Status

 Input database alias                   = SAMPDB
 Number of members have returned status = 1

 Member ID                              = 0
 Rollforward status                     = DB  working
 Next log file to be read               = S0000015.LOG
 Log files processed                    =  -
 Last committed transaction             = 2021-03-10-11.31.16.000000 UTC

DB20000I  The ROLLFORWARD command completed successfully.
```

・Knowledge Center：ROLLFORWARD DATABASE コマンド
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001978.html

- **ロールフォワード完了**

**ROLLFORWARD DATABASE**コマンドで **COMPLETE** オプションを指定し、 ロールフォワード処理を完了します。

構文は以下の通りです。

```
ROLLFORWARD DATABASE <DB名> COMPLETE
```

実行例は以下の通りです。

```
$ db2 "ROLLFORWARD DATABASE SAMPDB COMPLETE"

                                 Rollforward Status

 Input database alias                   = sampdb
 Number of members have returned status = 1

 Member ID                              = 0
 Rollforward status                     = not pending
 Next log file to be read               =
 Log files processed                    =  -
 Last committed transaction             = 2021-03-10-11.31.16.000000 UTC

DB20000I  The ROLLFORWARD command completed successfully.
```

・Knowledge Center：ROLLFORWARD DATABASE コマンド
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001978.html

- **確認**

データベース(*SAMPDB*)に接続し、テーブル(*tbl1*)の中身を確認します。

データベース(*SAMPDB*)に接続します。
実行例は以下の通りです。

```
$ db2 connect to SAMPDB

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.5.0
 SQL authorization ID   = DB2INST1
 Local database alias   = SAMPDB
```

テーブル(*tbl1*)を確認します。
実行例は以下の通りです。

```
$ db2 "SELECT * FROM tbl1"

COL1        COL2      
----------- ----------
          1 TEST1     
          2 TEST2     

  2 record(s) selected.
```

データベースが無事リストアされていることが確認できました。

## 3-2. オンライン・バックアップ

**オンライン・バックアップ**と**リストア**の大まかな流れは、
以下の通りになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174250/2ddc8dce-a8d0-3776-b8f6-4272651b1fd1.png)


以下に **オンライン・バックアップ**の手順を記述します。

### ① バックアップ

**BACKUP DATABASE** コマンドで オンライン・バックアップを実行します。
オンライン・バックアップを取得するには、**ONLINE** オプションを指定します。
また、**INCLUDE LOGS** オプションを指定し、
バックアップ・イメージに ロールフォワードで必要な ログ・ファイルを含めます。

コマンドの構文は以下の通りです。

```
BACKUP DATABASE <DB名> ONLINE TO <バックアップ・イメージ保管場所> INCLUDE LOGS
```

実行例は以下の通りです。

```
$ db2 "BACKUP DATABASE SAMPDB ONLINE TO /work/backup/ INCLUDE LOGS"

Backup successful. The timestamp for this backup image is : 20210310133036
```

・Knowledge Center：BACKUP DATABASE コマンド
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001933.html

**タイムスタンプ**(*20210310133036*)はリストア時に使用するので 控えておきます。


### ② リストア準備

リストア処理の動作を確認するため、
テーブルを更新(データ挿入)し、擬似的に障害が発生したとして データベースを削除します。

- **テーブル更新**

テーブル(*tbl1*)に対し、更新(データ挿入)を実行します。
実行例は以下の通りです。

```
$ db2 "INSERT INTO tbl1 VALUES(2, 'TEST2')"
DB20000I  The SQL command completed successfully.
```

テーブル(*tbl1*) を確認すると、以下の通りになっています。

```
$ db2 "SELECT * FROM tbl1"

COL1        COL2      
----------- ----------
          1 TEST1     
          2 TEST2     

  2 record(s) selected.
```

- **データベース削除**

データベース(*SAMPDB*)の削除を実行します。
実行例は以下の通りです。

削除するにあたって、データベースを切断します。

```
$ db2 terminate
DB20000I  The TERMINATE command completed successfully.
```

データベースを削除します。

```
$ db2 drop db SAMPDB
DB20000I  The DROP DATABASE command completed successfully.
```



### ③ リストア


- **ログ抽出**

**RESTORE DATABASE** コマンドで バックアップ・イメージに含めた ログを抽出します。

コマンドの構文は以下の通りです。

```
RESTORE DATABASE <DB名> LOGS FROM <バックアップ・イメージ保管場所> TAKEN AT <タイムスタンプ> LOGTARGET <ログ・ファイル抽出のターゲット・ディレクトリー>
```

実行例は以下の通りです。

```
$ db2 "RESTORE DATABASE SAMPDB LOGS FROM /work/backup/ TAKEN AT 20210310133036 LOGTARGET /work/logtarget"
DB20000I  The RESTORE DATABASE command completed successfully.
```

・Knowledge Center：RESTORE DATABASE コマンド
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001976.html

- **リストア**

**RESTORE DATABASE** コマンドで リストアを実行します。

コマンドの構文は以下の通りです。

```
RESTORE DATABASE <DB名> FROM <バックアップ・イメージ保管場所> TAKEN AT <タイムスタンプ>
```

実行例は以下の通りです。

```
$  db2 "RESTORE DATABASE SAMPDB FROM /work/backup/ TAKEN AT 20210310133036"
DB20000I  The RESTORE DATABASE command completed successfully.
```

・Knowledge Center：RESTORE DATABASE コマンド
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001976.html


- **ロールフォワード**

ロールフォワードは **ROLLFORWARD DATABASE**コマンドで実行します。
**TO**オプションでは**END OF LOGS** を指定し、
ログの最後までロールフォワードするようにします。
また、**OVERFLOW LOG PATH**オプションにて 先ほどバックアップ・イメージから抽出したログを指定します。

```
ROLLFORWARD DATABASE <DB名> TO END OF LOGS OVERFLOW LOG PATH(<ログ・ファイル抽出のターゲット・ディレクトリー>)
```

実行例は以下の通りです。

```
$ db2 "ROLLFORWARD DATABASE SAMPDB TO END OF LOGS OVERFLOW LOG PATH(/work/logtarget)"

                                 Rollforward Status

 Input database alias                   = SAMPDB
 Number of members have returned status = 1

 Member ID                              = 0
 Rollforward status                     = DB  working
 Next log file to be read               = S0000008.LOG
 Log files processed                    = S0000005.LOG - S0000006.LOG
 Last committed transaction             = 2021-03-10-13.31.26.000000 UTC

DB20000I  The ROLLFORWARD command completed successfully.

```

・Knowledge Center：ROLLFORWARD DATABASE コマンド
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001978.html

- **ロールフォワード完了**

**ROLLFORWARD DATABASE**コマンドで **COMPLETE** オプションを指定し、 ロールフォワード処理を完了します。

構文は以下の通りです。

```
ROLLFORWARD DATABASE <DB名> COMPLETE
```

実行例は以下の通りです。

```
$ db2 "ROLLFORWARD DATABASE SAMPDB COMPLETE"

                                 Rollforward Status

 Input database alias                   = SAMPDB
 Number of members have returned status = 1

 Member ID                              = 0
 Rollforward status                     = not pending
 Next log file to be read               =
 Log files processed                    = S0000005.LOG - S0000006.LOG
 Last committed transaction             = 2021-03-10-13.31.26.000000 UTC

DB20000I  The ROLLFORWARD command completed successfully.
```

・Knowledge Center：ROLLFORWARD DATABASE コマンド
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0001978.html

- **確認**

データベース(*SAMPDB*)に接続し、テーブル(*tbl1*)の中身を確認します。

データベース(*SAMPDB*)に接続します。
実行例は以下の通りです。

```
$ db2 connect to SAMPDB

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.5.0
 SQL authorization ID   = DB2INST1
 Local database alias   = SAMPDB
```

テーブル(*tbl1*)を確認します。
実行例は以下の通りです。

```
$ db2 "SELECT * FROM tbl1"

COL1        COL2      
----------- ----------
          1 TEST1     
          2 TEST2     

  2 record(s) selected.
```

データベースが無事リストアされていることが確認できました。


# 4. おわりに

Db2における バックアップ手順についてまとめました。
ここでは データベースのフルバックアップの方法について まとめましたが、
その他に 表スペース 単位でのバックアップ や 増分バックアップなどがあります。

・Knowledge Center：バックアップとリカバリーの計画の作成
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.ha.doc/doc/c0005945.html

# 参考情報

・Knowledge Center：データ・リカバリー
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.ha.doc/doc/c0052073.html

~~・これだけはおさえたい Db2 の運用: 障害回復のためのバックアップ・リカバリー~~
~~https://developer.ibm.com/jp/technologies/data-management/articles/j-d-db2bestpractice05/~~


~~・簡単! Db2の運用: 第5回 ログと回復管理~~
~~https://developer.ibm.com/jp/articles/j-d-db2maintenance05/~~