[Oracle Cloud] ユーザ管理のObject Storageバケットへ取得したRMANバックアップをBase Databaseにリストアしてみた

# はじめに
Oracle CloudのOracle Databaseサービス（Base Database/Exadata Database Service[ExaDB-D])のバックアップを東京リージョンと大阪リージョンに取得して、バックアップからデータベースを作成する場合、ユーザ管理のObject Storageバケットにバックアップを取得し、Object Storageレプリケーション機能を使って大阪リージョンにバックアップをコピーします。
今回は、大阪リージョンにリストアをやってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/11b25a0d-d13f-2954-063c-5e0d84bc57aa.png)

注：Database Serviceの自動バックアップはOracle管理のObject Storageに取得され、別リージョンへコピーなどはできません。

# 事前準備
バックアップの取得は、[Oracle Database Cloud Backup ModuleでデータベースをOCI Object Storageにバックアップする方法](https://qiita.com/RexZheng/items/b64b5494899da0980970) などを参考に取得ください。
別リージョンでリストアする場合は、Object Storageのレプリケーション・ポリシーが有効に設定されたバケットに取得ください。


### バックアップ
 
```
CONFIGURE CONTROLFILE AUTOBACKUP ON;
BACKUP INCREMENTAL LEVEL 0 DATABASE PLUS ARCHIVELOG;
```

注1：シードPDB(PDB$SEED)のデータファイルもバックアップに含まれていることを確認ください。
RMANの `LIST BACKUP BY FILE;` コマンドなどで確認できます。
注2：dbid を確認します。（リストア時に使用するためメモ）

```
$ rman target /

Recovery Manager: Release 19.0.0.0.0 - Production on Sat Jan 14 10:00:00 2023
Version 19.17.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

connected to target database: DB (DBID=0000000000)

RMAN>
```

### TDE ウォレットの取得

透過的データベース暗号化(TDE)が有効になっているデータベースのバックアップをリストアして利用するためには、TDEウォレットが必要になります。
バックアップしたデータベースのTDEウォレットを取得します。TDE ウォレットが格納されている場所は以下のSQLで確認できます。

```
SQL> select WRL_PARAMETER from  V$ENCRYPTION_WALLET;
```

TDE ウォレットが格納されているディレクトリから `cwallet.sso` と `ewallet.p12` を取得します。

### (オプション)初期化パラメータの確認

バックアップしたデータベースの初期化パラメータ設定をファイルに取得し、リストア先のデータベースで参考にすることもできます。

```
create pfile='/home/oracle/work/backup/initdb.ora' from memory;
create pfile='/home/oracle/work/backup/initspfile.ora' from spfile;
```

# Base Databaseの準備

リストア先となるBase Database を準備します。

### Base Databaseの新規作成

[DBシステムの作成](https://oracle-japan.github.io/ocitutorials/database/dbcs101-create-db/#anchor1)を参考にリストア先となるBase Databaseを新規に作成します。

- 「使用可能なデータ・ストレージ(GB)」をバックアップがリストアできるサイズに設定します。(バックアップしたデータベースと同等のサイズ）
- 「データベース名」は、バックアップしたデータベースと同じにします。（違う名前も可能ですが、その場合 db_name の変更など追加の手順が必要になります。）


### Oracle Database Cloud Backup モジュール配置

新規作成した Base Database (DBシステム)にOracle Database Cloud Backup モジュールを配置します。

#### Oracle Database Cloud Backup Moduleのダウンロード
[このページ](https://www.oracle.com/database/technologies/oracle-cloud-backup-downloads.html)からOracle Database Cloud Backup Moduleをダウンロードし、DBシステムのノードに転送します。

ダウンロードしたzipファイルを解凍し、java コマンドでインストールします。インストール時のパラメータについては、[こちら](https://docs.oracle.com/cd/E83857_01/paas/db-backup-cloud/csdbb/installing-oracle-database-cloud-backup-module-oci.html)を参考にしてください。

```
$ unzip opc_installer.zip
$ cd opc_installer/oci_installer/
$ java -jar oci_install.jar \
-host https://objectstorage.ap-osaka-1.oraclecloud.com \
-pvtKeyFile /key/private.pem \
-pubFingerPrint fa:56:8a:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX \
-uOCID ocid1.user.oc1..aaaaaaaa \
-tOCID ocid1.tenancy.oc1..aaaaaaaa \
-cOCID ocid1.compartment.oc1..aaaaaaaa \
-walletDir /u01/app/oracle/product/19.0.0.0/dbhome_1/dbs \
-libDir /u01/app/oracle/product/19.0.0.0/dbhome_1/lib \
-bucket dbbackup

Oracle Database Cloud Backup Module Install Tool, build 19.3.0.0.0DBBKPCSBP_2019-10-16
Oracle Database Cloud Backup Module credentials are valid.
Backups would be sent to bucket exabackup.
Oracle Database Cloud Backup Module wallet created in directory /u01/app/oracle/product/19.0.0.0/dbhome_1/dbs.
Oracle Database Cloud Backup Module initialization file /u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/opcDB2.ora created.
Downloading Oracle Database Cloud Backup Module Software Library from Oracle Cloud Infrastructure.
Download complete.
```

### TDE ウォレットをリストア

バックアップしたデータベースで取得したTDE ウォレットをリストア先のDBシステム上にリストアします。
リストア先は、 `/opt/oracle/dcs/commonstore/wallets/<Base DBのdb_unique_name>/tde/` になります。
（ `select WRL_PARAMETER from  V$ENCRYPTION_WALLET;` で確認できます。 )

```
$ cd /opt/oracle/dcs/commonstore/wallets/DB_kix000/tde/
$ mv cwallet.sso cwallet.sso.back
$ mv ewallet.p12 ewallet.p12.back
$ cp $HOME/backup/cwallet.sso .
$ cp $HOME/backup/ewallet.p12 .
```


### 初期作成されたデータベースの停止/削除

#### 削除対象のファイルの確認
以下のSQLを実行し、ASMからファイルを削除するコマンドを生成します。

```
set heading off linesize 999 pagesize 0 feedback off trimspool on
spool /tmp/cdb_remove_files.sh
select 'asmcmd rm '||name from v$datafile
union all
select 'asmcmd rm '||name from v$tempfile
union all
select 'asmcmd rm '||member from v$logfile;
spool off
```

実行例

``` /tmp/cdb_remove_files.sh
SQL> select 'asmcmd rm '||name from v$datafile
  2  union all
  3  select 'asmcmd rm '||name from v$tempfile
  4  union all
  5  select 'asmcmd rm '||member from v$logfile;
asmcmd rm +DATA/DB_KIX000/DATAFILE/system.260.1126086617
asmcmd rm +DATA/DB_KIX000/DATAFILE/sysaux.261.1126086651
asmcmd rm +DATA/DB_KIX000/DATAFILE/undotbs1.262.1126086667
asmcmd rm +DATA/DB_KIX000/EB3A921CAD1A96F8E0538C01F40A7C7C/DATAFILE/system.264.1126086767
asmcmd rm +DATA/DB_KIX000/EB3A921CAD1A96F8E0538C01F40A7C7C/DATAFILE/sysaux.265.1126086767
asmcmd rm +DATA/DB_KIX000/EB3A921CAD1A96F8E0538C01F40A7C7C/DATAFILE/undotbs1.266.1126086767
asmcmd rm +DATA/DB_KIX000/F2376EEA6C534070E0532400000AD9BF/DATAFILE/system.273.1126087307
asmcmd rm +DATA/DB_KIX000/F2376EEA6C534070E0532400000AD9BF/DATAFILE/sysaux.270.1126087319
asmcmd rm +DATA/DB_KIX000/F2376EEA6C534070E0532400000AD9BF/DATAFILE/undotbs1.275.1126087477
asmcmd rm +DATA/DB_KIX000/DATAFILE/users.271.1126087469
asmcmd rm +DATA/DB_KIX000/F2376EEA6C534070E0532400000AD9BF/DATAFILE/users.274.1126087469
asmcmd rm +DATA/DB_KIX000/TEMPFILE/temp.263.1126086751
asmcmd rm +DATA/DB_KIX000/F23751912B4D0D30E0532400000A8412/TEMPFILE/temp.267.1126086795
asmcmd rm +DATA/DB_KIX000/F2376EEA6C534070E0532400000AD9BF/TEMPFILE/temp.272.1126087305
asmcmd rm +RECO/DB_KIX000/ONLINELOG/group_3.259.1126086707
asmcmd rm +RECO/DB_KIX000/ONLINELOG/group_2.258.1126086707
asmcmd rm +RECO/DB_KIX000/ONLINELOG/group_1.257.1126086707
SQL> spool off
```

/tmp/cdb_remove_files.sh ファイルから `asmcdm` で始まる行以外を削除します。

```/tmp/cdb_remove_files.sh
asmcmd rm +DATA/DB_KIX000/DATAFILE/system.260.1126086617
asmcmd rm +DATA/DB_KIX000/DATAFILE/sysaux.261.1126086651
asmcmd rm +DATA/DB_KIX000/DATAFILE/undotbs1.262.1126086667
asmcmd rm +DATA/DB_KIX000/EB3A921CAD1A96F8E0538C01F40A7C7C/DATAFILE/system.264.1126086767
asmcmd rm +DATA/DB_KIX000/EB3A921CAD1A96F8E0538C01F40A7C7C/DATAFILE/sysaux.265.1126086767
asmcmd rm +DATA/DB_KIX000/EB3A921CAD1A96F8E0538C01F40A7C7C/DATAFILE/undotbs1.266.1126086767
asmcmd rm +DATA/DB_KIX000/F2376EEA6C534070E0532400000AD9BF/DATAFILE/system.273.1126087307
asmcmd rm +DATA/DB_KIX000/F2376EEA6C534070E0532400000AD9BF/DATAFILE/sysaux.270.1126087319
asmcmd rm +DATA/DB_KIX000/F2376EEA6C534070E0532400000AD9BF/DATAFILE/undotbs1.275.1126087477
asmcmd rm +DATA/DB_KIX000/DATAFILE/users.271.1126087469
asmcmd rm +DATA/DB_KIX000/F2376EEA6C534070E0532400000AD9BF/DATAFILE/users.274.1126087469
asmcmd rm +DATA/DB_KIX000/TEMPFILE/temp.263.1126086751
asmcmd rm +DATA/DB_KIX000/F23751912B4D0D30E0532400000A8412/TEMPFILE/temp.267.1126086795
asmcmd rm +DATA/DB_KIX000/F2376EEA6C534070E0532400000AD9BF/TEMPFILE/temp.272.1126087305
asmcmd rm +RECO/DB_KIX000/ONLINELOG/group_3.259.1126086707
asmcmd rm +RECO/DB_KIX000/ONLINELOG/group_2.258.1126086707
asmcmd rm +RECO/DB_KIX000/ONLINELOG/group_1.257.1126086707
```

#### データベースの停止
初期作成されたデータベースを停止します。(-db パラメータには db_unique_name を指定します。)

```
$ srvctl stop database -db DB_KIX000 -stopoption immediate
```

#### ASMファイルの削除
生成した asmcmd コマンドを実行しASMファイルを削除します。

```
$ chmod 777 /tmp/cdb_remove_files.sh
$ sh /tmp/cdb_remove_files.sh
```

 (必要に応じて)初期化パラメータを変更します。

# リカバリの準備
### 制御ファイルのリストア
バックアップから制御ファイルをリストアします。

#### nomount でデータベースを起動

```
$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Jan 14 10:00:00 2023
Version 19.17.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup nomount

ORACLE instance started.

Total System Global Area 6979317824 bytes
Fixed Size                  9150528 bytes
Variable Size            1191182336 bytes
Database Buffers         5637144576 bytes
Redo Buffers              141840384 bytes
SQL> quit
Disconnected from Oracle Database 19c EE High Perf Release 19.0.0.0.0 – Production
```

#### 制御ファイルのリストア
rman で `restore controlfile from autobackup` コマンドでバックアップから制御ファイルをリストアします。
set dbid でバックアップした際に確認したバックアップしたデータベースの dbid を指定します。

```
$ rman target /
set dbid 0000000000
SET ENCRYPTION ON;
set controlfile autobackup format for device type sbt to '%F';
run {
set dbid 0000000000
allocate channel t1 type 'sbt_tape' parms 'SBT_LIBRARY=/u01/app/oracle/product/19.0.0.0/dbhome_1/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/opcDB.ora)';
restore controlfile from autobackup;
}
```

実行例
```
$ rman target /

Recovery Manager: Release 19.0.0.0.0 - Production on Sat Jan 14 10:00:00 2023
Version 19.17.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

connected to target database: DB2 (not mounted)

RMAN> set dbid 0000000000

executing command: SET DBID

RMAN> SET ENCRYPTION ON;

executing command: SET encryption
using target database control file instead of recovery catalog

RMAN> set controlfile autobackup format for device type sbt to '%F';

executing command: SET CONTROLFILE AUTOBACKUP FORMAT

RMAN> run {
2> set dbid 0000000000
3> allocate channel t1 type 'sbt_tape' parms 'SBT_LIBRARY=/u01/app/oracle/product/19.0.0.0/dbhome_1/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/opcDB.ora)';
4> restore controlfile from autobackup;
5>
6> }
```

`restore controlfile from autobackup` コマンドは７日前までのバックアップから制御ファイルをリストア可能です。
それより前のバックアップの場合 `until time` 句を追加します。




```untile time句：2023/01/14から過去７日分からのリストア
run {
set dbid 0000000000
allocate channel t1 type 'sbt_tape' parms 'SBT_LIBRARY=/u01/app/oracle/product/19.0.0.0/dbhome_1/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/opcDB.ora)';
restore controlfile from autobackup until time "TO_DATE('20230114:00:00','YYYYMMDD:HH24:MI')";
}
```

### データベースのマウント
alter database mount; 文でデータベースをマウントします。

```
RMAN> alter database mount;

Statement processed

RMAN> quit


Recovery Manager complete.
```

###  REDOログファイル/データファイルファイルの位置の修正
リストアした制御ファイルに記載されているREDOログファイル/データファイルの位置を確認します。
リストア先のディスクグループ、db_unique_nameと違う場合、位置を変更します。

#### REDOログファイルの確認

```
set lines 200 pages 200
col member for a100
select member from v$logfile;
```

実行例 (2ノードRAC データベースのバックアップの場合)
```
SQL> set lines 200 pages 200
SQL> col member for a100
SQL> select member from v$logfile;

MEMBER
-------------------------------------------
+DATAC1/DB/ONLINELOG/group_4.310.1123434047
+DATAC1/DB/ONLINELOG/group_3.311.1123434047
+DATAC1/DB/ONLINELOG/group_2.309.1123434047
+DATAC1/DB/ONLINELOG/group_1.308.1123434047
+DATAC1/DB/ONLINELOG/group_5.306.1123434575
+DATAC1/DB/ONLINELOG/group_6.319.1123434577
+DATAC1/DB/ONLINELOG/group_7.320.1123434579
+DATAC1/DB/ONLINELOG/group_8.321.1123434581

8 rows selected.
```

- REDOログ名をバックアップ(+DATAC1/DB)からリストア先のDB名(DB_kix000)に変更するためのSQLを生成し実行します。
(以下のSQLは 環境にあわせて修正ください)

```
set lines 200 pages 200
select 'alter database rename file '||chr(39)||member||chr(39)||' to '||chr(39)||replace(member, 'DATAC1/DB/', 'RECO/DB_kix000/')||chr(39)||';' from v$logfile;
```

実行例
```
SQL> set lines 200 pages 200
SQL> select 'alter database rename file '||chr(39)||member||chr(39)||' to '||chr(39)||replace(member, 'DATAC1/DB/', 'RECO/DB_kix000/')||chr(39)||';' from v$logfile;

'ALTERDATABASERENAMEFILE'||CHR(39)||MEMBER||CHR(39)||'TO'||CHR(39)||REPLACE(MEMBER,'DATAC1/DB/','RECO/DB_kix000/')||CHR(39)||';'
-----------------------------------------------------------------------------------------------------------------------------------
alter database rename file '+DATAC1/DB/ONLINELOG/group_4.310.1123434047' to '+RECO/DB_kix000/ONLINELOG/group_4.310.1123434047';
alter database rename file '+DATAC1/DB/ONLINELOG/group_3.311.1123434047' to '+RECO/DB_kix000/ONLINELOG/group_3.311.1123434047';
alter database rename file '+DATAC1/DB/ONLINELOG/group_2.309.1123434047' to '+RECO/DB_kix000/ONLINELOG/group_2.309.1123434047';
alter database rename file '+DATAC1/DB/ONLINELOG/group_1.308.1123434047' to '+RECO/DB_kix000/ONLINELOG/group_1.308.1123434047';
alter database rename file '+DATAC1/DB/ONLINELOG/group_5.306.1123434575' to '+RECO/DB_kix000/ONLINELOG/group_5.306.1123434575';
alter database rename file '+DATAC1/DB/ONLINELOG/group_6.319.1123434577' to '+RECO/DB_kix000/ONLINELOG/group_6.319.1123434577';
alter database rename file '+DATAC1/DB/ONLINELOG/group_7.320.1123434579' to '+RECO/DB_kix000/ONLINELOG/group_7.320.1123434579';
alter database rename file '+DATAC1/DB/ONLINELOG/group_8.321.1123434581' to '+RECO/DB_kix000/ONLINELOG/group_8.321.1123434581';

8 rows selected.
```

生成された `alter database` 文を実行します。

```
SQL> alter database rename file '+DATAC1/DB/ONLINELOG/group_4.310.1123434047' to '+RECO/DB_kix000/ONLINELOG/group_4.310.1123434047';

Database altered.

SQL> alter database rename file '+DATAC1/DB/ONLINELOG/group_3.311.1123434047' to '+RECO/DB_kix000/ONLINELOG/group_3.311.1123434047';

Database altered.

SQL> alter database rename file '+DATAC1/DB/ONLINELOG/group_2.309.1123434047' to '+RECO/DB_kix000/ONLINELOG/group_2.309.1123434047';

Database altered.

SQL> alter database rename file '+DATAC1/DB/ONLINELOG/group_1.308.1123434047' to '+RECO/DB_kix000/ONLINELOG/group_1.308.1123434047';

Database altered.

SQL> alter database rename file '+DATAC1/DB/ONLINELOG/group_5.306.1123434575' to '+RECO/DB_kix000/ONLINELOG/group_5.306.1123434575';

Database altered.

SQL> alter database rename file '+DATAC1/DB/ONLINELOG/group_6.319.1123434577' to '+RECO/DB_kix000/ONLINELOG/group_6.319.1123434577';

Database altered.

SQL> alter database rename file '+DATAC1/DB/ONLINELOG/group_7.320.1123434579' to '+RECO/DB_kix000/ONLINELOG/group_7.320.1123434579';

Database altered.

SQL> alter database rename file '+DATAC1/DB/ONLINELOG/group_8.321.1123434581' to '+RECO/DB_kix000/ONLINELOG/group_8.321.1123434581';

Database altered.

SQL>
```

#### データファイルの確認

```
col name for a100
select file#, name from v$datafile order by file#;
```

実行例(バックアップにはSeed PDBと2つのPDBがあった)
```
SQL> col name for a100
SQL> select file#, name from v$datafile order by file#;

     FILE# NAME
---------- ----------------------------------------------------------------------------------------------------
         1 +DATAC1/DB/DATAFILE/system.304.1123434355
         2 +DATAC1/DB/EB390E92B92D64A7E053915446647C45/DATAFILE/system.313.1123434107
         3 +DATAC1/DB/DATAFILE/sysaux.318.1123434341
         4 +DATAC1/DB/EB390E92B92D64A7E053915446647C45/DATAFILE/sysaux.314.1123434107
         5 +DATAC1/DB/DATAFILE/undotbs1.303.1123434369
         6 +DATAC1/DB/EB390E92B92D64A7E053915446647C45/DATAFILE/undotbs1.315.1123434107
         7 +DATAC1/DB/DATAFILE/users.305.1123434383
         8 +DATAC1/DB/DATAFILE/undotbs2.317.1123434341
         9 +DATAC1/DB/EFC648AED3D47FF5E0537F00000ACF7D/DATAFILE/system.329.1123434727
        10 +DATAC1/DB/EFC648AED3D47FF5E0537F00000ACF7D/DATAFILE/sysaux.323.1123434735
        11 +DATAC1/DB/EFC648AED3D47FF5E0537F00000ACF7D/DATAFILE/undotbs1.324.1123434741
        12 +DATAC1/DB/EFC648AED3D47FF5E0537F00000ACF7D/DATAFILE/undo_2.325.1123434747
        13 +DATAC1/DB/EFC648AED3D47FF5E0537F00000ACF7D/DATAFILE/users.328.1123434727
        14 +DATAC1/DB/EFD2343FB5691E64E0537F00000A804A/DATAFILE/system.331.1123485889
        15 +DATAC1/DB/EFD2343FB5691E64E0537F00000A804A/DATAFILE/sysaux.332.1123485889
        16 +DATAC1/DB/EFD2343FB5691E64E0537F00000A804A/DATAFILE/undotbs1.333.1123485889
        17 +DATAC1/DB/EFD2343FB5691E64E0537F00000A804A/DATAFILE/undo_2.334.1123485889
        18 +DATAC1/DB/EFD2343FB5691E64E0537F00000A804A/DATAFILE/users.335.1123485889

18 rows selected.
```

- データファイル名をバックアップ(+DATA/DB)からリストア先のDB名(DB_kix000)に変更するrmanコマンドを生成します。
(以下のSQLは 環境にあわせて修正ください)

```
select 'set newname for datafile '||file#||' to '||chr(39)||replace(name, 'DATAC1/DB', 'DATA/DB_kix000')||chr(39)||';' from v$datafile;
```

実行例
```
SQL>  select 'set newname for datafile '||file#||' to '||chr(39)||replace(name, 'DATAC1/DB', 'DATA/DB_kix000')||chr(39)||';' from v$datafile;

'SETNEWNAMEFORDATAFILE'||FILE#||'TO'||CHR(39)||REPLACE(NAME,'DATAC1/DB','DATA/DB_kix000')||CHR(39)||';'
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
set newname for datafile 1 to '+DATA/DB_kix000/DATAFILE/system.304.1123434355';
set newname for datafile 2 to '+DATA/DB_kix000/EB390E92B92D64A7E053915446647C45/DATAFILE/system.313.1123434107';
set newname for datafile 3 to '+DATA/DB_kix000/DATAFILE/sysaux.318.1123434341';
set newname for datafile 4 to '+DATA/DB_kix000/EB390E92B92D64A7E053915446647C45/DATAFILE/sysaux.314.1123434107';
set newname for datafile 5 to '+DATA/DB_kix000/DATAFILE/undotbs1.303.1123434369';
set newname for datafile 6 to '+DATA/DB_kix000/EB390E92B92D64A7E053915446647C45/DATAFILE/undotbs1.315.1123434107';
set newname for datafile 7 to '+DATA/DB_kix000/DATAFILE/users.305.1123434383';
set newname for datafile 8 to '+DATA/DB_kix000/DATAFILE/undotbs2.317.1123434341';
set newname for datafile 9 to '+DATA/DB_kix000/EFC648AED3D47FF5E0537F00000ACF7D/DATAFILE/system.329.1123434727';
set newname for datafile 10 to '+DATA/DB_kix000/EFC648AED3D47FF5E0537F00000ACF7D/DATAFILE/sysaux.323.1123434735';
set newname for datafile 11 to '+DATA/DB_kix000/EFC648AED3D47FF5E0537F00000ACF7D/DATAFILE/undotbs1.324.1123434741';
set newname for datafile 12 to '+DATA/DB_kix000/EFC648AED3D47FF5E0537F00000ACF7D/DATAFILE/undo_2.325.1123434747';
set newname for datafile 13 to '+DATA/DB_kix000/EFC648AED3D47FF5E0537F00000ACF7D/DATAFILE/users.328.1123434727';
set newname for datafile 14 to '+DATA/DB_kix000/EFD2343FB5691E64E0537F00000A804A/DATAFILE/system.331.1123485889';
set newname for datafile 15 to '+DATA/DB_kix000/EFD2343FB5691E64E0537F00000A804A/DATAFILE/sysaux.332.1123485889';
set newname for datafile 16 to '+DATA/DB_kix000/EFD2343FB5691E64E0537F00000A804A/DATAFILE/undotbs1.333.1123485889';
set newname for datafile 17 to '+DATA/DB_kix000/EFD2343FB5691E64E0537F00000A804A/DATAFILE/undo_2.334.1123485889';
set newname for datafile 18 to '+DATA/DB_kix000/EFD2343FB5691E64E0537F00000A804A/DATAFILE/users.335.1123485889';

18 rows selected.
SQL> quit
Disconnected from Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
Version 19.17.0.0.0
```

# リストアとリカバリ
### バックアップのリストア
生成した set newname 文を利用してバックアップをリストアします。

```
$ rman target /

RMAN> 
SET ENCRYPTION ON;

run {
allocate channel t1 type 'sbt_tape' parms 'SBT_LIBRARY=/u01/app/oracle/product/19.0.0.0/dbhome_1/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/u01/app/oracle/product/19.0.0.0/dbhome_1/dbs/opcDB.ora)';
set newname for datafile 1 to '+DATA/DB_kix000/DATAFILE/system.304.1123434355';
set newname for datafile 2 to '+DATA/DB_kix000/EB390E92B92D64A7E053915446647C45/DATAFILE/system.313.1123434107';
set newname for datafile 3 to '+DATA/DB_kix000/DATAFILE/sysaux.318.1123434341';
set newname for datafile 4 to '+DATA/DB_kix000/EB390E92B92D64A7E053915446647C45/DATAFILE/sysaux.314.1123434107';
set newname for datafile 5 to '+DATA/DB_kix000/DATAFILE/undotbs1.303.1123434369';
set newname for datafile 6 to '+DATA/DB_kix000/EB390E92B92D64A7E053915446647C45/DATAFILE/undotbs1.315.1123434107';
set newname for datafile 7 to '+DATA/DB_kix000/DATAFILE/users.305.1123434383';
set newname for datafile 8 to '+DATA/DB_kix000/DATAFILE/undotbs2.317.1123434341';
set newname for datafile 9 to '+DATA/DB_kix000/EFC648AED3D47FF5E0537F00000ACF7D/DATAFILE/system.329.1123434727';
set newname for datafile 10 to '+DATA/DB_kix000/EFC648AED3D47FF5E0537F00000ACF7D/DATAFILE/sysaux.323.1123434735';
set newname for datafile 11 to '+DATA/DB_kix000/EFC648AED3D47FF5E0537F00000ACF7D/DATAFILE/undotbs1.324.1123434741';
set newname for datafile 12 to '+DATA/DB_kix000/EFC648AED3D47FF5E0537F00000ACF7D/DATAFILE/undo_2.325.1123434747';
set newname for datafile 13 to '+DATA/DB_kix000/EFC648AED3D47FF5E0537F00000ACF7D/DATAFILE/users.328.1123434727';
set newname for datafile 14 to '+DATA/DB_kix000/EFD2343FB5691E64E0537F00000A804A/DATAFILE/system.331.1123485889';
set newname for datafile 15 to '+DATA/DB_kix000/EFD2343FB5691E64E0537F00000A804A/DATAFILE/sysaux.332.1123485889';
set newname for datafile 16 to '+DATA/DB_kix000/EFD2343FB5691E64E0537F00000A804A/DATAFILE/undotbs1.333.1123485889';
set newname for datafile 17 to '+DATA/DB_kix000/EFD2343FB5691E64E0537F00000A804A/DATAFILE/undo_2.334.1123485889';
set newname for datafile 18 to '+DATA/DB_kix000/EFD2343FB5691E64E0537F00000A804A/DATAFILE/users.335.1123485889';
restore database;
switch datafile all;
recover database until available redo;
release channel t1;
}
```

コマンド結果
```
allocated channel: t1
channel t1: SID=185 device type=SBT_TAPE
channel t1: Oracle Database Backup Service Library VER=21.0.0.1

executing command: SET NEWNAME

<< 中略 >>

channel t1: restored backup piece 1
channel t1: restore complete, elapsed time: 00:00:07
Finished restore at 14-JAN-23

datafile 1 switched to datafile copy
input datafile copy RECID=39 STAMP=1-00000000 file name=+DATA/DB_KIX000/DATAFILE/DATAFILE/system.289.1126089443

<< 中略 >>

starting media recovery

<< 中略 >>

Finished recover at 14-JAN-23

released channel: t1
```

### block change trackingの修正
バックアップしたデータベースでブロック変更トラッキングが有効になっている場合、ブロック変更トラッキング・ファイルのディレクトリが作成したBase Databaseと違う場合があります。
今回は作成したBase Databaseのディレクトリを使用するように修正します。

```
alter database disable BLOCK CHANGE TRACKING;
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '+DATA';
```

実行例
```
RMAN> alter database disable BLOCK CHANGE TRACKING;

Statement processed

RMAN> ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '+DATA';

Statement processed
```


### Databaseのオープン
resetlogs付でデータベースをオープンします。

```
alter database open resetlogs ;
```

実行例
```
RMAN> alter database open resetlogs ;

Statement processed

RMAN> quit


Recovery Manager complete.
```

# 後処理
### 各PDBのオープン
リストア直後は、PDBがオープンしていない場合があります。
それぞれのPDBをオープンします。
また、次回起動時は自動オープンするように状態を保存します。


```
$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Jan 14 10:00:00 2023
Version 19.17.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
Version 19.17.0.0.0

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           MOUNTED
         4 PDB2                           MOUNTED
SQL> alter pluggable database pdb1 open;

Pluggable database altered.

SQL> alter pluggable database pdb2 open;

Pluggable database altered.

SQL> alter pluggable database all save state;

Pluggable database altered.

SQL> quit
Disconnected from Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
Version 19.17.0.0.0
```

### 再起動後の自動起動の確認
ノードを再起動し、データベースの起動、PDBのオープンを確認します。
あわせて、各クライアントから接続できることを確認します。
接続できない場合、リスナーの状態、クライアントのtnsnames.oraの設定を確認します。

### (オプション) REDOログファイルの最適化
今回は、2ノードRAC構成のデータベースバックアップをシングルインスタンスのデータベースにリストアしました。
Thread 2 のREDOロググループは利用しないので削除することが可能です。
v$log ビューを確認し削除可能なREDOロググループを確認し、削除します。

```
SQL> select * from V$LOG;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- ---------- --- ----------
         1          1          5 4194304000        512          1 NO  CURRENT
         2          1          2 4194304000        512          1 YES ACTIVE
         3          1          3 4194304000        512          1 YES ACTIVE
         4          1          4 4194304000        512          1 YES ACTIVE
         5          2          1 4194304000        512          1 YES INACTIVE
         6          2          0 4194304000        512          1 YES UNUSED
         7          2          0 4194304000        512          1 YES UNUSED
         8          2          0 4194304000        512          1 YES UNUSED

8 rows selected.

SQL> alter database disable thread 2;

Database altered.

SQL> alter database drop logfile group 5;

Database altered.

SQL> alter database drop logfile group 6;

Database altered.

SQL> alter database drop logfile group 7;

Database altered.

SQL> alter database drop logfile group 8;

Database altered.
```


### (オプション) データベースのクローン
リストアしたデータベースでは、プラガブル・データベースの状態がWebコンソールに反映されていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/ae55a847-1f89-fbfb-f659-11b30485c570.png)
（実際はPDB1/PDB2の2つのPDBがあるにもかかわらずWebコンソール上は1つのみ）

DBシステムをクローンすることで、クローン先のデータベースのPDBはWebコンソールに反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/7a3a2729-c5fb-74d2-306e-cb1e11d2039e.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/0de007bc-292c-6366-06f2-4e996f6daf15.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/04cb1957-3b84-fc5c-6fb6-855469c6dcac.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/f5d31bd2-a182-f955-849e-d572e440721a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/f0f27f51-3d04-0c6d-07dc-24fb0c4e9bc6.png)

クローンされたDBシステムのデータベースを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/c314a010-6580-1c79-2036-86f8a20ce777.png)
実際と同様にPDB1/PDB2の2つが表示されました。



# おわりに

RMANバックアップを使用したObject Storageからのデータベースのリカバリができました。

# 参考情報

- [RMANを使用したオブジェクト・ストレージへのデータベースのバックアップ](https://docs.oracle.com/cd/E83857_01/paas/bm-and-vm-dbs-cloud/dbbackuprman/index.html)
- [RMANバックアップを使用したオブジェクト・ストレージからのデータベースのリカバリ](https://docs.oracle.com/cd/E83857_01/paas/bm-and-vm-dbs-cloud/dbsrduuu/index.html)
- [Oracle Database Cloud Backup ModuleでデータベースをOCI Object Storageにバックアップする方法](https://qiita.com/RexZheng/items/b64b5494899da0980970)
- [[Oracle Cloud] DBCSのバックアップを、別リージョンにレプリケーション&リストアする](https://qiita.com/NSO-KC/items/8330c32ba58b0a450ad1)