RMANを使用したバックアップ/リストア

最近、Oracle Cloudの学習を始めたり、以前から続けているOracle Masterの学習をしたりと、Oracleに対する熱が高まっております。
Oracle Masterの勉強では、練習問題を解いたり参考書を読んだりといった座学も多いのですが、実機での学習も楽しいので、学習履歴の意味で本記事を記載しました。

内容としては、環境セットアップからRMANを使用したバックアップおよびリストア(Database丸ごと)までです。

## 環境のセットアップ
Oracle Cloudを勉強していますが、キャリアとしてはAWSの経験が多いため、AWS環境で以下のAMIを使用してOracleの環境を作成しました。

![スクリーンショット 2024-07-07 101155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/dc51aa28-8945-bf36-279c-db5ecd3ef856.png)

こちらのAMIであれば、sql plusインストールしたりなどなく、構築時点でローカルから以下のようにOracleに接続できます。</br>

・```sqlplus / as sysdba``` でOracleに接続できる。


```
[root@ip-10-1-10-221 ~]# su - oracle
Last login: Sun Jul  7 00:48:35 GMT 2024 on pts/0
[oracle@ip-10-1-10-221 ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Sun Jul 7 01:33:45 2024
Version 19.10.0.0.0

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


Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.10.0.0.0

SQL>
```

・```rman target /``` でRMANに接続できる。
```
[oracle@ip-10-1-10-221 ~]$ rman target/

Recovery Manager: Release 19.0.0.0.0 - Production on Sun Jul 7 01:35:05 2024
Version 19.10.0.0.0

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

connected to target database: CDB1 (DBID=1037997274)

RMAN>
```

また、Enterprise Manager に接続することもできます。以下のURLの手順が非常に参考になります。</br>
OCIとAWSの違いで、例えばセキュリティグループの画面の差異などはありますが、設定内容はほぼ同じです。
https://qiita.com/sugimount/items/94347b189c1c7f247480

## RMANを使用したバックアップ/リストア
テストは以下の手順で行いました。
1. テスト用のテーブルとデータの作成
2. RMANバックアップの実行
3. データの更新
4. RMANリストアの実行
5. 1の状態に戻ったことを確認

#### 1.テスト用のテーブルとデータの作成

まず、以下のSQL文を実行して、テスト用のテーブルを作成しデータを挿入します。
```sql
CREATE TABLE test_table (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(50)
);

INSERT INTO test_table (id, name) VALUES (1, 'Original Data');
COMMIT;
```
次に、テーブルの内容を確認するために以下のクエリを実行します。
結果はSQL Developerのキャプチャを貼っています。
クエリの問い合わせ結果として「Original Data」ができていることが確認できます。

```sql
SELECT * FROM test_table;
```

![sql001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/d35956c6-1477-90d1-7c60-8d949790673d.png)

### 2. RMANバックアップの実行
次に、RMANを実行するための準備として、データベースのシャットダウンとリスタート、およびアーカイブモードの有効化を行います。アーカイブモードにしないと、以下のエラーが発生します。

```shell:errorログ
RMAN-06149: cannot BACKUP DATABASE in NOARCHIVELOG mode
```
以下のSQLコマンドを実行して、アーカイブモードを有効にします。
```sql
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

Total System Global Area 1577055352 bytes
Fixed Size                  9135224 bytes
Variable Size             385875968 bytes
Database Buffers         1174405120 bytes
Redo Buffers                7639040 bytes
Database mounted.
SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.

SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch
Oldest online log sequence     48
Next log sequence to archive   50
Current log sequence           50
SQL> exit
```

続いて、RMANを使用してデータベースのバックアップを実行します。
「backup database;」を実行するのみですが、一連の出力ログも載せています。
このログでは、各データファイルのバックアップが開始され、完了するまでのプロセスが詳細に示されています。

