[Oracle Cloud] DBCS リージョン間の高可用性構成をしてみた

# はじめに

Oracle Cloud Infrastructure(以下OCI)では、Oracle DB のマネージドサービス である、Database Cloud Service (略して DBCS) が提供されています。DBCS では簡単にマルチリージョンの可用性構成が組めます。
東京リージョンと大阪リージョンで災害対策したいときに、マルチリージョン構成が出来ます。この構成は、Oracle DB の Data Guard と呼ばれる機能で実現されています。

今回の記事では、マルチリージョン構成を試したので、その設定方法を忘れないように残しておきます。



# リモートピアリング設定

東京リージョンと大阪リージョン間で、Data Guard を構成するために、リモートピアリング設定が必要です。次のURLを参照して設定していくとよいでしょう。リージョン間の疎通確認のために、Compute Instance をたてて Ping を実行していくのが良いと思います。

https://cloudii.atomitech.jp/entry/20200124/1579848579



# システム構成図

こんなかんじの構成を作っていきます。Tokyo が Primary で、Osaka が Standby です。

![1593090298570.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/8c298e00-1aa1-5ab0-c351-71a1f7f0a598.png)



# Network Security List

東京リージョンと大阪リージョン間で、互いに疎通するための Security List の設定を行います。上のシステム構成図と見比べると、理解しやすいと思います。
今回は、次の3種類を開放します。

- ICMP (Ping)
- SSH (TCP 22)
- Oracle DB (TCP 1521)

Tokyo Region 側の設定

![1593064726309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/0da8fa76-5067-2738-df08-7ee591882a31.png)



Osaka Region側の設定

![1593064790998.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/907c1f20-60c6-344a-3771-db12f3c4c2e6.png)



# Tokyo DBCS Create

Tokyo 側の DBCS を適当に作成します。

![1593064862706.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/360f954c-b505-d21d-d859-6719007678e0.png)



パラメータも適当に入れます。

![1593064922835.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/97f6128f-1c81-f599-c8d6-2273c8655ed7.png)



パラメータも適当に入れたのちに、Create DB System を押します。

![1593064996871.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/a6a802f2-7b11-9f5a-2781-7f22bff3a3ca.png)



Provisioning されました。

![1593065022622.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/b32ba38e-6d03-c591-605e-7eae3e304327.png)



一定時間後に Available になります。

![1593071219536.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/1f35f6f0-e74b-6929-36e8-35e4e067eac2.png)



# Data Guard 構成

DBCS の管理画面上で、Data Guard を構成します。先ほど作成した Tokyo 側の DBCS をクリックします。

![1593071261513.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/58af6ec6-a577-a7c6-66bd-c64001c7e6b9.png)



更に詳細画面に進みます。

![1593071369536.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/409a5130-0b3c-43f8-5500-d78c5b47a757.png)



Enable Data Guard を押します。

![1593071400679.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/9793f978-c464-9884-9308-fc5e01703e75.png)



Osaka 側のパラメータを入れて、Enable ボタンを押します。

- リモートピアリングを構成した VCN を指定
- Password は Tokyo と同一のものを指定

![1593071442609.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/145b969a-6628-9484-9116-2e268f6e551d.png)



Updating 状態となり、Osaka 側が作成されます。自分の環境では、1時間50分ほど完了までに時間が掛かりました。データ量によっても時間は変わってくるはずです。

![1593071485273.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/ddc10b78-df5f-7f68-36cf-98a622252b0b.png)



一定時間後、Tokyo Region 側の画面に何やら変化があります。

![1593071944566.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/733508e9-0ac4-d072-fc8d-dba18e8265d0.png)



Work Requests にも、Create Data Guard のジョブが表示されています。

![1593071979725.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/8a2f0d21-5a51-6e47-18bc-acc99012b0bb.png)



Osaka Region 側を見ると、DBCS メニューで Provisioning 中の物が見えます。

![1593072003428.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/5ead9092-7da5-898b-c37b-0596ed2829af.png)



Osaka 側 DBCS の詳細画面はこんな感じです。

![1593072034954.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/b1fcfc99-0fb7-78fb-ce05-1b4ad649bdad.png)



完了後の Tokyo Region 側の画面の状態です。

![1593085781433.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/a65812f2-5021-3bd5-662f-e97a7b319d84.png)



