[Oracle Cloud] DBCSのバックアップを、別リージョンにレプリケーション&リストアする

# はじめに
DBCS(VM構成)は、Boot Volumeと9つのBoot Volumeで構成されています。以下のような構成イメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/283a7b07-eb38-adfc-ed4b-a9a18dcff6dd.png)
Boot Volumeのバックアップは、内部的に週次バックアップされているそうです　。何か問題があったら、サポートに連絡するとリストアしてくれるそうです。(長いこと、バックアップできないのだと思ってました。。)

[マニュアル](https://docs.cloud.oracle.com/en-us/iaas/Content/Database/Concepts/overview.htm)より
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/2be96468-76d7-7a97-27d3-3a1245c99408.png) 

Boot Volume以外では、OCIの機能で取得可能なバックアップはDB部分のみです。Block Volume単位のバックアップは取得できません。DBをバックアップしたい場合、DBCSで利用可能なバックアップ方法は以下の3つだと思います。

* [自動バックアップ](https://docs.cloud.oracle.com/en-us/iaas/Content/Database/Tasks/backingupOS.htm)
* [dbcli](https://docs.cloud.oracle.com/en-us/iaas/Content/Database/Tasks/backingupFRA.htm)
* [Oracle Database Backup Cloud Serviceを利用した、RMANバックアップ](https://docs.cloud.oracle.com/en-us/iaas/Content/Database/Tasks/backingupOSrman.htm)

いずれの方法も内部的にRMANを利用します。ですが、複数のバックアップ方法を併用することができません。# 途中で方法を変更してしまうと、制御ファイルに格納されているRMANの設定情報を上書いてしまうからなのか。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/93d054a5-6679-f88f-5259-a9bd95061ae3.png)
基本的には、簡単に利用できて、工数を抑えることができる「自動バックアップ」を選択するのがよいと思います。ただし、(現状) 自動バックアップには以下の制約があります。

* バックアップ方式が、週次のフルバックアップ・日次の増分バックアップに固定される
* バックアップの保持期限と、バックアップ開始時間をリストから選択することができるが、厳密な指定はできない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/b04ed2b0-6c26-e184-46b4-c2cd27bf7fde.png)
* バックアップ先がOracle Cloud管理のObject Storageになる。そのため、リージョン間コピーなどのObject Storageの機能を活用できない
* DBCSを削除すると、自動バックアップも同時に削除される…そのため、間違えて削除すると大変なことになる。ただし、消す時に、本当に消していいんですか？と聞いてきてくれはします。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/12afe9bd-9c9b-0e8a-5359-6e5069a95945.png)

ここでは、DBCSのバックアップを東京リージョンと大阪リージョンに取得して災害対策したいケースを想定します。本来、EEであればData Guard、SEであれば基本スタンバイやリフレッシュ可能PDBを活用したほうがよいと思いますが、その場合は災対側で常時DBCSを起動しておく必要があります。少しでも費用を下げたい、バックアップ・データだけ災対に送りたい、そんな要件を想定します。

この要件の場合、「自動バックアップ」では、Object Storageのリージョン間コピー機能を利用することができません。バックアップ先がOracle Cloud管理のObject Storageだからです。一方、dbcliかBackup Cloud Serviceであれば、ユーザ管理のObject Storageにバックアップを配置することができるため、Object Storageのリージョン間リプリケーション機能でバックアップをコピーできます。

ここでは、Backup Cloud Serviceを使って東京リージョンのObject Storageにバックアップを取得し、レプリケーション機能を使って大阪リージョンにバックアップをコピーします。大阪リージョンにリストアまでやってみます。

構成は、以下図のようなイメージです。検証は、19c Eenterprise Editionを利用しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/79619fe7-06ab-a2a1-52ca-342683acc5fd.png)

Backup Cloud Serviceを使用して、別リージョンにリストアすることを想定した場合、DB本体に加えてTDEマスター暗号鍵のバックアップも取得する必要があります。加えて、ウォレット・パスワードも忘れないようにしておく必要があることに注意します。

ウォレット・パスワードは、DBCS作成時の以下の画面で指定する文字列です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/97e18410-36ff-b265-f124-19fe9f94326a.png)

# バックアップする
## 事前準備
事前準備として、バックアップ用の環境を構成します。

