Oracle DataGuard(フィジカルスタンバイ)で確認する項目


## 内容
フィジカルスタンバイのDataGuardで、確認しといたほうが良い項目のメモ。


## 確認項目
### ・データベースロール (プライマリ/スタンバイ)
プライマリ機が「PRIMARY」スタンバイ機が「PHYSICAL STANDBY」になっていることを確認。

```sql:
SQL> select DATABASE_ROLE from v$database;

DATABASE_ROLE
------------------------------------------------
PRIMARY
```


### ・保護モード (プライマリ/スタンバイ)

```sql:
SQL> select protection_mode from v$database;

PROTECTION_MODE
------------------------------------------------------------
MAXIMUM PERFORMANCE

-- MAXIMUM PROTECTION   - 保護モード
-- MAXIMUM AVAILABILITY - 可用性モード
-- MAXIMUM PERFORMANCE  - パフォーマンスモード
-- RESYNCHRONIZATION    - 再同期化モード
-- UNPROTECTED          - 保護対象外
--                        (プライマリがマウント済だがオープンされていない場合に発生)
```


### ・スイッチオーバーの可／不可 (プライマリ/スタンバイ)
詳細はマニュアル参照。
プライマリ機では「TO STANDBY」、スタンバイ機では「NOT ALLOWED」等になっている。

```sql:
select switchover_status from v$database;

SQL> select switchover_status from v$database;

SWITCHOVER_STATUS
------------------------------------------------------------
TO STANDBY
```

### ・Data Guard Broker (プライマリ/スタンバイ)
Data Guard Brokerの有効／無効確認。

```sql:
SQL> select dataguard_broker from v$database;

DATAGUARD_BROKER
------------------------
DISABLED
```

### ・ファストスタート・フェイルオーバー (プライマリ/スタンバイ)
ファストスタート・フェイルオーバーの有効/無効を確認。

```sql:
SQL> SELECT FS_FAILOVER_STATUS FROM V$DATABASE;

FS_FAILOVER_STATUS
------------------------------------------------------------------
DISABLED
```

> FS_FAILOVER_STATUSre列が「DISABLED」の場合、ファストスタート・フェイルオーバーは無効化されている。
> その他のステータスに関しては、以下を参照。 
>  V$DATABASEビューのFS_FAILOVER_STATUS列
>  http://docs.oracle.com/cd/E16338_01/server.112/b56304/sofo.htm#CHDIDBGI


最後に発生したファストスタート・フェイルオーバーの時刻を確認。

```sql:
SELECT * FROM V$FS_FAILOVER_STATS;

LAST_FAILOVER_TIME   LAST_FAILOVER_REASON
-------------------- ----------------------
2015-05-06 16:09:49  Primary Disconnected
```


### ・強制ロギング (プライマリ)
プライマリ機の強制ロギングが有効であることを確認。

```sql:
-- プライマリで以下を実行。
SQL> SELECT FORCE_LOGGING FROM V$DATABASE;

FORCE_LOG
---------
YES

-- YES - 強制ロギングが有効
-- NO  - 強制ロギングが無効
```

強制ロギング有効/無効の切り替えは、以下のSQLで実施。

```sql:
-- 有効化
SQL> ALTER DATABASE FORCE LOGGING;

データベースが変更されました。

-- 無効化
SQL> ALTER DATABASE NO FORCE LOGGING;

データベースが変更されました。
```


### ・REDOログ／STANDBY REDOログ (プライマリ/スタンバイ)
REDOログ、STANDBY REDOログの構成を確認。

```sql:
-- ファイルの場所
SQL> select GROUP#,TYPE,MEMBER from v$logfile;

    GROUP# TYPE                  MEMBER
---------- --------------------- --------------------------------------------------
         1 ONLINE                /u01/app/oracle/oradata/DGTEST/redo01.log
         2 ONLINE                /u01/app/oracle/oradata/DGTEST/redo02.log
         3 ONLINE                /u01/app/oracle/oradata/DGTEST/redo03.log
         4 STANDBY               /u01/app/oracle/oradata/DGTEST/sredo01.log
         5 STANDBY               /u01/app/oracle/oradata/DGTEST/sredo02.log
         6 STANDBY               /u01/app/oracle/oradata/DGTEST/sredo03.log
         7 STANDBY               /u01/app/oracle/oradata/DGTEST/sredo04.log

-- ファイルサイズ
SQL> SELECT GROUP#, THREAD#, BYTES/1024/1024 MB FROM V$LOG
  2  UNION
  3  SELECT GROUP#, THREAD#, BYTES/1024/1024 MB FROM V$STANDBY_LOG;

    GROUP#    THREAD#         MB
---------- ---------- ----------
         1          1         50
         2          1         50
         3          1         50
         4          0         50
         5          0         50
         6          0         50
         7          0         50
```