# Data Guard 設定確認

Tokyo Region 側の DBCS にログインして各種確認をします。
oracle user へスイッチします。

```
[opc@tokyodb03 ~]$ sudo su - oracle
Last login: Thu Jun 25 11:51:52 UTC 2020
[oracle@tokyodb03 ~]$
```



dgmgrl コマンドを起動

```
[oracle@tokyodb03 ~]$ dgmgrl /
DGMGRL for Linux: Release 19.0.0.0.0 - Production on Thu Jun 25 11:53:02 2020
Version 19.7.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Welcome to DGMGRL, type "help" for information.
Connected to "tokyodb_nrt1m4"
Connected as SYSDG.
DGMGRL>
```



Data Guard 構成の詳細を確認。Tokyo と Osaka 側の DBCS が見えています。また、MaxPerformance Mode が Default となっていることもわかります。

```
DGMGRL> SHOW CONFIGURATION VERBOSE;

Configuration - tokyodb_nrt1m4_tokyodb_kix12q

  Protection Mode: MaxPerformance
  Members:
  tokyodb_nrt1m4 - Primary database             <== 1台目 : Tokyo
    tokyodb_kix12q - Physical standby database  <== 2台目 : Osaka

  Properties:
    FastStartFailoverThreshold      = '30'
    OperationTimeout                = '30'
    TraceLevel                      = 'USER'
    FastStartFailoverLagLimit       = '30'
    CommunicationTimeout            = '180'
    ObserverReconnect               = '0'
    FastStartFailoverAutoReinstate  = 'TRUE'
    FastStartFailoverPmyShutdown    = 'TRUE'
    BystandersFollowRoleChange      = 'ALL'
    ObserverOverride                = 'FALSE'
    ExternalDestination1            = ''
    ExternalDestination2            = ''
    PrimaryLostWriteAction          = 'CONTINUE'
    ConfigurationWideServiceName    = 'tokyodb_CFG'

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS

DGMGRL>
```



なお、先ほどのコマンドの名前は、Unique Name が表示されています

![1593086213249.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/60f63f0e-f303-6cfb-6faa-21cb84e3323a.png)



Tokyo 側 DBCS の詳細です

```
DGMGRL> SHOW DATABASE VERBOSE tokyodb_nrt1m4;

Database - tokyodb_nrt1m4

  Role:               PRIMARY
  Intended State:     TRANSPORT-ON
  Instance(s):
    tokyodb

  Properties:
    DGConnectIdentifier             = 'tokyodb_nrt1m4'
    ObserverConnectIdentifier       = ''
    FastStartFailoverTarget         = ''
    PreferredObserverHosts          = ''
    LogShipping                     = 'ON'
    RedoRoutes                      = ''
    LogXptMode                      = 'ASYNC'
    DelayMins                       = '0'
    Binding                         = 'optional'
    MaxFailure                      = '0'
    ReopenSecs                      = '300'
    NetTimeout                      = '30'
    RedoCompression                 = 'DISABLE'
    PreferredApplyInstance          = ''
    ApplyInstanceTimeout            = '0'
    ApplyLagThreshold               = '30'
    TransportLagThreshold           = '30'
    TransportDisconnectedThreshold  = '30'
    ApplyParallel                   = 'AUTO'
    ApplyInstances                  = '0'
    StandbyFileManagement           = ''
    ArchiveLagTarget                = '0'
    LogArchiveMaxProcesses          = '0'
    LogArchiveMinSucceedDest        = '0'
    DataGuardSyncLatency            = '0'
    LogArchiveTrace                 = '0'
    LogArchiveFormat                = ''
    DbFileNameConvert               = ''
    LogFileNameConvert              = ''
    ArchiveLocation                 = ''
    AlternateLocation               = ''
    StandbyArchiveLocation          = ''
    StandbyAlternateLocation        = ''
    InconsistentProperties          = '(monitor)'
    InconsistentLogXptProps         = '(monitor)'
    LogXptStatus                    = '(monitor)'
    SendQEntries                    = '(monitor)'
    RecvQEntries                    = '(monitor)'
    HostName                        = 'tokyodb03'
    StaticConnectIdentifier         = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=tokyodb03)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=tokyodb_nrt1m4_DGMGRL.tokyosubnet01.tokyovcn.oraclevcn.com)(INSTANCE_NAME=tokyodb)(SERVER=DEDICATED)))'
    TopWaitEvents                   = '(monitor)'
    SidName                         = '(monitor)'

  Log file locations:
    Alert log               : /u01/app/oracle/diag/rdbms/tokyodb_nrt1m4/tokyodb/trace/alert_tokyodb.log
    Data Guard Broker log   : /u01/app/oracle/diag/rdbms/tokyodb_nrt1m4/tokyodb/trace/drctokyodb.log

Database Status:
SUCCESS

DGMGRL>
```