① 東京リージョンに、バックアップファイル格納用の「バケット(東京)」を作成
② 大阪リージョンに、レプリケーション用の「バケット(大阪)」を作成
③ 「バケット(東京)」にレプリケーション・ポリシーを設定し、「バケット(大阪)」にレプリケーションするように設定する 
** レプリケーションは、レプリケーション・ポリシーを設定した以降のオブジェクトのみが伝搬対象になるため注意。
** 初めてレプリケーションを設定する場合、Object Storageサービスに対してレプリケーションするための権限を付与してあげる必要があるかもしれません。詳細は[マニュアル](https://docs.oracle.com/en-us/iaas/Content/Object/Tasks/usingreplication.htm)を確認してください
④ 認証用のユーザとグループを作成。作成したグループにユーザを所属させる
⑤ ポリシーを作成し、④で作成したグループに以下の権限を付与する

```
Allow group <グループ名> to manage objects in compartment <コンパートメント名> where target.bucket.name = '<バケット名(東京)>'
Allow group <グループ名> to manage objects in compartment <コンパートメント名> where target.bucket.name = '<バケット名(大阪)>'
Allow group <グループ名> to read buckets in compartment <コンパートメント名>
```
④ ④で作成したユーザに認証トークンを作成
⑤ DBCSから以下のコマンドを実行して、④で作成したユーザからバケット(東京)にアクセスできることを確認する

```
# curl -i -u '<ユーザ名>:<トークン>' https://swiftobjectstorage.<リージョン名>.oraclecloud.com/v1/<ネームスペース名>/<バケット名>

★ HTTP/1.1 200 OK
//省略//
access-control-expose-headers: accept-ranges,access-control-allow-credentials,access-control-allow-methods,access-control-allow-origin,content-length,content-type,date,opc-client-info,opc-request-id,x-api-id,x-container-bytes-used,x-container-object-count,x-timestamp,x-trans-id
★ 
⇒ ステータスコードが200 OKであること。最終行にエラー・メッセージが表されないこと。
```

## ODBCS Moduleの設定
Oracle Database Backup Cloud Serviceの設定を行います。通常、ODBCS用のモジュールは、[OTN](https://www.oracle.com/database/technologies/oracle-cloud-backup-downloads.html)からダウンロードしますが、DBCS用のモジュールが配置されているため、それをつかいます。基本的には、[マニュアル](https://docs.cloud.oracle.com/en-us/iaas/Content/Database/Tasks/backingupOSrman.htm)に従えば設定できます

```CONSOLE
## rootユーザにスイッチ
$ sudo su - 

## インストール先ディレクトリの作成
## ここでは、/opt/oracle/odbcsディレクトリにインストールします
# ODBCS_INST_DIR=/opt/oracle/odbcs
# mkdir ${ODBCS_INST_DIR}
# chown oracle.oinstall ${ODBCS_INST_DIR}

# su - oracle
$ cd /opt/oracle/oak/pkgrepos/oss/odbcs

$ ODBCS_INST_DIR=/opt/oracle/odbcs
## libディレクトリを作成しないとエラーになったため、作成
$ mkdir ${ODBCS_INST_DIR}/lib/
## モジュールをインストール
## インターネットから、ファイルをダウンロードしてくるようで、NAT GWなどインターネットへの出口を用意してあげる必要があります
$ java -jar opc_install.jar \
  -opcId <認証ユーザ名> \
  -opcPass '<認証トークン>' \
  -container <バケット(東京)名> \
  -walletDir ${ODBCS_INST_DIR}/hsbtwallet/ \
  -libDir ${ODBCS_INST_DIR}/lib/ \
  -configfile ${ODBCS_INST_DIR}/config \
  -host https://swiftobjectstorage.<リージョン名>.oraclecloud.com/v1/<ネームスペース名>

Oracle Database Cloud Backup Module Install Tool, build 12.2.0.1.0DBBKPCSBP_2018-06-12
Oracle Database Cloud Backup Module credentials are valid.
Backups would be sent to container バケット(東京)名.
Oracle Database Cloud Backup Module wallet created in directory /opt/oracle/odbcs/hsbtwallet.
Oracle Database Cloud Backup Module initialization file /opt/oracle/odbcs/config created.
Downloading Oracle Database Cloud Backup Module Software Library from file opc_linux64.zip.
Download complete.

## モジュールをインストールすると、以下のようなファイルが展開されます
#  find ${ODBCS_INST_DIR} -type f -ls

2621453    4 -rw-------   1 oracle   oinstall     1645 Dec 17 17:25 /opt/oracle/odbcs/hsbtwallet/cwallet.sso
2621451    0 -rw-------   1 oracle   oinstall        0 Dec 17 17:25 /opt/oracle/odbcs/hsbtwallet/cwallet.sso.lck
2624308  104 -rw-r--r--   1 oracle   oinstall   105809 Dec 17 17:25 /opt/oracle/odbcs/lib/odbsrmt.py
2624306 91228 -rw-r--r--   1 oracle   oinstall 93414592 Dec 17 17:25 /opt/oracle/odbcs/lib/libopc.so
2624305   20 -rw-r--r--   1 oracle   oinstall    17086 Dec 17 17:25 /opt/oracle/odbcs/lib/bulkimport.pl
2624307    4 -rw-r--r--   1 oracle   oinstall      286 Dec 17 17:25 /opt/oracle/odbcs/lib/metadata.xml
2624310   12 -rw-r--r--   1 oracle   oinstall     9801 Dec 17 17:25 /opt/oracle/odbcs/lib/python_readme.txt
2624309    8 -rw-r--r--   1 oracle   oinstall     4726 Dec 17 17:25 /opt/oracle/odbcs/lib/perl_readme.txt
2621454    4 -rw-r--r--   1 oracle   oinstall      188 Dec 17 17:25 /opt/oracle/odbcs/config
```

Configには、以下のような内容が記載されています。

```
$ cat ${ODBCS_INST_DIR}/config

OPC_HOST=https://swiftobjectstorage.ap-tokyo-1.oraclecloud.com/v1/<ネームスペース名>
OPC_WALLET='LOCATION=file:/opt/oracle/odbcs/hsbtwallet CREDENTIAL_ALIAS=alias_opc'
OPC_CONTAINER=<バケット(東京)名>
```

## RMAN設定
RMANの設定を行います。バックアップ時に利用するデフォルト・メディアをテープ(SBT_TAPE)に設定し、テープバックアップ時にBackup Cloud Serviceのモジュールを利用するように指定します

```
## デバイスタイプとしてテープ(SBT_TAPE)を使用した場合に、Cloud Backup Serviceのモジュールが使われるように構成します # ODBCS_ISNT_DIR変数には、モジュールのインストール先のディレクトリ・パスが代入されているものとします
$ rman target / <<EOF
CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' PARMS 'SBT_LIBRARY=${ODBCS_INST_DIR}/lib/libopc.so, SBT_PARMS=(OPC_PFILE=${ODBCS_INST_DIR}/config)';
EOF

## 設定されたことを確認
$ rman target /
RMAN> show all;

//省略//
CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' PARMS  'SBT_LIBRARY=/opt/oracle/odbcs/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/opt/oracle/odbcs/config)';
//省略//

## その他のRMAN設定

## デフォルトのデバイス・タイプをSBT_TAPEに指定
RMAN> CONFIGURE DEFAULT DEVICE TYPE TO SBT_TAPE;

## バックアップ最適化を有効化
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;

## 自動バックアップを有効化
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;

## 自動バックアップの出力先を、SBT_TAPEに変更
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE SBT_TAPE TO '%F';

## 暗号化を有効化
RMAN> CONFIGURE ENCRYPTION FOR DATABASE ON;

## 最終的な設定を確認します
RMAN> show all;
//省略//
```

## バックアップの取得
以下のコマンドを実行して、フル・増分・アーカイブREDOログバックアップが取得できることを確認します

```
## フルバックアップを取得してみる
RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE PLUS ARCHIVELOG;

//省略//
Starting Control File and SPFILE Autobackup at 18-DEC-20
piece handle=c-3590099993-20201218-00 comment=API Version 2.0,MMS Version 19.0.0.1
Finished Control File and SPFILE Autobackup at 18-DEC-20

## 差分バックアップを取ってみる
RMAN> BACKUP INCREMENTAL LEVEL 1 DATABASE PLUS ARCHIVELOG;

//省略//
Starting Control File and SPFILE Autobackup at 18-DEC-20
piece handle=c-3590099993-20201218-01 comment=API Version 2.0,MMS Version 19.0.0.1
Finished Control File and SPFILE Autobackup at 18-DEC-20

## アーカイブREDOログのバックアップを取ってみる
RMAN> BACKUP ARCHIVELOG ALL;

//省略//
Starting Control File and SPFILE Autobackup at 18-DEC-20
piece handle=c-3590099993-20201218-02 comment=API Version 2.0,MMS Version 19.0.0.1
Finished Control File and SPFILE Autobackup at 18-DEC-20

## EEであれば、パラレル・バックアップも設定してみます
RMAN> CONFIGURE DEVICE TYPE sbt PARALLELISM 2;
RMAN> BACKUP INCREMENTAL LEVEL 0 DATABASE PLUS ARCHIVELOG;
//省略//
current log archived
allocated channel: ORA_SBT_TAPE_1
channel ORA_SBT_TAPE_1: SID=56 device type=SBT_TAPE
channel ORA_SBT_TAPE_1: Oracle Database Backup Service Library VER=19.0.0.1
allocated channel: ORA_SBT_TAPE_2
channel ORA_SBT_TAPE_2: SID=22 device type=SBT_TAPE
channel ORA_SBT_TAPE_2: Oracle Database Backup Service Library VER=19.0.0.1
⇒ 指定したPrallelismの数だけChannelが起動することを確認します
//省略//

RMAN> list backupset;
//省略//
BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
33      Incr 0  1.25M      SBT_TAPE    00:00:00     18-DEC-20      
        BP Key: 41   Status: AVAILABLE  Compressed: NO  Tag: TAG20201218T095401
        Handle: 1avich3c_1_1   Media: swiftobjectstorage.ap-tok..cloud.com/v1/<ネームスペース名>/<バケット名>
//省略//

```

バックアップを取得したバケットを覗いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/b7ed2cd0-8b68-75c0-a58a-6a0e3b0abb64.png)

file_chunkとsbt_catalogの文字が見えます。sbt_catalog/<ハンドル名>/metadata.xmlに、メタデータが格納されています。metadata.xmlファイルに、DB名やバージョン、バックアップ・ピースの実体へのパスなどの情報が格納されています。バックアップ・ピースの実体は、file_chunk/から始まるオブジェクトです。以下のような命名規則になっていました。オブジェクト名にDBIDが含まれているので、DBIDが分からなくなったときの確認にも使えます

 file_chunk/<DBID>/<DB名>/backuppiece/YYYY-MM-DD/ハンドル名/<何かの識別子>/NNNNNNNNNN

また、バケット(大阪)にレプリケーションされていることも確認しておきます。

## TDEマスター暗号鍵のバックアップ
Backup Cloud Serviceで取得したバックアップを、異なるDBCSにリストアする際にはTDEマスター暗号鍵が必要です。DBCSでは、デフォルトでTDE表領域暗号化が有効になっているからです。
TDEマスター暗号鍵は、/opt/oracle/dcs/commonstore/wallets/tde/< DBユニーク名 >/ディレクトリ配下のウォレットに格納されています。

```
$ ll /opt/oracle/dcs/commonstore/wallets/tde/*/             
total 28
-rw------- 1 oracle asmadmin 5864 Dec 17 16:50 cwallet.sso
-rw------- 1 oracle asmadmin 5819 Dec 17 16:50 ewallet.p12
-rw------- 1 oracle asmadmin 2555 Dec 17 16:50 ewallet_2020121707504352_defaultTag.p12
```

TDEマスター暗号鍵が格納されるウォレットは、ewallet.p12です。cwallet.ssoは、自動ログイン用のウォレットです。ewallet.p12のバックアップは必須です。cwallet.ssoのバックアップもあったほうがリストアが簡単になったので、/opt/oracle/dcs/commonstore/wallets/tde/< DBユニーク名 >/ディレクトリをtarで固めてバックアップを取得しておけばよいと思います。oci cliをDBCSに導入して、oci cliから「バケット(東京)」にバックアップします。

後は、以下ファイルのバックアップも一緒にとっておいた方がリストア手順がシンプルになりました。この手順では、以下のファイル/ディレクトリもバックアップを取得している前提としています
・初期化パラメータファイルをテキスト形式で出力したもの
・DBのパスワード・ファイル
・Backup Cloud Serviceのインストール先ディレクトリ (この手順中では/opt/oracle/odbcs/ディレクトリ)

# 大阪リージョンにリストアする

※実際に試した手順をもとに記載していますが、マニュアルに記載されていたりSRに確認したものではありません。参考情報として参照してください。

以下のようにリストアしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/ec912577-9079-ffda-69cb-936de5be2e8e.png)
リストア後にUnplug / Plugしているのは、リストア後もOCIのWebコンソールからDB関連の操作(パッチ宛てなど)ができるようにするためです。
Backup Cloud Service や dbcliで取得したバックアップでは、DBCS作成時にバックアップを指定することができません(自動バックアップであれば可能)。DBCS(VM構成)の場合、コンソールから操作可能なDBは、DBCS作成と一緒に作成されたDBだけです。(現状、別ソースからリストアしたDBを新規登録することができないため)

