[Oracle Cloud] DBCS (VM) で、dbcliからDBのバックアップを取得する

# はじめに
Database Cloud Service (VM) でデータベースのバックアップを取得する方法は、主に以下の3つだと思います。

① 自動バックアップ機能を使う
② dbcliを使う
③ RMANを使う (バックアップ・モジュールを使う)

①の自動バックアップを使う方法が最も簡単なので、基本的にはこれを使うのがいいと思う。ただ、現状では「保存期間」と「大まかなバックアップ開始時間」のみ指定可能であり、たとえば1時間間隔でアーカイブREDOログのバックアップを取りたいというような要件には対応できない。

そのため、バックアップ頻度などをカスタマイズしたい場合は、dbcliかRMANを使うことになるのだが、dbcliでObject Storageにバックアップする方法は、[マニュアル](https://docs.oracle.com/cd/E97706_01/Content/Database/Tasks/backingup.htm)に詳細が記載されていなそうです。実装手順が非常にわかりづらかったので、メモしておく

※マニュアルにあるように、RAC構成の場合は、dbcliを使用したバックアップを使うことはできないので注意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/5be3d265-2685-f47d-ceee-0b59e59e3757.png)

# 手順

手順の実施前に、[マニュアル](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Database/References/dbacli.htm)に従って、# cliadm update-dbcliを実行しdbcliをupdateしておきます。

## 事前準備
### ① 「SWIFT APIで指定されたコンパートメント」の確認
RMANからObject Storageにバックアップする場合、SWIFT APIを利用します。SWIFT APIにはコンパートメントの概念がない　(詳しくは[マニュアル参照](https://docs.oracle.com/cd/E97706_01/Content/Object/Tasks/designatingcompartments.htm))　ので、SWIFT APIで指定されたコンパートメントにバケットを作成します。

[メニュー]→[管理]→[テナンシ詳細]画面から確認します。オブジェクト・ストレージ・ネームスペースも使うので、ついでにメモしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/90dc9fe3-df60-ed46-192f-be4fa05e5864.png)

デフォルトだと、ルート・コンパートメントになっていると思います。「オブジェクト・ストレージ設定の編集」ボタンから変更することが可能ですが、私の環境は共有環境で勝手に変えると怒られそうなのでデフォルトのままにします。

### ② バケットの作成
[メニュー]→[オブジェクト・ストレージ]の画面から、「SWIFT APIで指定されたコンパートメント」上にバケットを作成します。手順は省略します。

### ③ 認証ユーザの作成
[メニュー]→[アイデンティティ]→[ユーザ]の画面から、SWIFT APIの認証用ユーザを作成します。SWIFT APIでは認証に認証トークンを利用します。

dbcli専用の認証ユーザを作るのであれば、「ユーザ機能の編集」ボタンから、認証トークン以外の認証機能を無効にしておくといいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/f3fe631c-de8b-dcb3-0e3b-255bcccf3a68.png)

### ④ グループの作成
[メニュー]→[アイデンティティ]→[グループ]の画面から、オブジェクト・ストレージへのアクセスを許可するためのグループを作成します。

グループを作成したら、「ユーザをグループに追加」ボタンから③の手順で追加したユーザを追加しておきます。(忘れがち手順なので注意)

### ⑤ ポリシーの追加
[メニュー]→[アイデンティティ]→[ポリシー]の画面から、ポリシーを作成します。指定するポリシーは、[マニュアル](https://docs.oracle.com/cd/E97706_01/Content/Database/Tasks/backingupOSrman.htm)を参考にします。

以下は、ポリシーの設定例です。

```
Allow group <④で作成したグループ名> to read buckets in tenancy	
Allow group <④で作成したグループ名> to manage objects in tenancy where any {target.bucket.name='<②で作成したバケット名>'}	
```

この手順では、制御対象のバケットをルート・コンパートメントに作成しているため、ポリシーもルート・コンパートメントに作成しています。
また、同じ理由によりポリシーのスコープをtenancyにしています。ルート以外のコンパートメントを指定した場合は、スコープをコンパートメントにした方がよいと思います。

### ⑥ クレデンシャル(認証トークン)の作成
[メニュー]→[アイデンティティ]→[ユーザ]の画面から、③で作成したユーザのリンクを選択し、左ペインから認証トークンのリンクを選択→「トークンの生成」ボタンを押下して認証トークンを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/ba54dbd1-385b-3553-7890-6d65ebbf5bd0.png)

トークンを生成したら、トークンをコピーして保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/ea2dbc9c-225f-9a65-4553-2bdcd229a678.png)

### ⑦ 確認
ここまでの事前準備が完了したら、DBCSインスタンスにログインし、以下のコマンドを実行します。
HTTPステータスコード200が返ってくることを確認します。ステータスコード401や404が返ってくる場合は失敗しているので、設定を見直す必要があります。

