退避させてたアーカイブログを制御ファイルに認識させてからのリカバリ


# シナリオ

* 制御ファイルバックアップを用いての不完全リカバリ
* 制御ファイルバックアップ後に生成されたアーカイブログは、アーカイブログ出力先とは別の場所に退避されている（夜間にDBのバックアップする運用だが、諸般の事情でアーカイブログだけ日中もバックアップしてるイメージ）
* 障害シナリオとしては、制御ファイル、データファイル、オンラインREDOログ、退避前のアーカイブログファイルがすべてロスト

# 環境

* Oracle Database 12c 12.1.0.2
* ファイルシステム
* SingleDB


# コマンド

## 制御ファイルのリストア

データベースをNOMOUNTで起動し、制御ファイルのバックアップからのリストア後、MOUNT状態にします

```sql

$ sqlplus / as sysdba

Connected to an idle instance.

SQL> startup nomount
ORACLE instance started.

Total System Global Area 3221225472 bytes
Fixed Size     2929552 bytes
Variable Size 1744833648 bytes
Database Buffers   805306368 bytes
Redo Buffers   13844480 bytes
In-Memory Area   654311424 bytes

SQL> host
$ cp -p /u02/app/oracle/bk/controlfile.bk01  /u02/app/oracle/oradata/ORCL/control01.ctl
$ cp -p /u02/app/oracle/bk/controlfile.bk01 /u03/app/oracle/fast_recovery_area/ORCL/control02.ctl
$ exit
exit

SQL> alter database mount;

Database altered.

```


## 制御ファイルに退避していたアーカイブログを登録する

RMANでcrosscheckして、アーカイブログがなくなっていることを認識させます

```sql

SQL> host
$ rman target /
RMAN> crosscheck archivelog all;

RMAN> exit

Recovery Manager complete.

$ exit
exit

SQL>
SQL>
SQL> set lines 200
col name for a90
select name,status,thread#,sequence#,first_change#,next_change# from v$archived_log;SQL> SQL>

NAME   S THREAD#  SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
------------------------------------------------------------------------------------------ - ---------- ---------- ------------- ------------
  D       1  1 1969552      1992490
  D       1  2 1992490      2029539
  D       1  3 2029539      2030862

```

退避させたアーカイブログを登録するSQLを生成します
アーカイブログは/u02/app/oracle/arcに退避させている前提です


```
SQL> host
$ ls -l /u02/app/oracle/arc/*
-rwxr-x--- 1 oracle oinstall 99586048 Jul 30 17:23 /u02/app/oracle/arc/o1_mf_1_1_cssrmxwr_.arc
-rw-r----- 1 oracle oinstall 73051648 Jul 31 01:06 /u02/app/oracle/arc/o1_mf_1_2_cstmrx1m_.arc
-rw-r----- 1 oracle oinstall  1882112 Jul 31 01:43 /u02/app/oracle/arc/o1_mf_1_3_cstoyzbx_.arc
-rw-r----- 1 oracle oinstall    30720 Jul 31 01:45 /u02/app/oracle/arc/o1_mf_1_4_cstp1w5z_.arc
-rw-r----- 1 oracle oinstall     2560 Jul 31 01:45 /u02/app/oracle/arc/o1_mf_1_5_cstp28tm_.arc
-rw-r----- 1 oracle oinstall     3072 Jul 31 01:45 /u02/app/oracle/arc/o1_mf_1_6_cstp2gyl_.arc
$ ls /u02/app/oracle/arc/*|awk '{print "alter database register physical logfile \047" $1 "\047;"}' > register.sql
$ exit
exit

SQL> !ls register.sql
register.sql

SQL> !cat register.sql
alter database register physical logfile '/u02/app/oracle/arc/o1_mf_1_1_cssrmxwr_.arc';
alter database register physical logfile '/u02/app/oracle/arc/o1_mf_1_2_cstmrx1m_.arc';
alter database register physical logfile '/u02/app/oracle/arc/o1_mf_1_3_cstoyzbx_.arc';
alter database register physical logfile '/u02/app/oracle/arc/o1_mf_1_4_cstp1w5z_.arc';
alter database register physical logfile '/u02/app/oracle/arc/o1_mf_1_5_cstp28tm_.arc';
alter database register physical logfile '/u02/app/oracle/arc/o1_mf_1_6_cstp2gyl_.arc';

```

SQLを実行し、制御ファイルが認識していることを確認します
マニュアルには「alter database register  logfile」とあるが「alter database register physical logfile」でないとうまくいかなかった

```
SQL> set echo on
SQL> @register.sql
SQL> alter database register physical logfile '/u02/app/oracle/arc/o1_mf_1_1_cssrmxwr_.arc';

Database altered.

<中略>

SQL> select name,status,thread#,sequence#,first_change#,next_change# from v$archived_log;

NAME   S THREAD#  SEQUENCE# FIRST_CHANGE# NEXT_CHANGE#
------------------------------------------------------------------------------------------ - ---------- ---------- ------------- ------------
  D       1  1 1969552      1992490
  D       1  2 1992490      2029539
  D       1  3 2029539      2030862
/u02/app/oracle/arc/o1_mf_1_1_cssrmxwr_.arc   A       1  1 1969552      1992490
/u02/app/oracle/arc/o1_mf_1_2_cstmrx1m_.arc   A       1  2 1992490      2029539
/u02/app/oracle/arc/o1_mf_1_3_cstoyzbx_.arc   A       1  3 2029539      2030862
/u02/app/oracle/arc/o1_mf_1_4_cstp1w5z_.arc   A       1  4 2030862      2030925
/u02/app/oracle/arc/o1_mf_1_5_cstp28tm_.arc   A       1  5 2030925      2030935
/u02/app/oracle/arc/o1_mf_1_6_cstp2gyl_.arc   A       1  6 2030935      2030943

9 rows selected.

```

## リカバリし、RESETLOGSでOPEN

アーカイブログを適用して、RESETLOGSでOPENします

```
SQL> RECOVER  DATABASE using backup controlfile until cancel

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto

<中略> 

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
Media recovery cancelled.
SQL>
SQL> alter database open resetlogs;

Database altered.

```



# 参考

* Oracle Databaseバックアップおよびリカバリ・ユーザーズ・ガイド 12cリリース1 (12.1) B71297-05　　31 ユーザー管理のリカバリの実行: 高度な例
https://docs.oracle.com/cd/E57425_01/121/BRADV/osadvsce.htm

* awk内でシングルコーテーションを使いたい
http://qiita.com/okb_m/items/1c173e037ba42935a2a4