## 事前準備
* 大阪リージョンにDBCSを新規に作成します
* 動作確認のため、大阪に作成したDBCSから「バケット(東京)」にアクセスできないようします。方法はいくつかあると思いますが、私はDBCSをプライベート・サブネットに配置していたので、NATゲートウェイをルーティング・テーブルから削除して、サービス・ゲートウェイのみとすることで、別リージョンへのバケットにアクセスできないようにして確認しました

* DBCS作成後、以下のコマンドを実行して、「バケット(東京)」にはアクセスできないが「バケット(大阪)」にはアクセスできることを確認します

```
# curl -i -u '<ユーザ名>:<トークン>' https://swiftobjectstorage.ap-tokyo-1.oraclecloud.com/v1/<ネームスペース名>/<バケット名>
⇒ オブジェクトの一覧が出力されないこと

# curl -i -u '<ユーザ名>:<トークン>' https://swiftobjectstorage.ap-osaka-1.oraclecloud.com/v1/<ネームスペース名>/<バケット名>
⇒ オブジェクトの一覧を参照することができること
```

## Backup Cloud Serviceのモジュール配置
Backup Clouse Serviceのインストールディレクトリのバックアップを***リストア元のDBCS(東京)と同じディレクトリに***リストアします

```CONSOLE
## リストア後にパーミッションなどを確認
# find /opt/oracle/odbcs -type f -ls
//省略//

## configファイルを書き換えます
$  cat /opt/oracle/odbcs/config
OPC_HOST=https://swiftobjectstorage.ap-tokyo-1.oraclecloud.com/v1/nrbfvx3ft2vj
OPC_WALLET='LOCATION=file:/opt/oracle/odbcs/hsbtwallet CREDENTIAL_ALIAS=alias_opc'
OPC_CONTAINER=<東京リージョンのバケット名>

$ cp -pi /opt/oracle/odbcs/config /opt/oracle/odbcs/config.$(date '+%Y%m%d'.bak)
$ vi /opt/oracle/odbcs/config
OPC_HOST=https://swiftobjectstorage.ap-osaka-1.oraclecloud.com/v1/<ネームスペース名>
⇒ ap-osaka-1に書き換える
OPC_WALLET='LOCATION=file:/opt/oracle/odbcs/hsbtwallet CREDENTIAL_ALIAS=alias_opc'
OPC_CONTAINER=<レプリケーション先のバケット名に書き換える>
```