### ・アーカイブREDOログ転送状況 (プライマリ/スタンバイ)
アーカイブREDOログが、プライマリ機→スタンバイ機へ転送されていることを確認。

スタンバイ機の状況を確認。

```sql:
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY 1;
 SEQUENCE# FIRST_TIME          NEXT_TIME          
---------- ------------------- -------------------
        16 2015-05-06 16:07:39 2015-05-06 16:09:49
        17 2015-05-06 16:09:49 2015-05-06 16:32:17
        18 2015-05-06 16:32:17 2015-05-06 16:32:20
```

プライマリ機でログスイッチを複数回実施。

```sql:
SQL> ALTER SYSTEM SWITCH LOGFILE;
システムが変更されました。

SQL> ALTER SYSTEM SWITCH LOGFILE;
システムが変更されました。

SQL> ALTER SYSTEM SWITCH LOGFILE;
システムが変更されました。
```

再度、スタンバイ機の状況を確認。

```sql:
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
 SEQUENCE# FIRST_TIME          NEXT_TIME          
---------- ------------------- -------------------
        16 2015-05-06 16:07:39 2015-05-06 16:09:49
        17 2015-05-06 16:09:49 2015-05-06 16:32:17
        18 2015-05-06 16:32:17 2015-05-06 16:32:20
        19 2015-05-06 16:32:20 2015-05-06 16:37:07
        20 2015-05-06 16:37:07 2015-05-06 16:37:09
        21 2015-05-06 16:37:09 2015-05-06 16:37:11
```

### ・REDO Apply(MRPプロセス) (スタンバイ)
REDO Applyが動作しているかどうか確認。

```sql:
-- スタンバイ機で以下を実施
SQL> SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY WHERE PROCESS LIKE 'MRP%';

-- REDO Applyが起動している場合
PROCESS                     STATUS
--------------------------- ------------------------------------
MRP0                        APPLYING_LOG

-- REDO Applyが停止している場合
レコードが選択されませんでした。

```

REDO Applyの起動・停止は、以下のSQLで実施。

```sql:
-- 起動
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
データベースが変更されました。

-- 停止
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
データベースが変更されました。
```

### ・REDOログ適用状況 (プライマリ/スタンバイ)
REDOログの適用状況を確認。

```sql:
-- スタンバイ機で以下のSQLを実施。
-- APPLIED列が「YES」になっていることを確認。
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

 SEQUENCE# FIRST_TIME          NEXT_TIME           APPLIED
---------- ------------------- ------------------- ---------------------------

                …（省略）…

        29 2015-05-09 22:15:14 2015-05-09 22:15:16 YES
        30 2015-05-09 22:15:16 2015-05-09 22:15:21 YES
        31 2015-05-09 22:15:21 2015-05-10 00:18:21 YES
        32 2015-05-10 00:18:21 2015-05-10 00:41:37 NO
        33 2015-05-10 00:41:37 2015-05-10 00:41:38 NO
        34 2015-05-10 00:41:38 2015-05-10 00:41:40 NO
```

APPLIEDに「NO」がある場合、REDO Applyが起動していることを確認。

```sql:
-- REDO Applyの状況確認
SQL> SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY WHERE PROCESS LIKE 'MRP%';

レコードが選択されませんでした。

-- REDO Applyの起動
SQL> alter database recover managed standby database using current logfile disconnect from session;

データベースが変更されました。

-- 適用状況の確認
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

 SEQUENCE# FIRST_TIME          NEXT_TIME           APPLIED
---------- ------------------- ------------------- ---------------------------

                …（省略）…

        29 2015-05-09 22:15:14 2015-05-09 22:15:16 YES
        30 2015-05-09 22:15:16 2015-05-09 22:15:21 YES
        31 2015-05-09 22:15:21 2015-05-10 00:18:21 YES
        32 2015-05-10 00:18:21 2015-05-10 00:41:37 YES
        33 2015-05-10 00:41:37 2015-05-10 00:41:38 YES
        34 2015-05-10 00:41:38 2015-05-10 00:41:40 IN-MEMORY
```

### ・アーカイブギャップ (スタンバイ)
アーカイブギャップが発生していないことを確認。

```sql:
-- スタンバイ機で以下を実施
SQL> SELECT * FROM V$ARCHIVE_GAP;

-- アーカイブギャップが発生してない場合
レコードが選択されませんでした。

-- アーカイブギャップが発生している場合
    THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
----------- ------------- --------------
          1             7             10
```


### ・アーカイブトレース (プライマリ/スタンバイ)
アーカイブトレースの有効／無効を確認。

```sql:
SQL> select name,value from v$parameter where name = 'log_archive_trace';

NAME                 VALUE
-------------------- ------------------------------
log_archive_trace    0
```

> 詳細は以下を参照
> http://docs.oracle.com/cd/E16338_01/server.112/b56302/trace.htm#g638947

