Db2uBackup / Db2uRestore による Db2バックアップ・リストア

## はじめに

OpenShift/Kubernetes環境でDb2を動かすには、マイクロサービスとして開発される、k8s環境専用のDb2製品を導入します。
このDb2は、[Db2 for Red Hat OpenShift and Kubernetes](https://www.ibm.com/docs/en/db2/11.5?topic=deployments-db2-rhos-k8s)、別名Db2Uとも呼ばれます。
Db2として公式の Kubernetes Operator が提供され、導入・バックアップリストアのためのカスタムリソースが利用できます。

Db2 for OpenShift のバックアップには、いくつかの方法が提供されます。

- [BACKUPコマンド(従来のオンプレミス版Db2とほぼ同じ)](https://www.ibm.com/docs/en/db2/11.5?topic=up-online-backup)
- [ストレージ機能を利用したスナップショット](https://www.ibm.com/docs/en/db2/11.5?topic=up-performing-snapshot-backup-db2-container-commands)
- [Velero (Kubernetes環境に特化したバックアップツール)](https://www.ibm.com/docs/en/db2/11.5?topic=db2-velero-backup-restore)
- Db2バックアップ用に提供されるカスタムリソース [Db2uBackup](https://www.ibm.com/support/pages/node/6962831), [Db2uRestore](https://www.ibm.com/support/pages/node/6962833) (2023.07時点 TechPreview)

カスタムリソース Db2uBackup, Db2uRestoreは、OPC WebコンソールからDb2のバックアップ・リストアを実施するためのインターフェースを提供してくれるものです。
GUI画面でバックアップ、リストアそれぞれの詳細なオプションを指定することができます。
裏では、Db2 BACKUP DATABASE コマンド、RESTORE DATABASE コマンドが実行されます。

まだテクニカルプレビュー扱いのためか、Db2製品マニュアルにはこの機能は登場しません。
しかしGUI画面で作業を進められるため、直感的に使うことができます。



## 環境

- Red Hat OpenShift Kubernetes Service (ROKS) 上に Db2 for RHOS and k8s をデプロイ

|      コンポーネント       |      バージョン      |
| :----------------------- | :------------------ |
|         OpenShift         |       4.10.52        |
| OpenShift Data Foundation | odf-operator.v4.10.9 |
|     Db2 for OpenShift     |      s11.5.8.0-cn2       |

参考：[Db2マニュアル Db2 for RHOS and K8s > 11.5.8 > Installing Db2](https://www.ibm.com/docs/en/db2/11.5?topic=1158-installing-db2)





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

### 全体の流れ

以下の流れで取得します。
バックアップを取得した後、データの一部を削除します。(ユーザミスによりデータを消し込んでしまった）
その後、リストアにより、データが復元され元の状態に戻ったことを確認します。

1. 検証開始前のデータ内容確認
2. Db2uBackup API実行(バックアップ取得)
3. バックアップ取得後のデータ編集
4. Db2uRestore API実行(リストア)
5. リストア後のデータ内容確認

### Step1. 検証開始前のデータ内容確認

T1表に3行格納した状態で開始します
```
[db2inst1@c-db2ucluster-4-db2u-0 - Db2U db2inst1]$ date ; db2 "select * from t1"
Wed Jun  7 07:37:33 UTC 2023

C1          C2
----------- --------------------------------
          1 test data1
          2 test data2
          3 test data3

  3 record(s) selected.

[db2inst1@c-db2ucluster-4-db2u-0 - Db2U db2inst1]$
```

### Step2. Db2uBackup API実行(バックアップ取得)

#### (1)バックアップ取得

OCP Webコンソールを開き、「Operator」＞「インストール済みのOperator」 の一覧から、「IBM Db2」(Db2 for RHOS and k8s の Operator) をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/615dc008-3184-eaa4-1130-36645ad524f8.png)

「Db2u Backup」APIの「インスタンスの作成」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/cc78ba98-b160-ad81-1817-d5c2eaaf6fb4.png)

画面右端にある「Db2uBackupの作成」を押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/cb27d95e-7111-2317-b5c8-bbdd682fae3f.png)

YAMLビューが開きます。
入力項目を把握するためフォームビューに切り替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/b8977d36-348f-3f8c-4ae1-4dd42664a6a1.png)

フォームビューで必要な設定項目を編集し「作成」を押下します。

| 項目名 | 概要 | 
|:-|:-|
| 名前  | 取得するバックアップに付与する名前  | 
| Db2uName  | バックアップ取得対象のDb2uの名称<br>(Db2uCluster OR Db2uInstanceのデプロイ名)  | 
| Db Name  | バックアップ取得対象のデータベース名<br>(デフォルトではBLUDB)  | 
| Backup Type  | バックアップ種別 [online\|offline\|incremental]|  

(入力後の画面例)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/0512dcae-c4d0-f514-9799-82b2c3de154f.png)

バックアップ取得のステータスは、Db2u Operator画面「Db2u Backup」タブで確認することができます。
 * バックアップ取得中は、最終更新「進行中」と出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/9bf9c293-4421-184d-623c-40e7cf280ba6.png)

 * バックアップ取得完了すると、ステータス「Completed」と変わります。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/c2d5ce4f-7ca9-3e3d-a1d1-128c5af4b2a4.png)

