OCI Object Storageに保存されたバックアップから新しいデータベース・サーバを作成してみよう

# 初めに

[前回](https://qiita.com/RexZheng/items/b64b5494899da0980970)はOracle Database Cloud Backup Moduleを用いてデータベースをOCI Object Storageにバックアップする方法を紹介しました。普通の場合、オンプレミス・データベースが障害ある時にこのバックアップからリストアやリカバリして、データベースを回復します。ただ、オンプレミス・データベース・サーバがハードウェア障害などがあったら、短時間に回復できない場合どうしますか？

OCI Computeサービスを使って、OCI Object Storageに保存されたバックアップの状態のデータベース・インスタンスを迅速に作成するのは可能です。バックアップ頻度によって、新規作成できるインスタンスはオンプレミス・データベースが障害あった直前の状態ではないですが、基本的なサビースを提供できると思います。

今回はOCI Object Storageに保存されたフルバックアップから新しいデータベース・サーバを作成する方法を紹介します。

# バックアップからデータベース・サーバを新規作成

今回紹介する内容は一時データベースサーバとしてのOCI Compute Instanceで新しいデータベース・サーバを作成する時に適用だけではありません。オンプレミス環境の障害がリペアされた後に、一時データベースサーバにおける変更されたデータのバックアップからオンプレミス環境に新しいデータベース・インスタンスを構築（Object Storageのバックアップからリストア）する時も適用します。

基本的に、一時データベースサーバとしてのOCI Compute Instanceも、オンプレミス環境に新規構築するデータベース・サーバも最初（障害があった前に）の環境と同じようなソフトウェアを設定する必要があります。OCI Compute Instanceの場合、カスタム・イメージを使えますが、オンプレミスの場合、手動でインストールや設定などが必要になります。

下記の流れはデータベース、OCI-CLI、Backup Moduleなど必要なソフトウェアを全部正しく設定できた前提とします。

- 早くデータベース・インスタンスを作成するため、事前に既存環境と同じバージョンのソフトウェアをインストールしたカスタム・イメージを作成するのをお勧めます。通常の場合、カスタム・イメージからインスタンスを作成するのはただ３０秒ぐらいかかります。

- `OCI-CLI`と`Backup Module`のインストールについては前回の記事「Oracle Database Cloud Backup ModuleでデータベースをOCI Object Storageにバックアップする方法」の[OCI-CLIの設定](https://qiita.com/RexZheng/items/b64b5494899da0980970#oci-cli%E3%81%AE%E8%A8%AD%E5%AE%9A)と[Backup Moduleの設定](https://qiita.com/RexZheng/items/b64b5494899da0980970#backup-module%E3%81%AE%E8%A8%AD%E5%AE%9A)のセクションを参照してください。

## データベース・インスタンスを起動

ます、サーバにログインしてRMANでロカール・データベースと接続します。コマンド`STARTUP NOMOUNT`でデータベース・インスタンスを起動します。

`SPFILE`と`PFILE`がまだないから、下記のエラーが出て来ますが、問題がありません。

> startup failed: ORA-01078: failure in processing system parameters
> LRM-00109: could not open parameter file '/u01/app/oracle/product/19.0.0/dbhome_1/dbs/initORCL.ora'

```py
[oracle@oda11 ~]$ rman target /

Recovery Manager: Release 19.0.0.0.0 - Production on Sun Sep 5 09:06:39 2021
Version 19.3.0.0.0

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


connected to target database (not started)

RMAN>
RMAN> STARTUP NOMOUNT;

startup failed: ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/u01/app/oracle/product/19.0.0/dbhome_1/dbs/initORCL.ora'

starting Oracle instance without parameter file for retrieval of spfile
Oracle instance started

Total System Global Area    1073737800 bytes

Fixed Size                     8904776 bytes
Variable Size                276824064 bytes
Database Buffers             780140544 bytes
Redo Buffers                   7868416 bytes

RMAN>
```

## SPFILEのリストア

OCI Object Storageにバックアップをした時に暗号化が必要でした。バックアップからファイルをリストアする時にも復号化が必要です。このため、リストアする前にまず復号化の設定をしておきます。

```py
# 復号化のパスワードを設定
RMAN> SET DECRYPTION IDENTIFIED BY <PASSWORD>;
```

そして、バックアップされたデータベースのDBIDを設定します。

```py
RMAN> SET DBID=1610037248;
```

下記のコマンドでSBTタイプのチャネルを割り合って、`SPFILE`をリストアします。

```py
RMAN> RUN {
ALLOCATE CHANNEL t1 DEVICE TYPE SBT_TAPE PARMS='SBT_LIBRARY=/home/oracle/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/opcORCL.ora)';
RESTORE SPFILE TO PFILE '/u01/app/oracle/product/19.0.0/dbhome_1/dbs/initORCL.ora' FROM AUTOBACKUP;
}

# log
allocated channel: t1
channel t1: SID=181 device type=SBT_TAPE
channel t1: Oracle Database Backup Service Library VER=19.0.0.1

Starting restore at 2021/09/05 09:42:34

channel t1: looking for AUTOBACKUP on day: 20210905
channel t1: looking for AUTOBACKUP on day: 20210904
channel t1: looking for AUTOBACKUP on day: 20210903
channel t1: AUTOBACKUP found: c-1610037248-20210903-00
channel t1: restoring spfile from AUTOBACKUP c-1610037248-20210903-00
channel t1: SPFILE restore from AUTOBACKUP complete
Finished restore at 2021/09/05 09:43:08
released channel: t1

RMAN>
```

上記のログによって`SPFILE`が前回の自動バックアップ`c-1610037248-20210903-00`からリストアされたことを見られます。  
リストアされたSPFILEはPFILE`initORCL.ora`として`$ORACLE_HOME/dbs/`に格納しています。

```py
[oracle@oda11 ~]$ ll $ORACLE_HOME/dbs/init*
-rw-r--r--. 1 oracle oinstall 3079 May 14  2015 /u01/app/oracle/product/19.0.0/dbhome_1/dbs/init.ora
-rw-r--r--. 1 oracle oinstall  975 Sep  5 09:43 /u01/app/oracle/product/19.0.0/dbhome_1/dbs/initORCL.ora
[oracle@oda11 ~]$
```

## SPFILEの作成

元データベースのフルバックアップから新しいデータベースサーバを作成できたのはいいですが、一点注意しなければならないところがあります。それはSPFILEの作成です。新しく作成したデータベースはまだPFILEより起動しているのは覚えていますか？RMANで自動バックアップする対象としてはCONTROLFILEとSPFILEですから、PFILEからSPFILEを生成するのは必要となります。

上記のステップ「SPFILEのリストア」を実施して、バックアップから元データベースのSPFILEをPFILEとしてリストアされました。データベース・インスタンスはこのPFILEから正常に起動できるになります。ただ、データベース管理やRMANの自動バックアップ対象（CONTROLFILEとSPFILE）の観点から、PFILEからSPFILEを生成するのは必要となります。

SQLコマンド`create spfile from pfile;`でSPFILEを作成して、データベースを再起動します。作成したSPFILEを確認できます。

```sql
SQL> create spfile from pfile;

File created.

SQL> show parameter spfile ;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 6291453600 bytes
Fixed Size                  8910496 bytes
Variable Size            1073741824 bytes
Database Buffers         5200936960 bytes
Redo Buffers                7864320 bytes
Database mounted.
Database opened.
SQL> show parameter spfile ;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /u01/app/oracle/product/19.0.0
                                                 /dbhome_1/dbs/spfileORCL.ora
SQL>
```

## 必要なディレクトリを確保

次のステップ`CONTROLFILE`をリストアする時に、PFILEにおける記載されているディレクトリが存在しないとエラーになりますので、それらのディレクトリを確認して作成する必要があります。

```py
# PFILEの内容を確認
[oracle@oda11 ~]$ cat /u01/app/oracle/product/19.0.0/dbhome_1/dbs/initORCL.ora
ORCL.__data_transfer_cache_size=0
ORCL.__db_cache_size=5066719232
ORCL.__inmemory_ext_roarea=0
ORCL.__inmemory_ext_rwarea=0
ORCL.__java_pool_size=0
ORCL.__large_pool_size=16777216
ORCL.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
ORCL.__pga_aggregate_target=2097152000
ORCL.__sga_target=6291456000
ORCL.__shared_io_pool_size=134217728
ORCL.__shared_pool_size=1056964608
ORCL.__streams_pool_size=0
ORCL.__unified_pga_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/ORCL/adump'
*.audit_trail='db'
*.compatible='19.0.0'
*.control_files='/u01/app/oracle/oradata/ORCL/control01.ctl','/u01/app/oracle/oradata/ORCL/control02.ctl'
*.db_block_size=8192
*.db_name='ORCL'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)'
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.pga_aggregate_target=2000m
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=6000m
*.undo_tablespace='UNDOTBS1'
[oracle@oda11 ~]$

# 必要なディレクトリを作成
[oracle@oda11 ~]$ mkdir -p /u01/app/oracle/fast_recovery_area/
[oracle@oda11 ~]$ mkdir -p /u01/app/oracle/admin/ORCL/adump
[oracle@oda11 ~]$ mkdir -p /u01/app/oracle/oradata/ORCL/
```

## CONTROLFILEのリストア

CONTROLFILEをリストアする前に、データベース・インスタンスを`NOMOUNT`の状態で再起動します。今回は`PFILE`がありますから、正常で起動できます。

```py
RMAN> SHUTDOWN IMMEDIATE;

Oracle instance shut down

RMAN> STARTUP NOMOUNT;

connected to target database (not started)
Oracle instance started

Total System Global Area    6291453600 bytes

Fixed Size                     8910496 bytes
Variable Size               1073741824 bytes
Database Buffers            5200936960 bytes
Redo Buffers                   7864320 bytes

RMAN>
```

改めてSBTタイプのチャネルを割り合って、`CONTROLFILE`をリストアします。

```py
RMAN> RUN {
ALLOCATE CHANNEL t1 DEVICE TYPE SBT_TAPE PARMS='SBT_LIBRARY=/home/oracle/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/opcORCL.ora)';
RESTORE CONTROLFILE FROM AUTOBACKUP;
}

# log
allocated channel: t1
channel t1: SID=21 device type=SBT_TAPE
channel t1: Oracle Database Backup Service Library VER=19.0.0.1

Starting restore at 2021/09/05 10:02:08

channel t1: looking for AUTOBACKUP on day: 20210905
channel t1: looking for AUTOBACKUP on day: 20210904
channel t1: looking for AUTOBACKUP on day: 20210903
channel t1: AUTOBACKUP found: c-1610037248-20210903-00
channel t1: restoring control file from AUTOBACKUP c-1610037248-20210903-00
channel t1: control file restore from AUTOBACKUP complete
output file name=/u01/app/oracle/oradata/ORCL/control01.ctl
output file name=/u01/app/oracle/oradata/ORCL/control02.ctl
Finished restore at 2021/09/05 10:02:43
released channel: t1

RMAN>
```

上記のように`CONTROLFILE`が正常でリストアされたら、データベースを`MOUNT`に変更できます。

```py
RMAN> ALTER DATABASE MOUNT;

Statement processed

RMAN>
```

元データベースのRMANの設定はCONTROLFILEに保存されたので、今のRMAN設定を確認すると全部反映されたはずです。

```py
RMAN> show all;

RMAN configuration parameters for database with db_unique_name ORCL are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO 'SBT_TAPE';
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE SBT_TAPE TO '%F'; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE 'SBT_TAPE' PARALLELISM 2 BACKUP TYPE TO COMPRESSED BACKUPSET;
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE SBT_TAPE TO 1; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE SBT_TAPE TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE CHANNEL DEVICE TYPE 'SBT_TAPE' PARMS  'SBT_LIBRARY=/home/oracle/lib/libopc.so, SBT_PARMS=(OPC_PFILE=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/opcORCL.ora)';
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
CONFIGURE COMPRESSION ALGORITHM 'MEDIUM' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE;
CONFIGURE RMAN OUTPUT TO KEEP FOR 7 DAYS; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/product/19.0.0/dbhome_1/dbs/snapcf_ORCL.f'; # default

RMAN>
```

## データファイルをリストアする前のプレビュー

データファイルをリストアする前に、リストアの詳しい動作をプレビューしたほうがいいです。データベースを一致させるためのSCNを特定できるし、リストアする時に使用されるバックアップ・ピースやロケーションも確認できます。

```py
RMAN> RESTORE DATABASE PREVIEW;

Starting restore at 2021/09/05 10:18:27
allocated channel: ORA_SBT_TAPE_1
channel ORA_SBT_TAPE_1: SID=258 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=24 device type=SBT_TAPE
channel ORA_SBT_TAPE_2: Oracle Database Backup Service Library VER=19.0.0.1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=259 device type=DISK


List of Backup Sets
===================


BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ -------------------
3       Full    198.00M    SBT_TAPE    00:00:06     2021/09/03 06:54:27
        BP Key: 3   Status: AVAILABLE  Compressed: YES  Tag: TAG20210903T065421
        Handle: 040849gt_1_1   Media: objectstorage.us-phoenix..oud.com/n/sehubjapacprod/rex-db-backup
  List of Datafiles in backup set 3
  File LV Type Ckp SCN    Ckp Time            Abs Fuz SCN Sparse Name
  ---- -- ---- ---------- ------------------- ----------- ------ ----
  1       Full 2053030    2021/09/03 06:54:21              NO    /u01/app/oracle/oradata/ORCL/system01.dbf
  7       Full 2053030    2021/09/03 06:54:21              NO    /u01/app/oracle/oradata/ORCL/users01.dbf

BS Key  Type LV Size       Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ -------------------
2       Full    56.00M     SBT_TAPE    00:00:03     2021/09/03 06:54:24
        BP Key: 2   Status: AVAILABLE  Compressed: YES  Tag: TAG20210903T065421
        Handle: 050849gt_1_1   Media: objectstorage.us-phoenix..oud.com/n/sehubjapacprod/rex-db-backup
  List of Datafiles in backup set 2
  File LV Type Ckp SCN    Ckp Time            Abs Fuz SCN Sparse Name
  ---- -- ---- ---------- ------------------- ----------- ------ ----
  3       Full 2053031    2021/09/03 06:54:21              NO    /u01/app/oracle/oradata/ORCL/sysaux01.dbf
  4       Full 2053031    2021/09/03 06:54:21              NO    /u01/app/oracle/oradata/ORCL/undotbs01.dbf
using channel ORA_SBT_TAPE_1
using channel ORA_SBT_TAPE_2
using channel ORA_DISK_1


List of Backup Sets
===================


BS Key  Size       Device Type Elapsed Time Completion Time
------- ---------- ----------- ------------ -------------------
4       256.00K    SBT_TAPE    00:00:01     2021/09/03 06:54:37
        BP Key: 4   Status: AVAILABLE  Compressed: YES  Tag: TAG20210903T065436
        Handle: 060849hc_1_1   Media: objectstorage.us-phoenix..oud.com/n/sehubjapacprod/rex-db-backup

  List of Archived Logs in backup set 4
  Thrd Seq     Low SCN    Low Time            Next SCN   Next Time
  ---- ------- ---------- ------------------- ---------- ---------
  1    6       2053017    2021/09/03 06:54:16 2053042    2021/09/03 06:54:36
validation succeeded for backup piece
recovery will be done up to SCN 2053030
Media recovery start SCN is 2053030
Recovery must be done beyond SCN 2053031 to clear datafile fuzziness
validation succeeded for backup piece
Finished restore at 2021/09/05 10:18:29

RMAN>
```

## データファイルのリストア

上記のプレビューで問題がなければ、`RESTORE DATABASE`でデータファイルをリストアします。

```py
RMAN> RESTORE DATABASE;

Starting restore at 2021/09/05 10:21:03
using channel ORA_SBT_TAPE_1
using channel ORA_SBT_TAPE_2
using channel ORA_DISK_1

channel ORA_SBT_TAPE_1: starting datafile backup set restore
channel ORA_SBT_TAPE_1: specifying datafile(s) to restore from backup set
channel ORA_SBT_TAPE_1: restoring datafile 00003 to /u01/app/oracle/oradata/ORCL/sysaux01.dbf
channel ORA_SBT_TAPE_1: restoring datafile 00004 to /u01/app/oracle/oradata/ORCL/undotbs01.dbf
channel ORA_SBT_TAPE_1: reading from backup piece 050849gt_1_1
channel ORA_SBT_TAPE_2: starting datafile backup set restore
channel ORA_SBT_TAPE_2: specifying datafile(s) to restore from backup set
channel ORA_SBT_TAPE_2: restoring datafile 00001 to /u01/app/oracle/oradata/ORCL/system01.dbf
channel ORA_SBT_TAPE_2: restoring datafile 00007 to /u01/app/oracle/oradata/ORCL/users01.dbf
channel ORA_SBT_TAPE_2: reading from backup piece 040849gt_1_1
channel ORA_SBT_TAPE_1: piece handle=050849gt_1_1 tag=TAG20210903T065421
channel ORA_SBT_TAPE_1: restored backup piece 1
channel ORA_SBT_TAPE_1: restore complete, elapsed time: 00:00:45
channel ORA_SBT_TAPE_2: piece handle=040849gt_1_1 tag=TAG20210903T065421
channel ORA_SBT_TAPE_2: restored backup piece 1
channel ORA_SBT_TAPE_2: restore complete, elapsed time: 00:00:45
Finished restore at 2021/09/05 10:21:48

RMAN>
```

## データベースのリカバリ

データファイルをすべて問題なくてリストアされたら、次にデータベースをリカバリします。  
データベースを一致させるSCNを指定し、リカバリのコマンドを実施します。

```py
RMAN> RECOVER DATABASE UNTIL SCN 2053042;

Starting recover at 2021/09/05 10:27:04
using channel ORA_SBT_TAPE_1
using channel ORA_SBT_TAPE_2
using channel ORA_DISK_1

starting media recovery
media recovery complete, elapsed time: 00:00:00

Finished recover at 2021/09/05 10:27:04

RMAN>
```

正常にリカバリしました。データベースをオーペンに設定します。

```py
RMAN> ALTER DATABASE OPEN RESETLOGS;

Statement processed

RMAN>
```

データベースが正しくリストアされたかを確認します。元データベースの内容を見られます。

```sql
SQL> select * from TESTER.students;

STUDENT_NO SURNAME              FORENAME
---------- -------------------- --------------------
20060101   Dickens              Charles

SQL>
```

# オンプレミス・データベース・サーバがリペアした後

オンプレミス・データベース・サーバが障害があった時に、[上記の流れ](#バックアップからデータベースサーバを新規作成)でOCI Object Storageに保存されたバックアップから一時データベース・インスタンスを作成できて、サービスを続けて提供できます。同時にオンプレミス環境のリペアを行います。リペアが完了してからサービスはオンプレミス環境へ切り替えする場合はどうしますか？

基本的に、オンプレミスデータベースのバックアップからクラウド環境に一時インスタンスを作成する流れと同じです。

![restore_to_onp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100411/e7cc1b1b-ca3c-0e59-794a-765a73451be4.png)

- ① クラウド環境に作成した一時データベース（OCI Compute Instance）をObject Storageにバックアップします。このバックアップはオンプレミス環境をリペアするうちに発生したデータ変更を含めています。
    - バックアップを取得する方法は[Oracle Database Cloud Backup ModuleでデータベースをOCI Object Storageにバックアップする方法](https://qiita.com/RexZheng/private/b64b5494899da0980970)をご参照ください。
    - 参照記事ではオンプレミス・データベースのバックアップを取得すると想定しますが、OCI Compute上のデータベースのバックアップを取得する時にOCI Compute上で同じコマンドを実行してもいいです。
- ② オンプレミス環境で上記のバックアップから新しいデータベース・インスタンスを作成します。作成する方法は[OCI Object Storageに保存されたバックアップから新しいデータベース・サーバを作成してみよう](https://qiita.com/RexZheng/private/540366fec121e58c3c61)をご参照ください。

## 考察

上記の方法はフルバックアップから新しいデータベースを作成する方法です。OCI環境にネットワークのスループットはいいですが、バックアップのデータ量が大きであればリストアする時に長い時間をかかる可能性があると考えられます。

OCI Object Storageからオンプレミス環境にリストアする時にネットワーク帯域によってもっと時間をかかるかもしれません。