```
# curl -i -u '<ユーザ名>:<トークン>' https://swiftobjectstorage.<リージョン>.oraclecloud.com/v1/<オブジェクト・ネームスペース>/<バケット名>
HTTP/1.1 200 OK ★
Date: Sun, 16 Aug 2020 13:19:15 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 2
Connection: keep-alive
accept-ranges: none
X-Container-Object-Count: 0
X-Container-Bytes-Used: 0
…
* <ユーザ名>は、③で作成したユーザ名です
* <トークン>は、⑥で生成したトークンです。
* <リージョン>は、バケットを作成したリージョンです。東京リージョンの場合は、ap-tokyo-1です
* <オブジェクト・ネームスペース>は、①で確認したオブジェクト・ストレージ・ネームスペースです
* <バケット名>は、②で作成したバケット名です
```

## dbcliの設定
以降の手順は、DBCSのインスタンスにログインし、rootユーザから実行します。

### ① ObjectStoreの定義
以下のコマンドを実行して、Object Storeを定義します。

```
# dbcli create-objectstoreswift \
 -e https://swiftobjectstorage.<リージョン>.oraclecloud.com/v1 \
 -n <任意の名前> \
 -p '<トークン>' \
 -t <オブジェクト・ストレージ・ネームスペース> \
 -u <ユーザ名>

* <リージョン>は、バケットを作成したリージョンです。東京リージョンの場合は、ap-tokyo-1です
* <トークン>は、事前準備の⑥で生成したトークンです。
* <オブジェクト・ネームスペース>は、事前準備の①で確認したオブジェクト・ストレージ・ネームスペースです
* <ユーザ名>は、事前準備の③で作成したユーザ名です
```

以下コマンドで、作成した定義情報を確認します。なお、create-objectstoreswiftでは指定した情報が間違っていてもエラーにならないようなので注意してください。

```
# dbcli list-objectstoreswifts
ID                                       Name                 UserName                 TenantName            Url                                                             
---------------------------------------- -------------------- ------------------------ --------------------- ---------------------------------------------------------------------------
bb2615a3-4d5e-4278-a0a7-036fc3915d49     <指定した名前>       <USERxxx>   　　　　      <OBJNAMESPACE>        https://swiftobjectstorage.ap-tokyo-1.oraclecloud.com/v1
```

### ②バックアップ設定の作成
以下コマンドを使用して、バックアップ設定を作成します。このコマンド実行時に①で作成したObject Storeのバリデーションが行われるようで、入力情報が間違っている場合はエラーになります。

```
# dbcli create-backupconfig \
  -d ObjectStore \
  -c <バケット名> \
  -n <任意の名前> \
  -on <ObjectStore名> \
  -w <リカバリWinodw(日)>

* <バケット名>は、事前準備の②で作成したバケット名です
* <ObjectStore名>は、①で作成したobjectstoreswiftsの名前です
* <リカバリWinodw(日)>は、RMANのCONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF N DAYS;コマンドに指定したい日数を指定します。

※その他オプションは、dbcli create-backupconfig -h コマンドで指定可能なオプションを確認します。
```
コマンド実行後、dbcli list-jobsコマンドやdbcli describe-job -i <ID>コマンドを実行して結果を確認します。エラーになっている場合は、/opt/oracle/dcs/log/dcs-agent.log や dcs-agent-debug.logを確認します。401や404エラーになっている場合は、ObjectStoreの定義やバックアップ設定時に指定した情報に誤りがないか確認します。

ジョブの実行がSUCCESSになったら、以下コマンドで定義情報を確認しておきます。

```
# dbcli list-backupconfigs

ID                                  Name             RecoveryWindow  　　　　CrosscheckEnabled   BackupDestination   
----------------------------------- ---------------- ---------------------- ------------------- --------------------
3472fe33-a72b-47c4-911b-xxxxxxx     <任意の名前>      <リカバリウィンドウ>   true                ObjectStore   
```

### ③ DB設定のアップデート
②で作成したバックアップ設定をDBに割り当てます。このコマンドを実行すると、各種RMANの設定が行われるようです。


```
- コマンド実行前に現在の設定を確認しておきます。
# su - oracle 
$ rman target /
RMAN> show all;
RMAN> exit;
$ exit 

- DBに作成したバックアップ設定を割り当てます
# dbcli list-databases
ID                                       DB Name    DB Type  DB Version           CDB        Class    Shape    Storage    Status        DbHomeID                                
---------------------------------------- ---------- -------- -------------------- ---------- -------- -------- ---------- ------------ ----------------------------------------
0993636d-b89e-4e3b-9bde-xxxxxxx          XX         Si       19.7.0.0.0           true       Oltp              ASM        Configured   50f83073-1222-4ce7-9941-xxxxxxxx        

# dbcli update-database -i <list-databasesのID列の値> -bin <バックアップ設定の名前>

dbcli list-jobsなどで、実行したジョブが成功することを確認します。

ジョブが成功したら、RMAN設定が変更されていることを確認します。
# su - oracle 
$ rman target /
RMAN> show all;
///デフォルト設定以外を抜粋///
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 8 DAYS;
CONFIGURE BACKUP OPTIMIZATION OFF;
…
CONFIGURE CONTROLFILE AUTOBACKUP ON;
…
CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO BACKUPSET PARALLELISM 1;
CONFIGURE DEVICE TYPE 'SBT_TAPE' BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 1;
…
CONFIGURE CHANNEL DEVICE TYPE DISK MAXPIECESIZE 2 G;
CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' MAXPIECESIZE 2 G FORMAT   '%d_%I_%U_%T_%t' PARMS  'SBT_LIBRARY=/opt/oracle/dcs/commonstore/pkgrepos/oss/odbcs/libopc.so ENV=(OPC_PFILE=/opt/oracle/dcs/commonstore/objectstore/opc_pfile/2310376902/opc_xxx_nrt199.ora)';
…
CONFIGURE ENCRYPTION FOR DATABASE OFF;
…
CONFIGURE COMPRESSION ALGORITHM 'LOW' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE;
…
CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO 'SBT_TAPE';
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '+RECO/xxxxx/controlfile/snapcf_xx_nrt199.f';
RMAN> exit;
$ exit 

```