この画面(Db2u Backupタブ)からリストアすることはできません。
Db2uBackupオブジェクトの端にある三点メニューから実施できるのは、編集と削除のみです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/a35d50d5-829a-0e32-16bf-321a0ba97062.png)

####(2)バックアップ取得確認

Db2uBackup API の呼び出しによって、Db2 BACKUPコマンドが実行されていることを確認します。

Db2u Podにログインします
```
# oc rsh c-db2ucluster-4-db2u-0 bash
Defaulted container "db2u" out of: db2u, init-labels (init), init-kernel (init)
[db2uadm@c-db2ucluster-4-db2u-0 /]$ su - db2inst1
Last login: Thu Jul 27 16:11:38 UTC 2023
```

Db2uのデフォルトのバックアップイメージ配置先ディレクトリに移動し、バックアップ・イメージが作成されていることを確認します
```
[db2inst1@c-db2ucluster-4-db2u-0 - Db2U backup_off_1]$ pwd
/mnt/backup/SAMPLEDB/db2ubackup-4-1/backup_off_1
[db2inst1@c-db2ucluster-4-db2u-0 - Db2U backup_off_1]$ ls -la
total 557224
drwxrwxr-x. 2 db2inst1 db2iadm1         1 Jun  7 07:32 .
drwxr-xr-x. 4 db2inst1 db2iadm1         2 Jun  7 07:31 ..
-rw-rw----. 1 db2inst1 db2iadm1 570597376 Jun  7 07:32 SAMPLEDB.0.db2inst1.DBPART000.20230607073217.001
[db2inst1@c-db2ucluster-4-db2u-0 - Db2U backup_off_1]$
```

[db2ckbkpコマンド](https://www.ibm.com/docs/ja/db2/11.5?topic=commands-db2ckbkp-check-backup)を利用し、Db2 BACKUPコマンドにより作成されたバックアップ・イメージであること、バックアップ・イメージの状態に問題がないことを確認します。
```
[db2inst1@c-db2ucluster-4-db2u-0 - Db2U backup_off_1]$ db2ckbkp ./SAMPLEDB.0.db2inst1.DBPART000.20230607073217.001

[1] Buffers processed:  ###################################

Image Verification Complete - successful.
```

-h オプションを付与して再度db2ckbkpコマンドを実行し、バックアップ取得対象DB名や取得時刻、Db2バージョンなどの詳細情報も確認します。
```
[db2inst1@c-db2ucluster-4-db2u-0 - Db2U backup_off_1]$ db2ckbkp -h ./SAMPLEDB.0.db2inst1.DBPART000.20230607073217.001


=====================
MEDIA HEADER REACHED:
=====================
        Server Database Name           -- SAMPLEDB
        Server Database Alias          -- SAMPLEDB
        Client Database Alias          -- SAMPLEDB
        Timestamp                      -- 20230607073217
        Database Partition Number      -- 0
        Instance                       -- db2inst1
        Database Configuration Type    -- 0 (Non-shared data)
        Sequence Number                -- 1
        Database Member ID             -- 0
        Release ID                     -- 0x1500 (DB2 v11.5.8.0)
        AL version                     -- V:11 R:5 M:8 F:0 I:0 SB:0
        Database Seed                  -- 0xCD95C324
        DB Comment's Codepage (Volume) -- 0
        DB Comment (Volume)            --
        DB Comment's Codepage (System) -- 0
        DB Comment (System)            --
        Authentication Value           -- 255 (Not specified)
        Backup Mode                    -- 0 (Offline)
        Includes Logs                  -- 0 (No)
        Compression                    -- 2 (Encrypted)
        Backup Type                    -- 0 (Database-level)
        Backup Granularity             -- 0 (Non-incremental)
        Merged Backup Image            -- 0 (No)
        Status Flags                   -- 0x1021
                                          Consistent across all members
                                          LOGARCHMETH1 is set
                                          Database uses default primary log path
        System Catalogs in this image  -- 1 (Yes)
        Catalog Partition Number       -- 0
        DB Codeset                     -- UTF-8
        DB Territory                   -- JP
        LogID                          -- 1686015744
        LogPath                        -- Default
        Backup Buffer Size             -- 16781312 (4097 4K pages)
        Number of Sessions             -- 1
        Platform                       -- 0x1E (Linux-x86-64)
        Encrypt Info Flags             -- 0x1
                                          Source DB was encrypted

 The proper image file name would be:
SAMPLEDB.0.db2inst1.DBPART000.20230607073217.001


[1] Buffers processed:  ###################################

Image Verification Complete - successful.

[db2inst1@c-db2ucluster-4-db2u-0 - Db2U backup_off_1]$

```

想定通り、Db2のバックアップが取得されていることが確認できました。

### Step3. バックアップ取得後のデータ編集

T1表からレコードを1行削除します（→元々3行だったが2行になった）

```
[db2inst1@c-db2ucluster-4-db2u-0 - Db2U db2inst1]$ date ; db2 "delete from t1 where c1=3"
Wed Jun  7 10:32:52 UTC 2023
DB20000I  The SQL command completed successfully.
[db2inst1@c-db2ucluster-4-db2u-0 - Db2U db2inst1]$ date ; db2 "select * from t1"
Wed Jun  7 10:32:55 UTC 2023

C1          C2
----------- --------------------------------
          1 test data1
          2 test data2

  2 record(s) selected.

[db2inst1@c-db2ucluster-4-db2u-0 - Db2U db2inst1]$

```

### Step4. Db2uRestore API実行(リストア)

OCP Webコンソールよりリストアを行います。

Db2 Operator の詳細画面から「Db2u Restore」＞「インスタンスの作成」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/ad1d99cc-c1a0-935d-02bd-66f0fd604dd2.png)

