Oracle Data Guard環境で確認するビューとOracle Database 12c Release 2での変更

Oracle Data Guard Physical Standby を使ってスタンバイ・データベースを構築している場合、状態を確認するためにいくつかのビューを検索します。ここでは、確認すべきビューと、Oracle Database 12c Release 2 で変更された部分について説明しています。下記の例は、プライマリ・インスタンスの一意名をDB1、スタンバイ・インスタンスの一意名をDB1Rとしています。

# プライマリー・インスタンスで確認すべき項目
## V$DATABASE
基本的なデータベース設定を確認します。

```
SQL> SELECT LOG_MODE, PROTECTION_MODE, DATABASE_ROLE, FORCE_LOGGING FROM V$DATABASE;

LOG_MODE     PROTECTION_MODE      DATABASE_ROLE　　 FORCE_LOGGING
------------ -------------------- ----------------　---------------------------------------
ARCHIVELOG   MAXIMUM PERFORMANCE  PRIMARY           YES
```
PROTECTION_MODE 列は Data Guard の保護モードを示します。多くの場合 MAXIMUM PERFORMANCE になっているはずですが、保護モードをより強力に変更している場合には異なる場合があります。FORCE_LOGGING 列はNOLOGGING属性を強制的に無効にする設定です。

## V$ARCHIVED_LOG
Redo ログからアーカイブ・ログを生成していることを確認します。また、同じ SEQUENCE# 列で、スタンバイ・インスタンスへ転送していることを確認します。
これは NAME 列がスタンバイ向けの名前になっていることを確認します。

```
SQL> SELECT SEQUENCE#, NAME, STATUS FROM V$ARCHIVED_LOG ORDER BY 1;
...
 SEQUENCE# NAME                                                  STATUS
---------- ----------------------------------------------------- --------
       107　/u01/app/oracle/oradata/arch/1_107_947334793.dbf      A
       107　DB1R                                                  A
       108　/u01/app/oracle/oradata/arch/1_108_947334793.dbf      A
       108　DB1R                                                  A
       109　/u01/app/oracle/oradata/arch/1_109_947334793.dbf      A
       109　DB1R                                                  A
```
## V$ARCHIVE_DEST_STATUS
Redo ログ／アーカイブログの転送先として、log_archive_dest_N 初期化パラメーターの設定と、状態を確認します。Redoログ転送によるReal Time Applyを行う場合は、RECOVERY_MODE 列が MANAGED REAL TIME APPLYになっているはずです。MANAGED になっている場合は Real Time Apply 状態になっていません。

```
SQL> SELECT RECOVERY_MODE FROM V$ARCHIVE_DEST_STATUS WHERE DEST_NAME='LOG_ARCHIVE_DEST_2';

RECOVERY_MODE
-----------------------
MANAGED REAL TIME APPLY
```

# スタンバイ・インスタンスで確認すべき項目
## V$MANAGED_STANDBY
リカバリーを行う MRP0 プロセスの状態を確認します。 STATUS 列がAPPLY_LOG になっていれば受信した Redo ログを適用中です。

```
SQL> SELECT PROCESS, PID, STATUS FROM V$MANAGED_STANDBY WHERE PROCESS='MRP0';
PROCESS   PID                      STATUS
--------- ------------------------ ------------
MRP0      34281                    APPLYING_LOG
```
## V$ARCHIVED_LOG
受信した Redo ログからアーカイブ・ログを生成していることを確認します。SEQUENCE# 列がプライマリ・インスタンスと同じになっているか確認してください。

```
SQL> SELECT SEQUENCE#, NAME, STATUS FROM V$ARCHIVED_LOG ORDER BY 1;
...
 SEQUENCE# NAME                                                  STATUS
---------- ----------------------------------------------------- --------
       107 /u01/app/oracle/oradata/arch/db1r/1_107_947334793.dbf A
       108 /u01/app/oracle/oradata/arch/db1r/1_108_947334793.dbf A
       109 /u01/app/oracle/oradata/arch/db1r/1_109_947334793.dbf A
```

## V$ARCHIVE_GAP
アーカイブログの受信ギャップを確認します。正常状態ではこのビューからはレコードは検索されません。

```
SQL> SELECT COUNT(*) FROM V$ARCHIVE_GAP;
  COUNT(*)
----------
         0
```

# Oracle Database 12c Release 2 による変更
Oracle Database 12c Release 2 では V\\$MANAGED\_STANDBY ビューは非推奨になりました。代わりに V\$DATAGUARD_PROCESS ビューを使います。ただしこの二つのビューは内容が微妙に異なります。

## 列名の対比
|V$MANAGED_STANDBY|V$DATAGUARD_PROCESS|
|:---|:---|
|PROCESS|NAME|
|PID|PID|
|-|TYPE|
|-|ROLE|
|-|PROC_TIME|
|-|TASK_TIME|
|-|TASK_DONE|
|STATUS|ACTION|
|CLIENT_PROCESS|CLIENT_ROLE|
|CLIENT_PID|CLIENT_PID|
|CLIENT_DBID|-|
|GROUP#|GROUP#|
|RESETLOG_ID|RESETLOG_ID|
|THREAD#|THREAD#|
|SEQUENCE#|SEQUENCE#|
|BLOCK#|BLOCK#|
|BLOCKS|BLOCK_COUNT|
|DELAY_MINS|DELAY_MINS|
|-|DEST_ID|
|-|DEST_MASK|
|-|DBID|
|-|DGID|
|-|STOP_STATE|
|KNOWN_AGENTS|-|
|ACTIVE_AGENTS|-|
|CON_ID|CON_ID|

## 出力されるプロセス名の対比
各ビューに出力されるプロセス名も異なります。V\$DATAGUARD_PROCESSには出力されるレコード数が増えています。

|V$MANAGED_STANDBY.PROCESS|V$DATAGUARD_PROCESS.NAME|
|:---|:---|
|-|LGWR|
|-|TMON|
|ARCH|ARC0|
|DGRD|TT00|
|DGRD|TT01|
|ARCH|ARC1|
|ARCH|ARC2|
|ARCH|ARC3|
|RFS|rfs|
|MRP0|MRP0|

## ステータス列の対比
Redo適用状態になっている場合、V\$MANAGED_STANDBY ビューの STATUS 列は APPLYING_LOG になっていますが、V\$DATAGUARD_PROCESS ビューでは検索時点のステータスを出力するため通常はIDLEになっています。

```
SQL> SELECT process, pid, status FROM V$MANAGED_STANDBY WHERE process='MRP0';

PROCESS   PID                   STATUS
--------- --------------------- ------------
MRP0      8541                  APPLYING_LOG

SQL> SELECT name, pid, action FROM V$DATAGUARD_PROCESS WHERE name='MRP0';

NAME  PID                      ACTION
----- ------------------------ ------------
MRP0  8541                     IDLE
```