### ・LOG_ARCHIVE_DEST_n初期化パラメータ (プライマリ/スタンバイ)

LOG_ARCHIVE_DEST_nの内容を確認。初期化パラメータとv$archive_destビューを使用した詳細な情報を確認する。

```sql:
-- LOG_ARCHIVE_DEST_nの設定値を確認。
SQL> select name,value from v$parameter where name in ('log_archive_dest_2','log_archive_dest_state_2');

NAME                           VALUE
------------------------------ --------------------------------------------------
log_archive_dest_2             SERVICE=DGTESTS ASYNC  VALID_FOR=(ONLINE_LOGFILES,
                               PRIMARY_ROLE) DB_UNIQUE_NAME=DGTESTS

log_archive_dest_state_2       ENABLE

-- LOG_ARCHIVE_DEST_nの詳細な設定値を確認。
-- print_tableプロシージャについては、以下を参照。
-- https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1035431863958
SQL> set serveroutput on
SQL> exec print_table('select * from v$archive_dest where dest_name = ''LOG_ARCHIVE_DEST_2''') ;
================
DEST_ID                       : 2
DEST_NAME                     : LOG_ARCHIVE_DEST_2
STATUS                        : VALID
BINDING                       : OPTIONAL
NAME_SPACE                    : SYSTEM
TARGET                        : STANDBY
ARCHIVER                      : LGWR
SCHEDULE                      : ACTIVE
DESTINATION                   : DGTESTS
LOG_SEQUENCE                  : 41
REOPEN_SECS                   : 300
DELAY_MINS                    : 0
MAX_CONNECTIONS               : 1
NET_TIMEOUT                   : 30
PROCESS                       : LGWR
REGISTER                      : YES
FAIL_DATE                     :
FAIL_SEQUENCE                 : 0
FAIL_BLOCK                    : 0
FAILURE_COUNT                 : 1
MAX_FAILURE                   : 0
ERROR                         :
ALTERNATE                     : NONE
DEPENDENCY                    : NONE
REMOTE_TEMPLATE               : NONE
QUOTA_SIZE                    : 0
QUOTA_USED                    : 0
MOUNTID                       : 0
TRANSMIT_MODE                 : ASYNCHRONOUS
ASYNC_BLOCKS                  : 61440
AFFIRM                        : NO
TYPE                          : PUBLIC
VALID_NOW                     : YES
VALID_TYPE                    : ONLINE_LOGFILE
VALID_ROLE                    : PRIMARY_ROLE
DB_UNIQUE_NAME                : DGTESTS
VERIFY                        : NO
COMPRESSION                   : DISABLE
APPLIED_SCN                   : 313063
================

PL/SQLプロシージャが正常に完了しました。

```

現場ではprint_tableプロシージャを作れないので、XMLで取得を検討。

```sql:
-- 「-S」オプションでログイン
-- sqlplus -S / as sysdba 
SQL> set pages 0
SQL> set lines 10000
SQL> set long 10000000
SQL> set trimspool on
SQL> col xml for a1000
SQL> spool /tmp/log_archive_dest_2.xml
SQL> select dbms_xmlgen.getxml('select * from v$archive_dest where dest_name = ''LOG_ARCHIVE_DEST_2''') xml from dual;
SQL> spool off
SQL> exit

```

```xml:/tmp/log_archive_dest_2.xml
<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <DEST_ID>2</DEST_ID>
  <DEST_NAME>LOG_ARCHIVE_DEST_2</DEST_NAME>
  <STATUS>VALID</STATUS>
  <BINDING>OPTIONAL</BINDING>

…（省略）…

  <VALID_ROLE>PRIMARY_ROLE</VALID_ROLE>
  <DB_UNIQUE_NAME>DGTESTS</DB_UNIQUE_NAME>
  <VERIFY>NO</VERIFY>
  <COMPRESSION>DISABLE</COMPRESSION>
  <APPLIED_SCN>313063</APPLIED_SCN>
 </ROW>
</ROWSET>
```

linuxの場合、grepやsedで整形してみたりする。

コマンド

```bash:
echo '---------'; grep -v '<?xml version="1.0"?>\|<.*ROWSET>\|<ROW>' log_archive_dest_2.xml | sed -e 's/^[ ]*//g; s/<\/ROW>/---------/g; s/<\/.*>//g; s/<\(.*\)>/\1: /g'
```


結果

```bash:
---------
DEST_ID: 2
DEST_NAME: LOG_ARCHIVE_DEST_2
STATUS: VALID
BINDING: OPTIONAL

…（省略）…

VALID_ROLE: PRIMARY_ROLE
DB_UNIQUE_NAME: DGTESTS
VERIFY: NO
COMPRESSION: DISABLE
APPLIED_SCN: 313063
---------
```