Oracleネタ帳 RMANについていろいろ

# RMANの情報確認

``` sql
set lin 256
col session_key for 9999
col input_type for a10
col status for a10
col status for a10
col start_dt for a17
col end_dt for a17
col output_bytes_per_sec for 9999999999.999
col output_bytes_display for a10
col compression_ratio for 999.999

select session_key,
       input_type,
       status,
       to_char(START_TIME, 'yy/mm/dd hh24:mi:ss') start_dt,
       to_char(END_TIME, 'yy/mm/dd hh24:mi:ss') end_dt,
       elapsed_seconds/60 mins,
       output_bytes_per_sec,
       output_bytes_display,
       compression_ratio
from v$rman_backup_job_details order by 1 ;
```

# RMANの進捗を確認する

``` sql
select sid, serial#, context, sofar, totalwork,
       round(sofar/totalwork*100,2) "%_complete"
from   v$session_longops
where  opname like 'RMAN%'
and    opname not like '%aggregate%'
and    totalwork != 0
and    sofar <> totalwork
;
```

# RMANの処理を中断する

```sql
-- sid, serial#を確認
select sid, serial#, event, program
from v$session
where username is not null
and program like 'rman%';
-- 殺す
alter system kill session '<sid>, <serial#>';
```

# データベースの不完全リカバリ（ある時点の状態に戻す）
コマンド

```
run{
    SET UNTIL TIME "TO_DATE('2017-09-05 10:34:14','YYYY-MM-DD HH24:MI:SS')";
    restore database;
    recover database;
    alter database open resetlogs;
}
```

## 手順
### DBIDを確認（これは事前に）

``` sql
$ sqlplus / as sysdba
SQL> select dbid from v$database;

      DBID
----------
9999999999
```

### Oracleが起動していれば停止する
### フルバックアップを所定の場所に配置
### アーカイブログを所定の場所に配置
### RMANに接続

```
$ rman target /
RMAN> set dbid 9999999999

RMAN> startup force nomount;

RMAN> restore controlfile from '/path/to/controlfile/name_of_controlfile.ctl';

RMAN> alter database mount;

RMAN> restore database;

RMAN> restore archivelog all;

RMAN> quit
```

### アーカイブの適用

```
$ sqlplus / as sysdba

SQL> recover database until cancel using backup controlfile;

ログの指定: {<RET>=suggested | filename | AUTO | CANCEL}
AUTO

ORA-00308:
アーカイブ・ログ/path/to/archivelog/name_of_archivelog.dbfをオープンできません。
ORA-27037: ファイル・ステータスを取得できません。 Linux-x86_64 Error:
2: No such file or directory
Additional information: 3

SQL> alter database open resetlogs;
```

# データベースの複製(Enterprise Editionのみ)
アクティブ・スタンバイ構成を取る時に構築済みの稼働系サーバ(プライマリサーバ)より待機系サーバ(スタンバイサーバ)を作成する。
データベースの物理構成(制御ファイルやデータファイルのパス)は稼働系と待機系では一致させること。

# 手順の流れ
## 稼働系サーバの構成

1. アーカイブログモードを有効にする
2. RMANでフルバックアップを取得する

## 待機系サーバへフルバックアップとアーカイブログをコピーする

格納先は稼働系と同じ場所

## インスタンスを再起動する

oracleユーザでSQL*Plusを起動して下記コマンドを実行する。

```
$ sqlplus / as sysdba
SQL> shutdown immediate
SQL> startup nomount
SQL> quit
```

## RMANコマンドで複製する

rmanコマンドを起動して下記コマンドを実行する。
稼働系と待機系両方に接続する。

```
$ rman target sys/change_on_install@<ip address>:<port>/<sid> auxiliary /
RMAN> duplicate target database for standby nofilenamecheck dorecover;
RMAN> quit
```

## アーカイブログを待機系に適用する