## ウォレットのバックアップをリストアする
ウォレットのバックアップを***リストア元のDBCS(東京)と同じパスに***リストアします。

```
## cwallet.ssoとewallet.p12がリストアされていることを確認します。#パーミッションにも気を付けてください

$ find /opt/oracle/dcs/commonstore/wallets/tde/<東京DBCSのユニーク名>/ -ls
    53   52 drwx------   2 oracle   oinstall    20480 Dec 17 16:50 /opt/oracle/dcs/commonstore/wallets/tde/DBユニーク名/
    50    8 -rw-------   1 oracle   oinstall     5819 Dec 17 16:50 /opt/oracle/dcs/commonstore/wallets/tde/DBユニーク名/ewallet.p12
    51    8 -rw-------   1 oracle   oinstall     5864 Dec 17 16:50 /opt/oracle/dcs/commonstore/wallets/tde/DBユニーク名/cwallet.sso
    49    4 -rw-------   1 oracle   oinstall     2555 Dec 17 16:50 /opt/oracle/dcs/commonstore/wallets/tde/DBユニーク名/ewallet_2020121707504352_defaultTag.p12
```

## 初期作成されたDBを停止する
リストア前に、DBCS作成時に一緒に作成されたDBCSを停止します

```
# su - oracle
$ srvctl stop database -db $(srvctl config database)
```