Osaka 側 DBCS の詳細です

```
DGMGRL> SHOW DATABASE VERBOSE tokyodb_kix12q;

Database - tokyodb_kix12q

  Role:               PHYSICAL STANDBY
  Intended State:     APPLY-ON
  Transport Lag:      0 seconds (computed 1 second ago)
  Apply Lag:          0 seconds (computed 1 second ago)
  Average Apply Rate: 1.00 KByte/s
  Active Apply Rate:  516.00 KByte/s
  Maximum Apply Rate: 516.00 KByte/s
  Real Time Query:    OFF
  Instance(s):
    tokyodb

  Properties:
    DGConnectIdentifier             = 'tokyodb_kix12q'
    ObserverConnectIdentifier       = ''
    FastStartFailoverTarget         = ''
    PreferredObserverHosts          = ''
    LogShipping                     = 'ON'
    RedoRoutes                      = ''
    LogXptMode                      = 'ASYNC'
    DelayMins                       = '0'
    Binding                         = 'optional'
    MaxFailure                      = '0'
    ReopenSecs                      = '300'
    NetTimeout                      = '30'
    RedoCompression                 = 'DISABLE'
    PreferredApplyInstance          = ''
    ApplyInstanceTimeout            = '0'
    ApplyLagThreshold               = '30'
    TransportLagThreshold           = '30'
    TransportDisconnectedThreshold  = '30'
    ApplyParallel                   = 'AUTO'
    ApplyInstances                  = '0'
    StandbyFileManagement           = ''
    ArchiveLagTarget                = '0'
    LogArchiveMaxProcesses          = '0'
    LogArchiveMinSucceedDest        = '0'
    DataGuardSyncLatency            = '0'
    LogArchiveTrace                 = '0'
    LogArchiveFormat                = ''
    DbFileNameConvert               = ''
    LogFileNameConvert              = ''
    ArchiveLocation                 = ''
    AlternateLocation               = ''
    StandbyArchiveLocation          = ''
    StandbyAlternateLocation        = ''
    InconsistentProperties          = '(monitor)'
    InconsistentLogXptProps         = '(monitor)'
    LogXptStatus                    = '(monitor)'
    SendQEntries                    = '(monitor)'
    RecvQEntries                    = '(monitor)'
    HostName                        = 'osakadb03'
    StaticConnectIdentifier         = '(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=osakadb03)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=tokyodb_kix12q_DGMGRL.osakasubnet01.osakavcn.oraclevcn.com)(INSTANCE_NAME=tokyodb)(SERVER=DEDICATED)))'
    TopWaitEvents                   = '(monitor)'
    SidName                         = '(monitor)'

  Log file locations:
    Alert log               : /u01/app/oracle/diag/rdbms/tokyodb_kix12q/tokyodb/trace/alert_tokyodb.log
    Data Guard Broker log   : /u01/app/oracle/diag/rdbms/tokyodb_kix12q/tokyodb/trace/drctokyodb.log

Database Status:
SUCCESS

DGMGRL>
```



# データの書き込み

Tokyo 側にテストデータを書き込みます。説明は省略して、コマンドだけ羅列します。

```
sqlplus / as sysdba
```


User Create

```
CREATE USER sugi IDENTIFIED BY Sug1_Passw0rd_dayo; 
GRANT CONNECT, RESOURCE TO sugi;
ALTER USER sugi quota unlimited on USERS; 
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
```



tnsnames 編集

```
vim $ORACLE_HOME/network/admin/tnsnames.ora
```



追記

