Oracle Database Physical Data Guard 作成手順（12cR1）

# はじめに

## 作りたい環境

- Linux(Oracle Linux Server release 7.3)
- Oracle Database 12cR1
- フィジカルスタンバイ
- 非同期適用
- リアルタイム適用
- ファイルのディレクトリパスはプライマリとスタンバイで異なる
- スイッチオーバー可能な構成


## 作りたい作り方

- RMANのバックアップを使用する
- Active Duplicateは行わない（作成時にターゲット側からソース側につなぎに行かない）
- 初期化パラメータファイルは手動で作成
- スタンバイ制御ファイルはRMANで作成

## 今回作る環境まとめ

首都オーディンにあるデータベース（odin）の災対環境として、イゼルローン要塞上にフィジカルスタンバイデータベース（iserlohn）を作成する。いろいろ問題がありそうだけど、それはまた別の話。


|項目  |プライマリ|スタンバイ|
|---   |---      |---|
|DB_NAME         |odin  |odin  |
|DB_UNIQUE_NAME  |odin  |iserlohn  |
|hostname | ol121p | ol121s |
|service_names | odin.us.oracle.com | iserlohn.us.oracle.com


# プライマリデータベース作成手順

## プライマリデータベースの設定

### 強制ロギングの有効化

強制ロギングの有効化を行う。

```
SQL> ALTER DATABASE FORCE LOGGING;

Database altered.
```

### アーカイブログモードを有効化

アーカイブログモードでない場合は、アーカイブログモードを有効にする。

```
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> create spfile from pfile='/tmp/pfile_mod.ora';

File created.

SQL> startup mount
ORACLE instance started.

Total System Global Area  729808896 bytes
Fixed Size                  2928680 bytes
Variable Size             562040792 bytes
Database Buffers          159383552 bytes
Redo Buffers                5455872 bytes
Database mounted.
SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     16
Current log sequence           18
SQL>
SQL> ALTER DATABASE ARCHIVELOG;

Database altered.

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     16
Next log sequence to archive   18
Current log sequence           18
SQL> alter database open;

Database altered.
```



### リスナーの構成

リスナーが構成されており、プライマリデータベースのサービスが登録されていることを確認する。

```
$ lsnrctl status

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 10-SEP-2018 19:32:40

Copyright (c) 1991, 2014, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ol121p)(PORT=1521)))

＜中略＞

Services Summary...
Service "odin.us.oracle.com" has 1 instance(s).
  Instance "odin", status READY, has 1 handler(s) for this service...
Service "odinXDB.us.oracle.com" has 1 instance(s).
  Instance "odin", status READY, has 1 handler(s) for this service...
The command completed successfully

```

### tnsnames.oraの設定

プライマリデータベース（odin）およびスタンバイデータベース（iserlohn）接続用のネットサービス名を定義する。

```
odin =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ol121p)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = odin.us.oracle.com)
    )
  )


iserlohn =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ol121s)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = iserlohn.us.oracle.com)
    )
  )
```



### 初期化パラメータの設定

ALTER SYSTEM文やSPFILEの再作成で以下の設定を反映させる。

最初から入ってるかも

```
DB_NAME=odin
CONTROL_FILES='/u01/app/oracle/oradata/odin/control01.ctl', '/u01/app/oracle/fast_recovery_area/odin/control02.ctl'
DB_UNIQUE_NAME=odin
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
```

変更・追加する想定

```
LOG_ARCHIVE_CONFIG='DG_CONFIG=(odin,iserlohn)'
LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=odin'
LOG_ARCHIVE_DEST_2='SERVICE=iserlohn ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)  DB_UNIQUE_NAME=iserlohn'
FAL_SERVER=iserlohn
DB_FILE_NAME_CONVERT='/iserlohn/','/odin/'
LOG_FILE_NAME_CONVERT='/iserlohn/','/odin/' 
STANDBY_FILE_MANAGEMENT=AUTO
```

### スタンバイREDOログの構成

スタンバイREDOログを作成する。オンラインREDOログのグループ数+1で作成する。
ここではオンラインREDOログが3グループであるため、4つ作成する。