## 初期化パラメータをリストア・編集する
バックアップからテキスト形式の初期化パラメータを任意のパスにリストアし、不要な行を削除します

```
## 任意ファイルにリストア後、以下のパラメータを削除します。
$ vi <リストアしたpfile>
先頭にある<DB名>.__から始まるSGA動的調整関連のパラメータ
.control_files
.local_listener

## audit_file_destに指定されているディレクトリを事前に作成
$ mkdir /u01/app/oracle/admin/<DBユニーク名(東京)>/adump
$ chmod 750 /u01/app/oracle/admin/<DBユニーク名(東京)>
$ chmod 750 /u01/app/oracle/admin/<DBユニーク名(東京)>/adump
$ find /u01/app/oracle/admin/<DBユニーク名> -ls
3421511    4 drwxr-x---   3 oracle   oinstall     4096 Dec 22 11:44 /u01/app/oracle/admin/DBユニーク名(東京)/
3545703    4 drwxr-x---   2 oracle   oinstall     4096 Dec 22 11:44 /u01/app/oracle/admin/DBユニーク名(東京)/adump
```

## 修正したPFILEを使用し、NOMOUNT起動する

```
## ORACLE_SIDにTEMP_DBを指定し、ORACLE_UNQNAMEにリストア元のDBCS(東京)の値を設定する
$ export ORACLE_SID=TEMP_DB
$ export ORACLE_UNQNAME=<リストア元のORACLE_UNQNAME>

## PFILEを使用して、NOMOUNT起動する
$ sqlplus / as sysdba

SQL> startup pfile='PFILEへのパス' nomount;

ORACLE instance started.

Total System Global Area 6442449472 bytes
Fixed Size                  9148992 bytes
Variable Size            1090519040 bytes
Database Buffers         5318377472 bytes
Redo Buffers               24403968 bytes
⇒ ORA-から始まるエラーメッセージが表示されないこと

SQL> exit
```