### ④ DBバックアップの実行
以下コマンドを実行してバックアップを実行します。

- フルバックアップ

フルバックアップは、Regular-L0 を指定します

```
# dbcli list-databases
# dbcli create-backup -bt Regular-L0 -c Database -i <list-databasesのID列の値>

dbcli list-jobsでジョブIDを確認し、describe-jobでジョブの実行状況を確認します。
# dbcli describe-job -i <list-jobsのID列の値>
Job details                                                      
----------------------------------------------------------------
                     ID:  e4dde108-1615-4679-9f70-3192cc0d9b3a
            Description:  Create Regular-L0 Backup with TAG-auto for Db:xxx in OSS:バケット名
                 Status:  Success
                Created:  August 16, 2020 10:59:42 PM JST
               Progress:  100%
                Message:  

Task Name                                                                Start Time                          End Time                            Status    
------------------------------------------------------------------------ ----------------------------------- ----------------------------------- ----------
Validate Database backup Configuration                                   August 16, 2020 10:59:46 PM JST     August 16, 2020 11:00:56 PM JST     Success   
Backup Database                                                          August 16, 2020 11:00:56 PM JST     August 16, 2020 11:03:24 PM JST     Success   
Validate the backup                                                      August 16, 2020 11:03:24 PM JST     August 16, 2020 11:03:35 PM JST     Success   
Backup TDE Wallet.                                                       August 16, 2020 11:03:35 PM JST     August 16, 2020 11:03:45 PM JST     Success 
```

バックアップのvalidateやTDE Walletのバックアップも行われているようです。

- 増分バックアップ

増分バックアップは、Regular-L1を指定します。

```
# dbcli create-backup -bt Regular-L1 -c Database -i <list-databasesのID列の値>

# dbcli describe-job -i <list-jobsのID列の値>
Job details                                                      
----------------------------------------------------------------
                     ID:  4b7fdd95-957d-469c-bd34-fa24ce114b05
            Description:  Create Regular-L1 Backup with TAG-auto for Db:XXX in OSS:バケット名
                 Status:  Success
                Created:  August 16, 2020 11:16:59 PM JST
               Progress:  100%
                Message:  

Task Name                                                                Start Time                          End Time                            Status    
------------------------------------------------------------------------ ----------------------------------- ----------------------------------- ----------
Validate Database backup Configuration                                   August 16, 2020 11:17:01 PM JST     August 16, 2020 11:18:38 PM JST     Success   
Backup Database                                                          August 16, 2020 11:18:38 PM JST     August 16, 2020 11:20:14 PM JST     Success   
Validate the backup                                                      August 16, 2020 11:20:14 PM JST     August 16, 2020 11:20:34 PM JST     Success   
Backup TDE Wallet.                                                       August 16, 2020 11:20:34 PM JST     August 16, 2020 11:20:46 PM JST     Success 
```

- アーカイブREDOログのバックアップ

アーカイブREDOログは、ArchiveLogを指定します。

```
# dbcli create-backup -bt ArchiveLog -c Database -i <list-databasesのID列の値>

# dbcli describe-job -i <list-jobsのID列の値>
Job details                                                      
----------------------------------------------------------------
                     ID:  bc3fb2ca-fa6e-444c-bc8d-a4b358a3c3b4
            Description:  Create ArchiveLog Backup with TAG-auto for Db:xxx in OSS:バケット名
                 Status:  Success
                Created:  August 16, 2020 11:23:20 PM JST
               Progress:  100%
                Message:  

Task Name                                                                Start Time                          End Time                            Status    
------------------------------------------------------------------------ ----------------------------------- ----------------------------------- ----------
Validate Database backup Configuration                                   August 16, 2020 11:23:23 PM JST     August 16, 2020 11:24:31 PM JST     Success   
Backup Database ArchiveLogs                                              August 16, 2020 11:24:31 PM JST     August 16, 2020 11:25:35 PM JST     Success   
Validate the backup                                                      August 16, 2020 11:25:35 PM JST     August 16, 2020 11:25:46 PM JST     Success   
Backup TDE Wallet.                                                       August 16, 2020 11:25:46 PM JST     August 16, 2020 11:25:56 PM JST     Success   

```