```
pdbname=
(DESCRIPTION=
  (LOAD_BALANCE=off) 
  (ADDRESS=
    (PROTOCOL=tcp)  
    (HOST=10.0.0.9)  
    (PORT=1521)
  ) 
  (CONNECT_DATA=
    (SERVICE_NAME=pdb01.tokyosubnet01.tokyovcn.oraclevcn.com) 
    (FAILOVER_MODE=
      (TYPE=select) 
      (METHOD=basic)
    )
  )
)
```



PDB 接続

```
sqlplus sugi/Sug1_Passw0rd_dayo@pdbname
```



CREATE TABLE

```
CREATE TABLE emp 
 (
 empno VARCHAR2(10) NOT NULL,
 empname VARCHAR2(50),
 gender_f NUMBER(1,0)
 ) 
;
```



INSERT INTO 

```
INSERT INTO emp VALUES (1, 2, 1);
INSERT INTO emp VALUES (2, 3, 1);
INSERT INTO emp VALUES (3, 2, 1);
COMMIT;
```



SELECT * 

```
SELECT * FROM emp;
```

 
Result

```
SQL> SELECT * FROM emp;

EMPNO      EMPNAME                                              GENDER_F
---------- -------------------------------------------------- ----------
1          2                                                           1
2          3                                                           1
3          2                                                           1
```





# Data Guard のデータ保護モードをMaxAvailabilityに変更

Data Guard には、コスト・可用性・パフォーマンス・データ保護のバランスをとるために、データ保護モードが3種類用意されています。下の表は3種類の特徴と概要を示したものです

参考元 : https://www.oracle.com/technetwork/jp/content/twp-dataguard-11gr2-134591-ja.pdf

| モード             | データ損失のリスク                  | 転送  | スタンバイ・データベースからの確認がない場合の処理           |
| :----------------- | :---------------------------------- | :---- | :----------------------------------------------------------- |
| 最大保護           | データ損失ゼロ 二重障害保護         | SYNC  | トランザクションのREDOがディスクに書き込まれたことを示すスタンバイ・データベースからの確認を受信してから、コミットの成功をアプリケーションに通知します。 |
| 最大可用性         | ハイブリッド 損失の可能性あり       | SYNC  | スタンバイ・データベースからの確認を受信するか、または NET_TIMEOUT しきい値に指定された期間が過ぎたら、いずれの場合もコミットの成功をアプリケーションに通知します。 |
| 最大パフォーマンス | 最小限のデータ保護 損失の可能性あり | ASYNC | プライマリはスタンバイからの確認を待つことなく、コミットの成功をアプリケーションに通知します。 |



今回は検証の一環で、データ保護モードを変更してみます。
DGMGRL(Data Guard Brokerのコマンド・ユーティリティ)を使用して、最大可用性(MaxAvailability) モードに変更します

```
edit database tokyodb_nrt1m4 set property 'logXptMode'='SYNC';
edit database tokyodb_kix12q set property 'logXptMode'='SYNC';
edit configuration set protection mode as maxavailability;
```



実行例

```
DGMGRL> edit database tokyodb_nrt1m4 set property 'logXptMode'='SYNC';
Property "logXptMode" updated
DGMGRL> edit database tokyodb_kix12q set property 'logXptMode'='SYNC';
Property "logXptMode" updated
DGMGRL> edit configuration set protection mode as maxavailability;
Succeeded.
DGMGRL>
```



設定変更後の状態を確認します

```
DGMGRL> SHOW CONFIGURATION VERBOSE;

Configuration - tokyodb_nrt1m4_tokyodb_kix12q

  Protection Mode: MaxAvailability   <============== MaxAvailabilityになっている
  Members:
  tokyodb_nrt1m4 - Primary database
    tokyodb_kix12q - Physical standby database

  Properties:
    FastStartFailoverThreshold      = '30'
    OperationTimeout                = '30'
    TraceLevel                      = 'USER'
    FastStartFailoverLagLimit       = '0'
    CommunicationTimeout            = '180'
    ObserverReconnect               = '0'
    FastStartFailoverAutoReinstate  = 'TRUE'
    FastStartFailoverPmyShutdown    = 'TRUE'
    BystandersFollowRoleChange      = 'ALL'
    ObserverOverride                = 'FALSE'
    ExternalDestination1            = ''
    ExternalDestination2            = ''
    PrimaryLostWriteAction          = 'CONTINUE'
    ConfigurationWideServiceName    = 'tokyodb_CFG'

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS

DGMGRL>
```