## 制御ファイルのリストア
「バケット(大阪)」から、制御ファイルをリストアします

```
$ rman target /

## ウォレット・パスワードをSET
RMAN> SET DECRYPTION WALLET OPEN IDENTIFIED BY <ウォレット・パスワード>;

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

## DBIDをセットし、制御ファイルをリストアする
## DBIDがわからない場合は、レプリケーション先バケットのオブジェクト名から判断する
## file_chunk/<DBID>/<DB名>/backuppiece/YYYY-MM-DD/

RMAN> run
{
  SET DBID <DBID>;

  ALLOCATE CHANNEL sbt1 DEVICE TYPE 'SBT_TAPE' PARMS 'SBT_LIBRARY=/opt/oracle/odbcs/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/opt/oracle/odbcs/config)';
  RESTORE CONTROLFILE FROM AUTOBACKUP;
}

//省略//
output file name=+RECO/DB19C02_NRT1VQ/CONTROLFILE/current.263.1059825205
Finished restore at 22-DEC-20
released channel: sbt1

## SPファイルを作成する
RMAN> create spfile='+DATA' from memory;
RMAN> exit


## 新規作成した初期化パラメータファイルのASMファイル名を確認する
$ exit
# su - grid
$ asmcmd ls DATA/*/PARAMETERFILE/

+DATA/<大阪のDBユニーク名>/PARAMETERFILE/:
spfile.269.1059821455

+DATA/<東京のDBユニーク名>/PARAMETERFILE/:
spfile.273.1059825563

⇒ パスに<東京のDBユニーク名>が含まれるDBの初期化パラメータファイルのパスをメモする

$ exit
# su - oracle
$ export ORACLE_SID=TEMP_DB
$ export ORACLE_UNQNAME=<リストア元のORACLE_UNQNAME>
$ cd $ORACLE_HOME/dbs

## init${ORACLE_SID}.oraファイルに、新規作成した初期化パラメータファイルのパスを記載する
$ vi initTEMP_DB.ora
SPFILE=+DATA/<DBユニーク名>/PARAMETERFILE/spfile.273.1059735101

## 新規作成した初期化パラメータファイルを使用して、MOUNT起動する
$ sqlplus / as sysdba
SQL> shu immediate;

SQL> startup mount;

ORACLE instance started.

Total System Global Area 6442449472 bytes
Fixed Size                  9148992 bytes
Variable Size            1090519040 bytes
Database Buffers         5318377472 bytes
Redo Buffers               24403968 bytes
Database mounted.
⇒ ORA-から始まるエラーメッセージが出力されないこと

SQL> exit

##  DEFAULT DEVICE TYPEやDEVICE TYPE 'SBT_TAPE'のPARAMSに、リストア元のDBと同値が設定されていることを確認する
$ rman target /
RMAN> show all;
…
CONFIGURE DEFAULT DEVICE TYPE TO 'SBT_TAPE';
…
CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' PARMS  'SBT_LIBRARY=/opt/oracle/odbcs/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/opt/oracle/odbcs/config)';
```