```
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/odin/redo04.log') SIZE 50M;
Database altered.

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/odin/redo05.log') SIZE 50M;
Database altered.

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/odin/redo06.log') SIZE 50M;
Database altered.

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/odin/redo07.log') SIZE 50M;
Database altered.

```

## プライマリデータベースのバックアップ取得

```
$ rman target /
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;
<中略>
Finished backup at 2018/09/16 00:20:50
```


## プライマリデータベースからスタンバイデータベースへのファイル転送


- プライマリデータベースのパスワードファイルをスタンバイデータベースにファイル転送

ただしファイル名はorapw<ORACLE_SID>となるように変更する。
`$ORACLE_HOME/dbs/orapwodin　→　$ORACLE_HOME/dbs/orapwodin/orapwiserlohn`

- プライマリデータベースからPFILEを作って、スタンバイデータベースに転送

`SQL> CREATE PFILE='/tmp/initiserlohn.ora' FROM SPFILE;`

- プライマリデータベースのバックアップ一式

## スタンバイデータベースの設定

### リスナーの構成

スタンバイ側でリスナーを起動する。

```
$ lsnrctl start listener

```


### tnsnames.oraの設定

プライマリデータベース（odin）およびスタンバイデータベース（iserlohn）接続用のネットサービス名を定義する。

```
odin =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ol121p)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = odin.us.oracle.com)
    )
  )


iserlohn =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ol121s)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = iserlohn.us.oracle.com)
    )
  )
```

### ディレクトリ作成

必要なディレクトリを作成する。
監査ログのディレクトリは忘れがちなので気をつける。

```
mkdir -p /u01/app/oracle/oradata/iserlohn
mkdir -p /u01/app/oracle/fast_recovery_area/iserlohn/
mkdir -p /u01/app/oracle/admin/iserlohn/adump
```

### 初期化パラメータの設定と作成

プライマリデータベースからコピーした`/tmp/initiserlohn.ora`を以下の内容に編集する。

```
DB_NAME=odin
control_files='/u01/app/oracle/oradata/iserlohn/control01.ctl','/u01/app/oracle/fast_recovery_area/iserlohn/control02.ctl'
DB_UNIQUE_NAME=iserlohn
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_CONFIG='DG_CONFIG=(odin,iserlohn)'
LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=iserlohn'
LOG_ARCHIVE_DEST_2='SERVICE=odin ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)  DB_UNIQUE_NAME=odin'
FAL_SERVER='odin'
DB_FILE_NAME_CONVERT='/odin/','/iserlohn/'
LOG_FILE_NAME_CONVERT='/odin/','/iserlohn/'
STANDBY_FILE_MANAGEMENT=AUTO
```

編集した内容で、SPFILEを作成する。

```
$ sqlplus / as sysdba

SQL> create spfile from pfile='/tmp/initiserlohn.ora';
File created.
```

## データ同期の開始

### スタンバイ側でRMANによるデータベースの複製

スタンバイデータベースのNOMOUNTでの起動。

```
SQL> startup nomount
ORACLE instance started.

Total System Global Area  729808896 bytes
Fixed Size                  2928680 bytes
Variable Size             562040792 bytes
Database Buffers          159383552 bytes
Redo Buffers                5455872 bytes
```

補助データベース（auxiliary）としてスタンバイデータベースに接続して、DUPLICATEを行う。
バックアップセットの場所はBACKUP LOCATIONで指定する。ここでは/backupsetを指定する。

```
$ rman auxiliary /
connected to auxiliary database: ODIN (not mounted)

RMAN> DUPLICATE TARGET DATABASE FOR STANDBY BACKUP LOCATION '/backupset' DORECOVER NOFILENAMECHECK;

Starting Duplicate Db at 2018/09/16 23:14:54

<中略>

Finished recover at 2018/09/16 23:17:54
Finished Duplicate Db at 2018/09/16 23:18:07

```

### スタンバイDB側にスタンバイREDOログの作成


```
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/iserlohn/redo04.log') SIZE 50M;

Database altered.

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/iserlohn/redo05.log') SIZE 50M;

Database altered.

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/iserlohn/redo06.log') SIZE 50M;

Database altered.

SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/iserlohn/redo07.log') SIZE 50M;

Database altered.
```