「Db2uRestoreの作成」ボタンを押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/ef37a7dc-ded6-0556-0244-3fcc36fb6be2.png)

リストアにあたり最低限必要となる設定項目を指定し「作成」を押下します。

| 項目名 | 概要 | 
|:-|:-|
| 名前  | 今回実施するリストア処理につける名前  | 
| Db2uName  | リストア実施対象のDb2uの名称<br>(Db2uCluster OR Db2uInstanceのデプロイ名)  | 
| DbuBackup  | リストアを行うDb2uBackupの名称  | 


(入力後の画面例)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/60242222-fd37-f911-608b-b4dd7c172b95.png)

リストア処理中は、最終更新の列に「進行中」と表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/a0705ce9-e17a-40d6-e023-4b757e3b29a1.png)

リストアが完了するとステータス列が「Complete」に変わります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468682/0fe4223f-ecd4-4085-c746-c3c7899d3461.png)

これでリストアが完了しました。


### Step5. リストア後のデータ内容確認

T1表のデータを確認し、リストアができていることを確認します
```
[db2inst1@c-db2ucluster-4-db2u-0 - Db2U db2inst1]$ date ; db2 "select * from t1"
Wed Jun  7 11:08:10 UTC 2023

C1          C2
----------- --------------------------------
          1 test data1
          2 test data2
          3 test data3

  3 record(s) selected.

[db2inst1@c-db2ucluster-4-db2u-0 - Db2U db2inst1]$

```

元々3行格納されていたT1表からバックアップ取得後に1行削除し、2行になっていました。
リストア完了後に確認すると、3行に戻っています。
バックアップ取得時点のデータに戻ったことが確認できました。


## 補足

#### Db2uBackup / Db2uRestore で選択可能なオプション

Db2U 11.5.8-cn2時点ではまだサポートがありませんが、ロールフォワード含め以下のようなオプションも選択可能になりそうです。

- 表スペース単位バックアップリストア
- スキーマ単位のバックアップリストア
- リストアオプション指定(End-of-Backup / PIT / End-of-logs)
- バックアップ取得先指定（現在はDiskのみ、他オプション不明）

#### バックアップ・リストア時のYaml

```yaml: db2ubackupによるバックアップ取得
apiVersion: db2ubnr.databases.ibm.com/v1alpha1
kind: Db2uBackup
metadata:
  name: db2ubackup-4-1
  namespace: db2u-1
spec:
  databaseBackup:
    backupTarget:
      vendor: disk
    dbName: sampledb
    type: offline
  db2uName: db2ucluster-4
```

```yaml: db2urestoreによるリストア
apiVersion: db2ubnr.databases.ibm.com/v1alpha1
kind: Db2uRestore
metadata:
  name: db2urestore-4-1
  namespace: db2u-1
spec:
  db2uBackup: db2ubackup-4-1
  db2uName: db2ucluster-4
```