OCI Archive Storageを利用したOracle DBのバックアップリストア

OCI Archive StorageにOracle Database Cloud Backup Moduleを利用してRMAN経由でOracle Databaseのバックアップおよびリストアの実施手順を紹介します。
手順は、こちらのMOSドキュメントを参考に構成しています。
[How To Perform RMAN Backup And Restore From OCI Archive Storage Using Object Lifecycle Policy (ドキュメントID 2667317.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2667317.1)
リストア手順は、バックアップを取得したDB自身にリストアで、リカバリカタログはもっていないことを前提とした手順になっています。実行を確認した環境はExaDB-Dです。

## OCI Archive Storageに保存したOracle DBのバックアップおよびリストアの特徴と用途

- この記事で利用するOCI Archive Storageからのリストア手順では、リストア開始前、OCI Archive Storageから標準Object Storageへの配置待ちが2段階発生し、約2時間待ってからのリストアリカバリの開始となります。
- そのため、今回のバックアップの用途としては、運用で使用するバックアップは別途用意した上で、保険としてさらに長期保存用のバックアップを用意しておく、そのバックアップ先ストレージのコストはリストアに時間がかかっても、最安にしたいという場合、となる想定です。
- 長期保存用途のバックアップがほしい、という場合はOCI DB PaaS サービスの自動バックアップのオンデマンド・バックアップが利用できます。こちらでは OCI Archive Storageに比べて課金はかかりますが、GUIから簡易な操作で実施できます。

## 今回実施したDB環境
ExaDB-D X9M Quarter
Oracle Database 19.22

## 事前準備
Oracle Database Cloud Backup Moduleのインストールコマンドが実行できる環境を整えます。Object Storageのバケットはインストールコマンド実行時に作成されるため、事前作成は必要ありません。
自分は以下のQiitaの記事を参考に事前準備をすすめました。

Oracle Database Cloud Backup ModuleでデータベースをOCI Object Storageにバックアップする方法
https://qiita.com/RexZheng/items/b64b5494899da0980970

## OCI Archive StorageへのOracle DBのバックアップ手順

### Oracle Database Cloud Backup Moduleのインストール
```
$ java -jar oci_install.jar \
       -host https://objectstorage.ap-osaka-1.oraclecloud.com \
       -pvtKeyFile /home/oracle/.oci/oci_api_key.pem \
       -pubFingerPrint 61:c1:4c:26:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
       -tOCID ocid1.tenancy.oc1..aaaaaaaaXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
       -uOCID ocid1.user.oc1..aaaaaaaaXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
       -cOCID ocid1.compartment.oc1..aaaaaaaaXXXXXXXXXXXXXXXXXXXXXXXX \
       -bucket backupmodulearctest \
       -enableArchiving TRUE \
       -archiveAfterBackup "1 days" \
       -walletDir ~/oci_wallet \
       -libDir ~/lib \
```

これで、backupmodulearctestという名前のバケットが作成され、バックアップ後1日経過するとOCI Archive Storageに保存される形となります。

### 自動バックアップの無効化
バックアップ実行前に既存の自動バックアップを有効化している場合は、無効化します。自動アーカイブログ取得も無効化しておきます。

自動バックアップの無効化→コンソールから実施（手順省略）
自動アーカイブログ取得の無効化
→
自動アーカイブログ取得の無効化手順：
1. /etc/crontabを確認、以下のようなエントリがあったら有効
15,45 * * * * oracle /var/opt/oracle/bkup_api/bkup_api bkup_archlogs --cron --dbname=XXX
2. あった場合、backupconfigファイル作成
#dbaascli database backup --getConfig --dbname [DBユニーク名] --configFile [configファイルのパス]でconfigファイル作成

3. configファイルを開いて以下に編集
bkup_cron_entry=no
4. configファイルの読み込み
#dbaascli database backup --dbName [DBユニーク名] --getConfig --configFile [configファイルのパス]
5. /etc/crontabのエントリがなくなるか確認

### RMANでバックアップ実行
暗号化を明示的にオンにする必要があります。

```
$ export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
$ rman target /
run {
CONFIGURE ENCRYPTION FOR DATABASE ON;
allocate channel ch1 device type sbt parms 'SBT_LIBRARY=/home/oracle/lib/libopc.so,ENV=(OPC_PFILE=/u02/app/oracle/product/19.0.0.0/dbhome_2/dbs/opcorcltjk011.ora)';
backup as compressed backupset database format '%d_DB_%U';
backup as compressed backupset archivelog all not backed up format '%d_ARCH_%U';
backup as compressed backupset current controlfile format '%d_CTRL_%U';
CONFIGURE ENCRYPTION FOR DATABASE CLEAR;
}
```
1日待てばOCI Archive Storageに配置されます。

### OCI Archive StorageからのOracle DBのリストア手順

### 制御ファイルのリストア

ここでの制御ファイルのリストアはOCI Archive Storageから標準Object Storageへの移動が走るので、1時間ほどかかります。
DBTJK01_CTRL_0g2pq96n_16_1_1は制御ファイルを含むバックアップピースの名前。list backupなどで確認しておきます

```
### NO MOUNT起動で実施
### DBTJK01_8rf_kixはDBユニーク名

$ srvctl status database -d DBTJK01_8rf_kix
$ srvctl stop database -d DBTJK01_8rf_kix
$ srvctl start database -d DBTJK01_8rf_kix -o nomount

$ export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
$ rman target /

set dbid 1464493531
run {
allocate channel ch1 device type sbt parms 'SBT_LIBRARY=/home/oracle/lib/libopc.so,ENV=(OPC_PFILE=/u02/app/oracle/product/19.0.0.0/dbhome_2/dbs/opcorcltjk011.ora)';
restore controlfile from 'DBTJK01_CTRL_0g2pq96n_16_1_1';
}
```

### restore database preview recall
このコマンドを実行するとリストアリカバリに必要なバックアップ関連ファイルがOCI Archive Storageから標準Object Storageへの移動がはじまります。コマンド自体はすぐに完了しますが、1時間後の配置終了までリストア操作は完了できません。先ほどの制御ファイルのリストアの1時間と合わせて計2時間ほどリストア開始まで少なくとも必要となります。

```
### MOUNT起動で実施
### DBTJK01_8rf_kixはDBユニーク名

$ srvctl status database -d DBTJK01_8rf_kix
$ srvctl stop database -d DBTJK01_8rf_kix
$ srvctl start database -d DBTJK01_8rf_kix -o mount

$ export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
$ rman target /
run {
allocate channel ch1 device type sbt parms 'SBT_LIBRARY=/home/oracle/lib/libopc.so,ENV=(OPC_PFILE=/u02/app/oracle/product/19.0.0.0/dbhome_2/dbs/opcorcltjk011.ora)';
restore database preview recall until time "to_date('2024-05-02 16:01:31','YYYY-MM-DD HH24:MI:SS')";
}

```

### restoreおよびrecoveryの実施

#### restoreおよびrecovery
```
$ export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
$ rman target /
run {
allocate channel ch1 device type sbt parms 'SBT_LIBRARY=/home/oracle/lib/libopc.so,ENV=(OPC_PFILE=/u02/app/oracle/product/19.0.0.0/dbhome_2/dbs/opcorcltjk011.ora)';
set until time "to_date('2024-05-02 16:01:31','YYYY-MM-DD HH24:MI:SS')";
restore database;
recover database;
}
```
#### RESETLOGSを指定して起動
RACの場合、OPEN RESETLOGSの実行ノード以外のDBは停止しておく
```
SQL> ALTER DATABASE OPEN RESETLOGS;
```

操作が終わったら、自動バックアップがもともと有効だった場合は有効にもどしておきます。アーカイブログの自動取得ももどしてください。

## 参考
[How To Perform RMAN Backup And Restore From OCI Archive Storage Using Object Lifecycle Policy (ドキュメントID 2667317.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2667317.1)

マニュアル：
[Using Oracle Database Backup Cloud Service](https://docs.oracle.com/en/cloud/paas/db-backup-cloud/csdbb/index.html)より
[Configuring Automatic Archival to Oracle Cloud Infrastructure](https://docs.oracle.com/en/cloud/paas/db-backup-cloud/csdbb/configuring-automatic-archival-oracle-cloud-infrastructure.html)
[Recovering Databases from Archive Storage](https://docs.oracle.com/en/cloud/paas/db-backup-cloud/csdbb/restoring-databases-archive-storage.html)