### 適用プロセスの開始

以下のコマンドを実行する。12cからは「USING CURRENT LOGFILE」は不要。

```
SQL>  ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

Database altered.
```



### 確認

フィジカルスタンバイのロールを確認する。
DATABASE_ROLE列がPHYSICAL STANDBYであること。

```
SQL> select DBID,NAME,LOG_MODE,OPEN_MODE,DATABASE_ROLE,FORCE_LOGGING,CURRENT_SCN from v$database;

      DBID NAME      LOG_MODE     OPEN_MODE            DATABASE_ROLE    FORCE_LOGGING                           CURRENT_SCN
---------- --------- ------------ -------------------- ---------------- --------------------------------------- -----------
 884158366 ODIN      ARCHIVELOG   MOUNTED              PHYSICAL STANDBY YES                                         3118450
```

MRP0が稼働していることを確認する。


```
SQL> SELECT PROCESS, STATUS, THREAD#, SEQUENCE#,BLOCK#, BLOCKS FROM V$MANAGED_STANDBY;

PROCESS   STATUS          THREAD#  SEQUENCE#     BLOCK#     BLOCKS
--------- ------------ ---------- ---------- ---------- ----------
ARCH      CLOSING               1         82      79872        986
ARCH      CONNECTED             0          0          0          0
ARCH      CLOSING               1         86      92160        787
ARCH      CLOSING               1         85      79872        102
RFS       IDLE                  1         87      34099          1
RFS       IDLE                  0          0          0          0
MRP0      APPLYING_LOG          1         87      34099     102400
RFS       IDLE                  0          0          0          0
```




# 参考
## 参考ドキュメント

Oracle® Data Guard概要および管理 12c リリース1 (12.1) B71304-07
10 フィジカルおよびスナップショット・スタンバイ・データベースの管理
https://docs.oracle.com/cd/E57425_01/121/SBYDB/manage_ps.htm


Oracle® Databaseバックアップおよびリカバリ・ユーザーズ・ガイド 12c リリース1 (12.1)　B71297-08
25 データベースの複製
https://docs.oracle.com/cd/E57425_01/121/BRADV/rcmdupdb.htm


Oracle® Databaseバックアップおよびリカバリ・リファレンス　12cリリース1 (12.1)　B71298-08
DUPLICATE
https://docs.oracle.com/cd/E57425_01/121/RCMRF/rcmsynta020.htm


Oracle® Database高可用性ベスト・プラクティス　12cリリース1 (12.1)　E57730-02
8 Oracle Data Guardの構成
https://docs.oracle.com/cd/E57425_01/121/HABPT/config_dg.htm


## つまったところ

### 「DUPLICATE TARGET DATABASE FOR STANDBY」の実行時に「NOFILENAMECHECK句」をつける

つけない場合、以下のエラーで失敗する。

```
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of Duplicate Db command at 09/16/2018 23:07:48
RMAN-05501: aborting duplication of target database
RMAN-05001: auxiliary file name /u01/app/oracle/oradata/iserlohn/users01.dbf conflicts with a file used by the target database
RMAN-05001: auxiliary file name /u01/app/oracle/oradata/iserlohn/undotbs01.dbf conflicts with a file used by the target database
RMAN-05001: auxiliary file name /u01/app/oracle/oradata/iserlohn/sysaux01.dbf conflicts with a file used by the target database
RMAN-05001: auxiliary file name /u01/app/oracle/oradata/iserlohn/system01.dbf conflicts with a file used by the target database
```

参考
RMAN-05001: Auxiliary Filename Conflicts with a File Used by the Target Database Tips
http://www.dba-oracle.com/t_rman_05001_auxiliary_filename_conflicts_with_file_used_by_target_database.htm

### スタンバイREDOログの作成はMRPが起動していない状態で実行する

MRP起動後に実行すると以下のエラーが発生する。

```
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/iserlohn/redo04.log') SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/app/oracle/oradata/iserlohn/redo04.log') SIZE 50M
*
ERROR at line 1:
ORA-01156: recovery or flashback in progress may need access to files
```