Tokyo側

```
DGMGRL> SHOW DATABASE VERBOSE tokyodb_nrt1m4;

Database - tokyodb_nrt1m4

  Role:               PRIMARY
  Intended State:     TRANSPORT-ON
  Instance(s):
    tokyodb

  Properties:
    DGConnectIdentifier             = 'tokyodb_nrt1m4'
    ObserverConnectIdentifier       = ''
    FastStartFailoverTarget         = ''
    PreferredObserverHosts          = ''
    LogShipping                     = 'ON'
    RedoRoutes                      = ''
    LogXptMode                      = 'SYNC'　<============== SYNCになっている
    DelayMins                       = '0'
    Binding                         = 'optional'
省略
```



Osaka側

```
DGMGRL> SHOW DATABASE VERBOSE tokyodb_kix12q;

Database - tokyodb_kix12q

  Role:               PHYSICAL STANDBY
  Intended State:     APPLY-ON
  Transport Lag:      0 seconds (computed 1 second ago)
  Apply Lag:          0 seconds (computed 1 second ago)
  Average Apply Rate: 2.00 KByte/s
  Active Apply Rate:  574.00 KByte/s
  Maximum Apply Rate: 580.00 KByte/s
  Real Time Query:    OFF
  Instance(s):
    tokyodb

  Properties:
    DGConnectIdentifier             = 'tokyodb_kix12q'
    ObserverConnectIdentifier       = ''
    FastStartFailoverTarget         = ''
    PreferredObserverHosts          = ''
    LogShipping                     = 'ON'
    RedoRoutes                      = ''
    LogXptMode                      = 'SYNC'        <============== SYNCになっている
省略
```



# スイッチオーバーのテスト

DGMGRL(Data Guard Brokerのコマンド・ユーティリティ)からスイッチオーバーの操作が出来ますが、OCI のコンソール画面上からも実行が可能です。
Switchover ボタンをクリックします

![1593092629310.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/fcb05a0c-3894-9276-6641-44869ddf2ced.png)



Password

![1593092652770.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/d170683d-b73d-9fca-0221-437b40b51147.png)



Updating

![1593092683858.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/7dc88d92-635d-7a05-7275-ed0094bd063d.png)



約3分30秒ほど待つと、Tokyo と Osaka が入れ替わっています

```
DGMGRL> SHOW CONFIGURATION VERBOSE;

Configuration - tokyodb_nrt1m4_tokyodb_kix12q

  Protection Mode: MaxAvailability
  Members:
  tokyodb_kix12q - Primary database
    tokyodb_nrt1m4 - Physical standby database
```



Work Requests で開始と終了時刻が見えます

![1593092981588.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/3cf44dc9-cf57-517d-a361-32d5af2961ad.png)



# データの確認

フェールオーバーを実施したため、Osaka 側のテストデータを確認して、正常にスイッチオーバー出来たか見ます。Oracle ユーザーにスイッチします。

```
[opc@osakadb03 ~]$ sudo su - oracle
Last login: Thu Jun 25 13:51:09 UTC 2020
[oracle@osakadb03 ~]$
```



tnsnames 編集

```
vim $ORACLE_HOME/network/admin/tnsnames.ora
```



追記

```
pdbname=
(DESCRIPTION=
  (LOAD_BALANCE=off) 
  (ADDRESS=
    (PROTOCOL=tcp)  
    (HOST=172.16.0.6)  
    (PORT=1521)
  ) 
  (CONNECT_DATA=
    (SERVICE_NAME=pdb01.osakasubnet01.osakavcn.oraclevcn.com) 
    (FAILOVER_MODE=
      (TYPE=select) 
      (METHOD=basic)
    )
  )
)
```



PDB 接続

```
sqlplus sugi/Sug1_Passw0rd_dayo@pdbname
```



SELECT * 

```
SELECT * FROM EMP;
```


Result
Osaka 側でも正常にデータを確認できました。リージョン間の Data Guard 構成が正常に出来ました。

```
SQL> SELECT * FROM emp;

EMPNO      EMPNAME                                              GENDER_F
---------- -------------------------------------------------- ----------
1          2                                                           1
2          3                                                           1
3          2                                                           1
```







# 参考URL

https://qiita.com/sugimount/items/eb96a906ca71e2a2418e