```sql
[oracle@ip-10-1-10-221 ~]$ rman target /

Recovery Manager: Release 19.0.0.0.0 - Production on Sun Jul 7 00:51:28 2024
Version 19.10.0.0.0

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

connected to target database: CDB1 (DBID=1037997274)

RMAN> backup database;

Starting backup at 07-JUL-24
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=37 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=/u02/oradata/CDB1/system01.dbf
input datafile file number=00003 name=/u02/oradata/CDB1/sysaux01.dbf
input datafile file number=00004 name=/u02/oradata/CDB1/undotbs01.dbf
input datafile file number=00007 name=/u02/oradata/CDB1/users01.dbf
channel ORA_DISK_1: starting piece 1 at 07-JUL-24

channel ORA_DISK_1: finished piece 1 at 07-JUL-24
piece handle=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/012v9913_1_1_1 tag=TAG20240707T005147 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:01:45
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00010 name=/u02/oradata/CDB1/pdb1/sysaux01.dbf
input datafile file number=00009 name=/u02/oradata/CDB1/pdb1/system01.dbf
input datafile file number=00011 name=/u02/oradata/CDB1/pdb1/undotbs01.dbf
input datafile file number=00012 name=/u02/oradata/CDB1/pdb1/users01.dbf
channel ORA_DISK_1: starting piece 1 at 07-JUL-24
channel ORA_DISK_1: finished piece 1 at 07-JUL-24
piece handle=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/022v994c_2_1_1 tag=TAG20240707T005147 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:55
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00006 name=/u02/oradata/CDB1/pdbseed/sysaux01.dbf
input datafile file number=00005 name=/u02/oradata/CDB1/pdbseed/system01.dbf
input datafile file number=00008 name=/u02/oradata/CDB1/pdbseed/undotbs01.dbf
channel ORA_DISK_1: starting piece 1 at 07-JUL-24
channel ORA_DISK_1: finished piece 1 at 07-JUL-24
piece handle=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/032v9963_3_1_1 tag=TAG20240707T005147 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:55
Finished backup at 07-JUL-24

Starting Control File and SPFILE Autobackup at 07-JUL-24
piece handle=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/c-1037997274-20240707-00 comment=NONE
Finished Control File and SPFILE Autobackup at 07-JUL-24

RMAN>
```


### 3. データの更新
次に、テスト用のデータを更新します。以下のSQLコマンドを実行して、test_tableのnameカラムを「Updated Data」に更新しています。
```sql
UPDATE test_table SET name = 'Updated Data' WHERE id = 1;
```
更新後のテーブルの内容を確認するために、以下のselectクエリを実行します。
```sql
SELECT * FROM test_table;
```   

![sql002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/12c45912-06a6-6c7f-6d0f-85f985b70808.png)


### 4. RMANリストアの実行
データベースの更新後、RMANを使用してデータベースをリストアおよびリカバリします。</br>
まず、データベースをシャットダウンし、マウントモードで再起動します。
```sql
RMAN> shutdown immediate;

database closed
database dismounted
Oracle instance shut down

RMAN> startup mount;

connected to target database (not started)
Oracle instance started
database mounted

Total System Global Area    1577055352 bytes

Fixed Size                     9135224 bytes
Variable Size                385875968 bytes
Database Buffers            1174405120 bytes
Redo Buffers                   7639040 bytes
```

次に、データベースをリストアします。
```sql
RMAN> restore database;

Starting restore at 07-JUL-24
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=257 device type=DISK

skipping datafile 5; already restored to file /u02/oradata/CDB1/pdbseed/system01.dbf
skipping datafile 6; already restored to file /u02/oradata/CDB1/pdbseed/sysaux01.dbf
skipping datafile 8; already restored to file /u02/oradata/CDB1/pdbseed/undotbs01.dbf
skipping datafile 9; already restored to file /u02/oradata/CDB1/pdb1/system01.dbf
skipping datafile 10; already restored to file /u02/oradata/CDB1/pdb1/sysaux01.dbf
skipping datafile 11; already restored to file /u02/oradata/CDB1/pdb1/undotbs01.dbf
skipping datafile 12; already restored to file /u02/oradata/CDB1/pdb1/users01.dbf
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to /u02/oradata/CDB1/system01.dbf
channel ORA_DISK_1: restoring datafile 00003 to /u02/oradata/CDB1/sysaux01.dbf
channel ORA_DISK_1: restoring datafile 00004 to /u02/oradata/CDB1/undotbs01.dbf
channel ORA_DISK_1: restoring datafile 00007 to /u02/oradata/CDB1/users01.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/oracle/product/19.0.0/dbhome_1/dbs/012v9913_1_1_1
channel ORA_DISK_1: piece handle=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/012v9913_1_1_1 tag=TAG20240707T005147
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:45
Finished restore at 07-JUL-24
```

リストアが完了したら、リカバリを実行します。
ここでは、特定の時点（バックアップからデータの更新が行われる前の時刻）までリカバリを行います。
```sql
recover database until time "TO_DATE('BACKUPからUPDATEまでの時刻', 'YYYY-MM-DD HH24:MI:SS')";

Starting recover at 07-JUL-24
using channel ORA_DISK_1

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

Finished recover at 07-JUL-24
```
リカバリが完了したら、データベースをオープンして、通常の操作を再開します。
```sql
RMAN> alter database open;

Statement processed

RMAN>
```

### 5. データが1の状態に戻ったことを確認
バックアップ取得時の1のデータ(Original Data)に戻ったことを確認するため、以下のselectクエリを実行します。
```
SELECT * FROM test_table;
```
![sql003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/66e65fc6-9394-0ba9-de3a-acbd6733415b.png)


#### さいごに
座学の方が学習は早く進むのですが、定着率や楽しさは実機の方が良いですね。
今後も実機の記事を書いていこうと思います。あと、Oracle Cloudも。