稼働系で新たに出力されたアーカイブログを待機系にコピーし、アーカイブログを待機系に適用する。
oracleユーザでSQL*Plusを起動して下記コマンドを実行する。

```
$ sqlplus / as sysdba
SQL> SELECT MAX(SEQUENCE#) FROM V$LOG_HISTORY;
SQL> set autorecovery on
SQL> recover standby database;
SQL> SELECT MAX(SEQUENCE#) FROM V$LOG_HISTORY;
```

# フィジカル・スタンバイ・データベースの作成
前述の複製(duplicateコマンド)ではない方法で待機系を構成する方法

## 稼働系でパラメータファイルを作成
pfileを作成して編集後、待機系サーバに配置する

```
$ sqlplus / as sysdba
SQL> create pfile ='/path/to/pfile/name_of_pfile' from spfile;
SQL> quit
$ vi /path/to/pfile/name_of_pfile
*.log_file_name_convert='/path/to/log_file_dir','/path/to/log_file_dir' ★追記
*.db_file_name_convert='/path/to/data_file_dir','/path/to/data_file_dir' ★追記
```

## スタンバイ制御ファイルの作成
こちらも作成後待機系サーバに配置する

```
$ rman target /
RMAN> COPY CURRENT CONTROLFILE FOR STANDBY TO '/path/to/standby_control_file.ctl';
RMAN> quit
```

## 稼働系サーバでフルバックアップを取得する

## 稼働系から待機系サーバにフルバックアップ、アーカイブログをコピーする
※ 稼働系サーバはアーカイブログモードが有効になっていること

## 2号機でのリストア・リカバリ

### Oracleを停止して、制御ファイル、spfileのバックアップをとっておく

```
$ sqlplus / as sysdba
SQL> shutdown immediate
SQL> quit
$ mkdir ~/control_file_bk
$ cp -pv /path/to/control_file.ctl ~/control_file_bk/
$ ll ~/control_file_bk
$ cp -pv $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora.`date +"%Y%m%d"`
$ ll $ORACLE_HOME/dbs/
```

バックアップ取得後に前項で作成したスタンバイ制御ファイルと差し替える

```
$ mv /path/to/standby_control_file.ctl /path/to/control_file.ctl
```

### Oracleを起動して、spfile作成、スタンバイ設定をする

```
$ sqlplus / as sysdba
SQL> startup nomount pfile='/path/to/pfile/name_of_pfile'
SQL> create spfile='$ORACLE_HOME/dbs/spfile$ORACLE_SID.ora' from pfile='/path/to/pfile/name_of_pfile';
SQL> shutdown immediate
SQL> startup mount
SQL> quit
$ rman target /
RMAN> crosscheck backup;
RMAN> catalog start with '/path/to/backup_dir/';
RMAN> restore database;
RMAN> recover database;
RMAN> shutdown immediate
RMAN> quit
```

### 待機系サーバの起動と確認

```
$ sqlplus / as sysdba
SQL> shutdown immediate
SQL> startup nomount
SQL> alter database mount standby database;
SQL> select status from v$instance;  ※「MOUNTED」と表示される
SQL> select db_unique_name,database_role from v$database;  ※「PHYSICAL STANDBY」と表示されること
SQL> quit
```

# 待機系をアクティベートする

```
$ sqlplus / as sysdba
SQL> alter database activate standby database;
SQL> quit
```

# 参考情報
[スタンドバイ・データベースの運用と回復手順](http://www005.upp.so-net.ne.jp/khayashi/platinum/17.html)
[Oracle Standard Editionで可能なフィジカル・スタンバイ・データベース検証（基本スタンバイ）](http://kenken0807.hatenablog.com/entry/2015/08/19/122906)
[Oracle Data Guard 概要および管理 3 フィジカル・スタンバイ・データベースの作成](http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19233-03/create_ps.htm)
[DataGuard入門　その３](https://www.insight-tec.com/mailmagazine/ora3/vol207.html)


以上
2020/11/10 10:00更新