## データベースのリストア・リカバリ

```
RMAN> restore database;
//省略//
channel ORA_SBT_TAPE_2: restore complete, elapsed time: 00:00:51
Finished restore at 21-DEC-20
⇒ RMAN-から始まるエラーメッセージが出力されないこと

## リストアターゲットとするアーカイブREDOログのシーケンス番号を取得
## 最新の制御ファイルがリストアされていることが前提。v$archived_logから、最新のアーカイブREDOログのシーケンス番号+1の数字を取得する
RMAN> select max(sequence#)+1 from v$archived_log
where RESETLOGS_TIME = (select max (RESETLOGS_TIME) from v$archived_log);

MAX(SEQUENCE#)+1
----------------
              24
⇒ 出力された番号を確認

## リストアターゲットまでリカバリ
RMAN> recover database until sequence <上記の例の場合は、24と入力>;
//省略//
media recovery complete, elapsed time: 00:00:09
Finished recover at 21-DEC-20

## チェンジ・トラッキングの有効化有無確認
##⇒ ENABLEDになっている場合は、DISABLEDにする (理由はDoc ID 832496.1参照)

RMAN> select status from v$BLOCK_CHANGE_TRACKING;
STATUS    
----------
DISABLED  

## リカバリ後のDatafileの整合性確認
RMAN> select distinct con_id,status,recover,fuzzy,checkpoint_change#
from v$datafile_header;

    CON_ID STATUS  REC FUZ CHECKPOINT_CHANGE#
---------- ------- --- --- ------------------
         1 ONLINE      NO             2972083
         2 ONLINE      NO             2373417
         3 ONLINE      NO             2972083
⇒ RECOVER列がすべてNULL、FUZZY列がすべてNO、CHECKPOINT_CHANGE#がPDB$SEED以外一致している
```

## RESETLOGSオプションつきでOPEN
不完全リカバリによる復旧となるため、RESETLOGSオプションを使用して、起動する

```
## resetlogsでOPEN
RMAN> alter database open resetlogs;

Statement processed

RMAN> exit

## PDBのOPEN確認
$ sqlplus / as sysdba
SQL> show pdbs;

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO        
         3 <リストアしたPDB名>            READ WRITE NO   

⇒ PDBがREAD WRITEモードで起動していること
```

## PDBをアンプラグする
リストア後に、OCIのWEBコンソールからDB関連の操作ができるように、Unplug / Plugを行います。TDE暗号化を行っている場合、暗号化鍵のexport / importをする必要があります

```
## 暗号鍵をexport
SQL> alter session set container=<リストアしたPDB名>;
SQL> administer key management export encryption keys with secret "exportパスワード(任意)" TO '<ファイル出力先のパス>' force keystore identified by <ウォレット・パスワード>;

Key succeeded.

## PDBをクローズし、Unplugする
SQL> conn / as sysdba
SQL> alter pluggable database <リストアしたPDB名> close immediate;

Pluggable database altered.

SQL> alter pluggable database <リストアしたPDB名> unplug into '<xmlファイルへのパス>.xml';

Pluggable database altered.

## Pluggable Databaseの状態がMOUNTEDであることを確認
SQL> show pdbs;
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO        
         3 <リストアしたPDB名>            MOUNTED  

## keep datafilesオプションをつけてPDBをdropする
SQL> drop pluggable database <リストアしたPDB名> keep datafiles;

Pluggable database dropped.

## PDBの一覧に、<リストアしたPDB名>が表示されないこと
SQL> show pdbs;
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO       

## インスタンスを停止する
SQL> shu immediate;
SQL> exit
```

## PDBをPlugする
UnplugしたPDBを、DBCS作成と同時に作成したDBにPlugします

