OCI DBCS(VM)のバックアップ先をユーザ管理のObject Storageに出力する方法（バックアップ編）

# はじめに

- Oracle Cloud Infrastructure(OCI）上で、Oracle DatabaseのPaaSサービスの１つ、Database Cloud Service(DBCS)のVirtual Machine(VM)版である、通称：DBCS(VM)のバックアップとリストア方法について記載します。

- DBCS(VM)はバックアップON！とすると、自動的に内部的にRMANがバックアップしてくれますが、バックアップ先のObject Storageはユーザでの管理ができない（OCIコンソールのObject Storageメニューから見ても確認できない）領域にバックアップされる為、他のリージョンに転送したい時や、オンプレミスにバックアップデータを持ってきたい時は不便です。

- この記事の手順を行うと、ユーザ管理のObject Storageにバックアップ先を変更することができます。（残念ながらGUIでは変更できず、DBCS内で利用できる「dbcli」というコマンド（中身はREST）を実行して変更する手順になります）


### 前提条件
- DBCS(VM)が構築済み
    - DBCSの作り方、接続の仕方などはオラクル社が公式に出してくれてます。。
Oracle Databsae SE2しか触らない人に対してもDB接続までの手順がかかれています。
    - [クラウドでOracle Databaseを使う - Oracle Cloud Infrastructureを使ってみよう(その8)](https://community.oracle.com/docs/DOC-1019568)
    - ここではノードホスト名「dbcs1」、データベース名「orcld」（db_name)　で作成しています。　
- RAC構成(2ノード構成)のDBCS(VM)には利用できません。RAC構成の場合は別途有償のBackup Moduleを使ってRMANの設定を変更する必要があります。
    - [RMANを使用したオブジェクトストレージへのデータベースのバックアップ](https://docs.cloud.oracle.com/en-us/iaas/Content/Database/Tasks/backingupOSrman.htm)
    - OCIドキュメント：[Backing Up a Database to Object Storage Using RMAN](https://docs.oracle.com/en-us/iaas/Content/Database/Tasks/backingupOSrman.htm)




# 全体の流れ

1. バックアップ先となるObject Storageのバケットを作成
2. DBCS内　コマンド ```dbcli create-objectstoreswift``` を実行して、バックアップ先を定義
3. DBCS内　コマンド ```dbcli create-backupconfig``` を実行して、バックアップコンフィグの作成
4. DBCS内　コマンド ```dbcli update-database``` を実行して、バックアップ用設定をDBに認識させる
5. DBCS内　コマンド ```dbcli create-backup``` を実行して、バックアップを実行する
6. 各種確認
7. アーカイブログの自動バックアップをスケジュール （上記らのバックアップ自体のスケジュールはできない）



# 手順

### 1.バックアップ先となるObject Storageのバケットを作成

適当なバケット名で作ります。ここでは **bucket_dbcsbkp**
ストレージ層は **標準** （アーカイブは長期保管用の為）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/ac81b032-2d97-1464-a35f-49472fb47a57.png)




### 2.```dbcli create-objectstoreswift``` を実行して、Swiftオブジェクト・ストアを定義

DBCSにSSHでログインし、rootユーザで(sudo -iして)以下を実行します。
ここで定義するSwiftオブジェクト・ストアは先ほど作ったObject StorageをOCIAPIではなくSwitfAPIで利用する為のものです

- 凡例

```
dbcli create-objectstoreswift 
-n <object_store_name>　　<--swift ObjectStore の名前（任意。Object Storageのバケット名ではない)
-t <tenant_name>  <--マニュアルではテナント名と記載しているが、テナント毎に振られているNamespaces名
-u <user_name> 　 <-- Object Storageにアクセス（書き込み）できるユーザ名を入力。IAMアカウントもしくはIDCSアカウント名になる 
-e https://swiftobjectstorage.<region_name>.oraclecloud.com/v1 　<--リージョン名を埋めて入力。Object Storage（swift)のURL
-p　　　　　　　 <--パスワードを入力する部分。無しで実行するとプロンプト上でPWを問われる
```

- 実行例
    - ユーザはIDCSユーザを利用
    - 東京リージョンのObject Storageにアクセス為の情報

```
[root@dbcs1 ~]# dbcli create-objectstoreswift -n swift_dbcs -t nicaregi -u oracleidentitycloudservice/nicaregi.name@sample.com -e https://swiftobjectstorage.ap-tokyo-1.oraclecloud.com/v1 -p
object store swift password:

{
  "jobId" : "0f2bfe56-ebaa-45b7-acc7-0c4ffafa518f",
  "status" : "Created",
  "message" : "Create object store swift",
  "reports" : [ ],
  "createTimestamp" : "May 26, 2020 11:33:47 AM JST",
  "resourceList" : [ {
    "resourceId" : "7f522156-38a1-44d6-a059-851e43be3f05",
    "resourceType" : "ObjectStoreSwift",
    "jobId" : "0f2bfe56-ebaa-45b7-acc7-0c4ffafa518f",
    "updatedTime" : "May 26, 2020 11:33:47 AM JST"
  } ],
  "description" : "create object store:swift_dbcs",
  "updatedTime" : "May 26, 2020 11:33:47 AM JST"
}
```


### 3.```dbcli create-backupconfig``` を実行して、バックアップコンフィグの作成

バックアップジョブのような定義を作る。
先ほど作成したSwiftオブジェクト・ストア名を指定する。

- 凡例

```
dbcli create-backupconfig 
-d {DISK|OBJECTSTORE|NONE} 　<--バックアップ先として「OBJECTSTORE」を選択
-c <bucket>  　　　　<-- 先ほど作成したバックアップ先の定義ではなく、Object Storageのバケット名を入力する
-on <object_store_swift_name> 　　　<-- 先ほど作成したバックアップ先の定義、Swiftオブジェクト・ストア名を入力
-w <n> 　　　　　　<-- リカバリウィンドウを1~30で入力（バックアップおよびアーカイブREDOログが保持される日数）　
-n <name>　　　　　　　<-- バックアップ構成の名前（任意）
[-cr|-no-cr] 　　　　<-- RMANバックアップのクロスチェックを実施有無
```

- 実行例
    - この時点ではバックアップコンフィグ作成をキックしただけで、失敗する事がある為注意
    - 実際に作成できているかは次のコマンドを実行する

```
[root@dbcs1 ~]# dbcli create-backupconfig -d OBJECTSTORE -c bucket_dbcsbkp -on swift_dbcs -w 7 -n bkpconf_orcld1 -cr
{
  "jobId" : "4c3c2e0b-6b81-44a4-b2fe-1069af08c431",
  "status" : "Created",
  "message" : "backup config creation",
  "reports" : [ ],
  "createTimestamp" : "May 26, 2020 11:25:49 AM JST",
  "resourceList" : [ {
    "resourceId" : "db97e654-0d9a-430f-ab18-7c0e188b8774",
    "resourceType" : "BackupConfig",
    "jobId" : "4c3c2e0b-6b81-44a4-b2fe-1069af08c431",
    "updatedTime" : "May 26, 2020 11:25:49 AM JST"
  } ],
  "description" : "create backup config:bkpconf_orcld1",
  "updatedTime" : "May 26, 2020 11:25:49 AM JST"
}
```

- バックアップコンフィグの作成確認の為にジョブ実行の成功可否を確認する（少し間をおいて確認）
    - 実際に動作したバックアップなど複数出てくるが、一番したのものを確認する

```
# dbcli list-jobs

ID                                       Description                                                                 Created                             Status    
---------------------------------------- ------------------------------------ ---------------------------------- ----------
・
<<中略>>
・  
8f5f0801-2b05-4ab1-952d-e22ee30bbb70     create backup config:bkpconf_orcld1   May 26, 2020 11:36:03 AM JST        Success
```

- バックアップコンフィグ作成ジョブが成功していると、以下で作成したバックアップコンフィグを確認できる

```
[root@dbcs1 ~]# dbcli list-backupconfigs
ID                                       Name                 RecoveryWindow   CrosscheckEnabled   BackupDestination   
---------------------------------------- -------------------- ---------------- ------------------- --------------------
5af58810-8d97-40b9-951a-cf9196291e17     bkpconf_orcld1        7                true                ObjectStore  
```


### 4.```dbcli update-database``` を実行して、バックアップ用設定をDBに認識させる

- 作成したバックアップコンフィグをDBCSに認識（設定）させる

- 凡例

```
dbcli update-database 
[-i <db_id>] 　　　<---マニュアルでは必須とあるが必須ではない　（dbcli list-databasesコマンドで確認)
-bin <bkup_config_name> 　　<---先ほど作成したバックアップコンフィグの名前
-in <name> 　　<---更新するデータベース名（db_name のこと)
[-no-ab]  　　<---指定されたデータベースの自動バックアップを無効化
```

- 実行例

```
[root@dbcs1 ~]# dbcli update-database -bin bkpconf_orcld1 -in orcld
{
  "jobId" : "4303e6ec-6c39-4e1a-bbd6-416f1dedb7d2",
  "status" : "Created",
  "message" : "update database",
  "reports" : [ ],
  "createTimestamp" : "May 26, 2020 11:40:27 AM JST",
  "resourceList" : [ {
    "resourceId" : "790ddc3d-0977-4066-809f-0b31324ebb1b",
    "resourceType" : "DB",
    "jobId" : "4303e6ec-6c39-4e1a-bbd6-416f1dedb7d2",
    "updatedTime" : "May 26, 2020 11:40:27 AM JST"
  } ],
  "description" : "update database : orcld",
  "updatedTime" : "May 26, 2020 11:40:32 AM JST"
}
```

- ここまで行うとOracle DatabseのRMANの設定が更新されています。
- RMANを確認するなら以下
    - RMANコマンドたたくまでの道のり（DBCSにopcユーザでSSH → oracleユーザにスイッチ ```sudo su - oracle``` → rman起動とリカバリカタログに接続 ```rman target /```


```
RMAN> show all;

RMAN configuration parameters for database with db_unique_name ORCLD_NRT1H8 are:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;　　<--- 7日になっている
CONFIGURE BACKUP OPTIMIZATION OFF;
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE SBT_TAPE TO '%F'; # default
CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO BACKUPSET PARALLELISM 1;
CONFIGURE DEVICE TYPE 'SBT_TAPE' BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 1;
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE SBT_TAPE TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE SBT_TAPE TO 1; # default
CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' 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/3400685515/opc_orcld_nrt1h8.ora)'; <---バックアップ先の設定
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ENCRYPTION FOR DATABASE OFF;
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
CONFIGURE COMPRESSION ALGORITHM 'LOW' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE;
CONFIGURE RMAN OUTPUT TO KEEP FOR 7 DAYS; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 1 TIMES TO 'SBT_TAPE';
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '+RECO/ORCLD_NRT1H8/controlfile/snapcf_orcld_nrt1h8.f';
```




### 5.```dbcli create-backup``` を実行して、バックアップを実行する

- このコマンドを実行するとObject Storageにバックアップがとられる。手動バックアップになります。
- ここではスケジューリングはできない為、シェルスクリプトを作成してcronなどでジョブをスケジュールします。
- ただし、後述のアーカイブのバックアップはスケジュールできます。

- 凡例

```
dbcli create-backup 
-in <db_name> 　　　　<---DB名（db_nameの値と同等）を入力。
[-bt {Regular-L0|Regular-L1|Longterm|ArchiveLog}]  <---L0はフル、L1は差分増分、Longtermはフルでかつフル＋差分に該当しない長期保管用
[-c {Database|TdeWallet}]  　　<---DBかウォレットかをバックアップ。ウォレットは特定条件下で自動バックアップされる
[-k <n>]  　　　　<---バックアップまたはコピーの保存期限を指定（Longtermバックアップ・タイプ専用オプション）
[-t <tag>]  　　　　<---わかりやすい任意の名前を設定（Longtermバックアップ・タイプでは必須。1～30文字。ハイフンは使用できない）
```

- 実行例（フルバックアップ）

```
[root@dbcs1 ~]# dbcli create-backup -in orcld -bt Regular-L0 -c Database -t dbcs1bkp
```

- 実行例（差分増分バックアップ）（※一般的な増分バックアップのこと）

```
[root@dbcs1 ~]# dbcli create-backup -in orcld -bt Regular-L1 -c Database -t dbcs1bkp
```

- バックアップ実行後のジョブ稼働確認

```
[root@dbcs1 ~]# dbcli list-jobs

ID                                       Description                                                                 Created                             Status    
---------------------------------------- --------------------------------------------------------------------------- ----------------------------------- ----------
・
<<t省略>>
・
3f89e9b6-5e14-479d-844d-434417fcfada     Create Regular-L0 Backup with TAG-dbcs1bkp for Db:orcld in OSS:bucket_dbcsbkp May 26, 2020 11:48:13 AM JST        Success
```



### 6．バックアップ後の各種確認

- バックアップ先のバケットにデータが核格納されている

    - （バケットにレプリケーションポリシーを適用していれば遠隔リージョンに自動的にコピーされます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/80912758-f6fe-d93e-91b5-907a9a381c9a.png)

- RMANコマンドでバックアップ実行を確認
    - (Object StorageへのバックアップはSBT_TAPEになる）

```
RMAN> LIST BACKUPSET SUMMARY;


using target database control file instead of recovery catalog


List of Backups
===============
Key     TY LV S Device Type Completion Time     #Pieces #Copies Compressed Tag
------- -- -- - ----------- ------------------- ------- ------- ---------- ---
1       B  F  A DISK        2020/04/30 09:24:25 1       1       NO         TAG20200430T092424
2       B  F  A SBT_TAPE    2020/05/26 11:42:28 1       1       YES        AUTO
3       B  F  A SBT_TAPE    2020/05/26 11:42:31 1       1       YES        TAG20200526T114230
4       B  A  A SBT_TAPE    2020/05/26 11:50:03 1       1       YES        DBCS1BKP
5       B  0  A SBT_TAPE    2020/05/26 11:50:29 1       1       YES        DBCS1BKP
6       B  0  A SBT_TAPE    2020/05/26 11:50:45 1       1       YES        DBCS1BKP
7       B  0  A SBT_TAPE    2020/05/26 11:50:59 1       1       YES        DBCS1BKP
8       B  A  A SBT_TAPE    2020/05/26 11:51:09 1       1       YES        DBCS1BKP
9       B  F  A SBT_TAPE    2020/05/26 11:51:11 1       1       YES        TAG20200526T115110
10      B  F  A SBT_TAPE    2020/05/26 11:51:18 1       1       YES        DBCS1BKP
11      B  F  A SBT_TAPE    2020/05/26 11:51:21 1       1       YES        DBCS1BKP
12      B  F  A SBT_TAPE    2020/05/26 11:51:23 1       1       YES        TAG20200526T115122
```


### 7．アーカイブログの自動バックアップをスケジュール

- アーカイブのバックアップはスケジュールできるので、スケジュールを設定しておく

- 凡例

```
dbcli schedule-backup 
-t <backup_type>  　　<---バックアップタイプ：(いまは？）ARCHIVELOG しか指定できない
-f <number>    　　<---バックアップ頻度　0~1439分（1440分：24時間）
-bi  　　<---マニュアルには記載の無いオプション！ 手順３．で作成したバックアップコンフィグのIDを指定
```

- 実行例（360分毎にアーカイブログをバックアップ）

```
[root@dbcs1 ~]# dbcli schedule-backup -t ARCHIVELOG -f 360 -bi 5af58810-8d97-40b9-951a-cf9196291e17 -in orcld
{
  "jobId" : "18f43f41-6157-4012-a309-5df1d58b30b6",
  "status" : "Created",
  "message" : null,
  "reports" : [ ],
  "createTimestamp" : "May 27, 2020 00:06:37 AM JST",
  "resourceList" : [ ],
  "description" : "scheduleBackup_orcld_ARCHIVELOG_(frequency:360)_Wed May 27 00:06:37 JST 2020",
  "updatedTime" : "May 27, 2020 00:06:37 AM JST"
}
```



# 参考情報
- [Oracle Database CLIリファレンス★](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Database/References/dbacli.htm)
- [クラウドでOracle Databaseを使う - Oracle Cloud Infrastructureを使ってみよう(その8)](https://community.oracle.com/docs/DOC-1019568)
- [データベースのバックアップ](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Database/Tasks/backingup.htm)
    - （※ここで書かれているのはデフォルト自動バックアップの話）




以上