【Oracleデータベース】入門者の孤独演習2：リカバリ

バックアップ、リストア、リカバリの流れを一通り体験する。
OracleDatabase付属のRecovery Manager(RMAN)を使用する。

# 0. 準備
リカバリを見据え、事前に各種設定を行っておく。
### ■ 高速リカバリ領域
バックアップファイルやアーカイブREDOログファイルを格納する領域として高速リカバリ領域を設定すると、いろいろ機能的に良いことがある。(古いファイルを自動的に消してくれるなど)

#### ❖ 現在の高速リカバリ領域の設定を確認する

```powershell:SQL*Plusプロンプト
SQL> show parameter db_recovery_file

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
db_recovery_file_dest                string                 C:\Oracle\fast_recovery_area
db_recovery_file_dest_size           big integer            13836M
```
#### ❖ 高速リカバリ領域を設定(変更)する
高速リカバリ領域は、実運用ではデータファイルとは別の記憶域にするのが望ましい。

- 高速リカバリ領域のパスを設定する
`alter system set db_recovery_file_dest = 'C:\Oracle\fast_recovery_area';`
- 高速リカバリ領域のサイズを設定する
`alter system set db_recovery_file_dest_size = 5G;`

### ■ アーカイブログモード
アーカイブログモードにすると、アーカイブREDOログが作成されるようになる。
リカバリで直前状態まで戻したいならアーカイブログモードをONにしておく。

#### ❖ 現在のログモードを確認する</font>

```sql:SQL*Plusプロンプト
SQL> select log_mode from v$database;

LOG_MODE
------------------------
NOARCHIVELOG
```

`NOARCHIVELOG`…アーカイブログを作成しない
`ARCHIVELOG`…アーカイブログを作成する
#### ❖ アーカイブログモードを変更する
##### ① データベースをマウント状態にする。(いちどシャットダウンしてからマウント)

```powershell:SQL*Plusプロンプト
SQL> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> startup mount
ORACLEインスタンスが起動しました。

Total System Global Area 4479514688 bytes
Fixed Size                  9865280 bytes
Variable Size             922746880 bytes
Database Buffers         3539992576 bytes
Redo Buffers                6909952 bytes
データベースがマウントされました。
```

##### ② ログモードを変更する。
- アーカイブログモードをONにする
`alter database archivelog;`
- アーカイブログモードをOFFにする
`alter database noarchivelog;`

##### ③ データベースをオープンする。
`alter database open;`


# 1. バックアップ

##### ① RMAN起動
OSプロンプトからRMANを起動する。
起動時はターゲットデータベースに接続する。

`rman target/`

##### ② RMANの設定
高速リカバリ領域に1階層掘った。

- バックアップファイルの出力先を指定する
`CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT 'C:\Oracle\fast_recovery_area\ORCL\backup\%U';`
※パスの末尾に`\%U`を付けないと、パスがバッティングしエラーで落ちる。

- 現在のRMANの設定を確認する
`show all;` して上と同じ文(CONFIGURE CHANNEL~)が見当たれば設定できている。

##### ③ RMANでバックアップ
`backup database plus archivelog delete all input;`
データベース(データファイル、制御ファイル、SPFILE) ＋ アーカイブREDOログファイル
(実運用ではアーカイブREDOログファイルもバックアップを取ったほうがよいとのこと。)

##### ④ バックアップを確認する
`list backup;` または `list backup summary;`
```powershell
RMAN> list backup summary;


バックアップのリスト
===============
Key     TY LV S Device Type 終了時間 #Pieces #Copies Compressed Tag
------- -- -- - ----------- -------- ------- ------- ---------- ---
33      B  A  A DISK        24-05-02 1       1       NO         TAG20240502T010501
34      B  F  A DISK        24-05-02 1       1       NO         TAG20240502T010503
35      B  F  A DISK        24-05-02 1       1       NO         TAG20240502T010503
36      B  F  A DISK        24-05-02 1       1       NO         TAG20240502T010503
37      B  A  A DISK        24-05-02 1       1       NO         TAG20240502T010508
38      B  F  A DISK        24-05-02 1       1       NO         TAG20240502T010510
```
6つのバックアップファイルが作られた。

# 2. リストア
RMANを使ってリストアする。
RMANを使うとバックアップファイルの指定が不要。

データベースをマウント状態にしてからリストアする。
` startup mount`
`restore database;`

この時点でデータベースをオープンしようとするとエラーになった。
```powershell:RMANプロンプト
RMAN> alter database open;

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: sql statementコマンドが05/02/2024 01:28:22で失敗しました
ORA-01113: ファイル1はメディア・リカバリが必要です
ORA-01110: データファイル1: 'C:\ORACLE\ORADATA\ORCL\DATAFILE\O1_MF_SYSTEM_M2SMYW7S_.DBF'
```

# 3. リカバリ
リストアのみを行った状態は、バックアップ時点の状態であり、まだ最新の状態ではない。
そこで、現存のREDOログを適用して最新の状態にするのがリカバリという作業。

`recover database`

# 4. バックアップファイル削除