```
## ORACLE_SIDとORACLE_UNQNAME環境変数をで既定値に戻すため、いったんログアウトして再ログイン
$ exit
# su - oracle

## インスタンスを起動する
$ srvctl start database -db $(srvctl config database)

## 初期作成された空のPDBを削除する
$ sqlplus / as sysdba

SQL> show pdbs;
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO        
         3 <初期作成されたPDB名>          READ WRITE NO   

SQL> alter pluggable database <初期作成されたPDB名> close immediate;

SQL> drop pluggable database <初期作成されたPDB名> including datafiles;

## PDBの一覧に、<初期作成されたPDB名>が表示されないこと
SQL> show pdbs;

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO     

## 鍵をimportする
SQL> administer key management import encryption keys with secret "exportパスワード" from '<ファイル出力先のパス>' force keystore identified by <ウォレット・パスワード> with backup;

Key succeeded.

## PDBをプラグする
SQL> create pluggable database <リストア元のPDB名> using '<xmlファイルへのパス>.xml' nocopy tempfile reuse keystore identified by <ウォレット・パスワード>;

## PDB一覧に、<リストアしたPDB名>が表示されること
SQL> show pdbs;
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO        
         4 <リストアしたPDB名>　　　　　　　MOUNTED  

## Plug直後はMount状態のため、Openする。
## 鍵をimportしていないため、警告が出力されますが、いったん無視します。
SQL> alter pluggable database <リストアしたPDB名> open;

Warning: PDB altered with errors.
⇒ WARNINGが出力される

## pdb_plug_in_violationsテーブルから、エラー理由を確認します
SQL> set markup csv on;
SQL> select * from pdb_plug_in_violations order by time;

"TIME","NAME","CAUSE","TYPE","ERROR_NUMBER","LINE","MESSAGE","STATUS","ACTION","CON_ID"
//省略//
"22-DEC-20 01.23.30.549863 PM","xxxxx","Wallet Key Needed","ERROR",0,1,"PDB needs to import keys from source.","PENDING","Import keys from source.",3
⇒ 鍵をimportする必要がある、というメッセージが出力されていること

SQL> set markup csv off;

##鍵をimportする
SQL> alter session set container=<リストアしたPDB名>;
SQL> administer key management import encryption keys with secret "exportパスワード" from '<ファイル出力先のパス>' force keystore identified by <ウォレット・パスワード> with backup;

Key succeeded.

## PDBを再起動する
SQL> conn / as sysdba
SQL> alter pluggable database <リストアしたPDB名> close;
SQL> alter pluggable database <リストアしたPDB名> open;
⇒ 今度は警告メッセージが表示されないこと

SQL> show pdbs;

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 <リストアしたPDB名>            READ WRITE NO
   
⇒ READ WRITEモードで起動していること

SQL> exit
```

⇒ この方法でUnplug / Plugした場合、リストアしたPDBは、リストア元のDBユニーク名が含まれるディレクトリにデータファイルが配置されることになるので注意ください

```
SQL> select name from v$datafile order by 1;
+DATA/<大阪のDBユニーク名>/B21618EDB6AE53CFE053C103F40A750E/DATAFILE/sysaux.266.1059820959
+DATA/<大阪のDBユニーク名>/B21618EDB6AE53CFE053C103F40A750E/DATAFILE/system.265.1059820959
+DATA/<大阪のDBユニーク名>/B21618EDB6AE53CFE053C103F40A750E/DATAFILE/undotbs1.267.1059820959
+DATA/<大阪のDBユニーク名>/DATAFILE/sysaux.262.1059820797
+DATA/<大阪のDBユニーク名>/DATAFILE/system.261.1059820741
+DATA/<大阪のDBユニーク名>/DATAFILE/undotbs1.263.1059820823
+DATA/<大阪のDBユニーク名>/DATAFILE/users.274.1059822177
+DATA/<東京のDBユニーク名>/B6A52A6038203754E053240A000A4465/DATAFILE/swingbench.283.1059829287
+DATA/<東京のDBユニーク名>/B6A52A6038203754E053240A000A4465/DATAFILE/sysaux.282.1059829287
+DATA/<東京のDBユニーク名>/B6A52A6038203754E053240A000A4465/DATAFILE/system.284.1059829287
+DATA/<東京のDBユニーク名>/B6A52A6038203754E053240A000A4465/DATAFILE/undotbs1.286.1059829287
+DATA/<東京のDBユニーク名>/B6A52A6038203754E053240A000A4465/DATAFILE/users.285.1059829287
```


## 事後作業
この後は、バックアップからパスワードファイルをリストアしたり、アプリ接続用にサービスを作成したり、ごみを削除したりします