#### ❖ RMAN上の管理情報と物理状況を同期
```powershell
RMAN> crosscheck backup;

チャネルORA_DISK_1の使用
バックアップ・ピースがクロスチェックされました: 'AVAILABLE'が検出されました
バックアップ・ピース・ハンドル=C:\ORACLE\FAST_RECOVERY_AREA\ORCL\BACKUP\152POKLT_37_1_1 レコードID=33 スタンプ=1167872702
バックアップ・ピースがクロスチェックされました: 'AVAILABLE'が検出されました
バックアップ・ピース・ハンドル=C:\ORACLE\FAST_RECOVERY_AREA\ORCL\BACKUP\162POKLV_38_1_1 レコードID=34 スタンプ=1167872703
バックアップ・ピースがクロスチェックされました: 'AVAILABLE'が検出されました
バックアップ・ピース・ハンドル=C:\ORACLE\FAST_RECOVERY_AREA\ORCL\BACKUP\172POKM2_39_1_1 レコードID=35 スタンプ=1167872706
バックアップ・ピースがクロスチェックされました: 'AVAILABLE'が検出されました
バックアップ・ピース・ハンドル=C:\ORACLE\FAST_RECOVERY_AREA\ORCL\BACKUP\182POKM3_40_1_1 レコードID=36 スタンプ=1167872707
バックアップ・ピースがクロスチェックされました: 'AVAILABLE'が検出されました
バックアップ・ピース・ハンドル=C:\ORACLE\FAST_RECOVERY_AREA\ORCL\BACKUP\192POKM5_41_1_1 レコードID=37 スタンプ=1167872709
バックアップ・ピースがクロスチェックされました: 'AVAILABLE'が検出されました
バックアップ・ピース・ハンドル=C:\ORACLE\FAST_RECOVERY_AREA\ORCL\AUTOBACKUP\2024_05_02\O1_MF_S_1167872710_M34T1PBH_.BKP レコードID=38 スタンプ=1167872710
6オブジェクトをクロスチェックしました
```
`AVAILABLE`…RMAN上も存在していて、物理ファイルも存在しているよ→RMANで扱えるよ
`EXPIRED`…RMAN上は存在することになっているけど、物理ファイルは存在しなかったよ→RMANで扱えないよ

OSから直接削除してしまうと、RMAN上の管理情報との間に不整合が発生するのでRMAN上の管理情報から削除する必要がある。

https://qiita.com/tomo_aw/items/2343c483001ee8dc2057

#### ❖ バックアップファイル削除
シンプルに全削除をしてみた。
(実運用ではポリシーを設定したりしてしかるべきものだけを削除するのがよい)

```powershell
RMAN> delete backup;

チャネルORA_DISK_1の使用

バックアップ・ピースのリスト
BP Key  BS Key  Pc# Cp# Status      Device Type Piece Name
------- ------- --- --- ----------- ----------- ----------
33      33      1   1   AVAILABLE   DISK        C:\ORACLE\FAST_RECOVERY_AREA\ORCL\BACKUP\152POKLT_37_1_1
34      34      1   1   AVAILABLE   DISK        C:\ORACLE\FAST_RECOVERY_AREA\ORCL\BACKUP\162POKLV_38_1_1
35      35      1   1   AVAILABLE   DISK        C:\ORACLE\FAST_RECOVERY_AREA\ORCL\BACKUP\172POKM2_39_1_1
36      36      1   1   AVAILABLE   DISK        C:\ORACLE\FAST_RECOVERY_AREA\ORCL\BACKUP\182POKM3_40_1_1
37      37      1   1   AVAILABLE   DISK        C:\ORACLE\FAST_RECOVERY_AREA\ORCL\BACKUP\192POKM5_41_1_1
38      38      1   1   AVAILABLE   DISK        C:\ORACLE\FAST_RECOVERY_AREA\ORCL\AUTOBACKUP\2024_05_02\O1_MF_S_1167872710_M34T1PBH_.BKP

このオブジェクトを削除しますか(YESまたはNOを入力してください)。 y
バックアップ・ピースが削除されました
バックアップ・ピース・ハンドル=C:\ORACLE\FAST_RECOVERY_AREA\ORCL\BACKUP\152POKLT_37_1_1 レコードID=33 スタンプ=1167872702
バックアップ・ピースが削除されました
バックアップ・ピース・ハンドル=C:\ORACLE\FAST_RECOVERY_AREA\ORCL\BACKUP\162POKLV_38_1_1 レコードID=34 スタンプ=1167872703
バックアップ・ピースが削除されました
バックアップ・ピース・ハンドル=C:\ORACLE\FAST_RECOVERY_AREA\ORCL\BACKUP\172POKM2_39_1_1 レコードID=35 スタンプ=1167872706
バックアップ・ピースが削除されました
バックアップ・ピース・ハンドル=C:\ORACLE\FAST_RECOVERY_AREA\ORCL\BACKUP\182POKM3_40_1_1 レコードID=36 スタンプ=1167872707
バックアップ・ピースが削除されました
バックアップ・ピース・ハンドル=C:\ORACLE\FAST_RECOVERY_AREA\ORCL\BACKUP\192POKM5_41_1_1 レコードID=37 スタンプ=1167872709
バックアップ・ピースが削除されました
バックアップ・ピース・ハンドル=C:\ORACLE\FAST_RECOVERY_AREA\ORCL\AUTOBACKUP\2024_05_02\O1_MF_S_1167872710_M34T1PBH_.BKP レコードID=38 スタンプ=1167872710
6オブジェクトを削除しました
```
# 参考
https://www.cloverfield.co.jp/2020/12/25/oraclemaster%E3%80%80%E5%82%99%E5%BF%98%E9%8C%B297-10/?doing_wp_cron=1714575277.6334490776062011718750

https://cosol.jp/knowledge/knowledge_post/d3_highly_recommended_rman_configurations/



https://www.undercoverlog.com/entry/2020/06/22/RMAN%28%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%26%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96%E3%83%AD%E3%82%B0%E5%89%8A%E9%99%A4%29