Oracle Cloud: Exadata Cloud Service X8M を Cross-Region Data Guard構成してみてみた

Oracle Data Guard は、エンタープライズ データの高可用性、データ保護、および災害復旧を保証します。
計画的または計画外の停止のために本番データベースが使用できなくなった場合、スタンバイ・データベースをプライマリ・ロールに切り替えて、ダウンタイムを最小限に抑えることができます。
また、Oracle Data Guard を使用すると、管理者はオプションで、リソースを大量に消費するDWHレポート処理や検証作業をスタンバイ システムにオフロードすることで、本番データベースのパフォーマンスを向上させることができます。
ということで、前回作成した Exadata Cloud Service X8MをData Guard構成してみてみます。

# ■ 構成
![DG構成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/41382b35-26fb-27e5-17cc-8ca184301746.jpeg)

## ● 要件
Peer Database(Primary と Standby)は以下のような条件があります。
　- 両方ともExadataシステム・シェイプ
　- 同一コンパートメント内
　- 同一Database Version
　- 同一VersionのExadataクラウド・ツール(dbaastools)

その他 Data Guard構成のため情報をドキュメントを確認して設計します。
・参考: [Exadata Cloud ServiceでのOracle Data Guardの使用](https://docs.oracle.com/ja-jp/iaas/Content/Database/Tasks/exausingdataguard.htm)

## ● 事前準備
TokyoリージョンとOsakaリージョンへExaCSを構築し、Primary側に Databaseを作成し、Standby側は Database_HOMEを作成し、Remote Peeringで 双方向Oracle＊NET通信できるようにしておきます。
・[Oracle Cloud：リージョン間を Remote VCN Peering してみてみた](https://qiita.com/shirok/items/192674aa6e903ea6694a)
・[Oracle Cloud: Exadata Cloud Service X8M を作成してみてみた](https://qiita.com/shirok/items/7dbef5bceeec9035c391)
・[Network Setup for Exadata Cloud Service Instances](https://docs.oracle.com/en-us/iaas/Content/Database/Tasks/exanetwork.htm)



# ■ Data Guard設定
Tokyoリージョンで作成したDB01データベースをプライマリDBとして、OsakaリージョンのExaCSへStandbyデータベースを作成

## ● Data Guard設定

**1) Dataabses画面**
[Enable Data Guard]をクリック
![01_DG_Standby作成01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/8b21a2fc-03b6-9faf-7fcc-ad12e8b90ffb.jpeg)



**2) Enable Data Guard画面**
以下項目を設定し、[Enable Data Guard]をクリック
```
	・Rejion: Standby側ExaCSのリージョンを設定
	・Availability domain: Standby側ExaCSのADを設定
	・Shape: Standby側ExaCSのShapeを選択
	・Data Guard peer resource type: VM Clusterを設定
	・Select a VM Cluster: Standby側ExaCSのVM Clusterを選択
	・Choose Database Home: PrimaryDBと同じVersionのDatabase Homeを選択
	・Database password: PrimaryDBと同じAdminパスワードを設定
```
![01_DG_Standby作成02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/74151639-2883-96e1-4a01-ce03e9eb7772.jpeg)

**3) Data Guard設定中**
![01_DG_Standby作成03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/1fd9e0a8-f29b-8f94-b58e-c00f76a80ef7.jpeg)


**4) Data Guard設定完了**
Stateが AvailableになればOK
![01_DG_Standby作成04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/3c6e0329-0efb-4305-9657-dd5efe9d4cf9.jpeg)



## ● Data Guard設定確認
ここからは、詳しくログ出力させながらコマンドで確認実行していきます。

### ・ DGMGRL接続
**1) 環境変数設定**
いずれかのNodeへOSログイン

```shell
[oracle@exa-tokyo-xft701 ~]$ . DB01.env
[oracle@exa-tokyo-xft701 ~]$ env | grep ORA
	ORACLE_UNQNAME=DB01_nrt1kx
	ORACLE_SID=DB011
	ORACLE_BASE=/u02/app/oracle
	ORACLE_HOSTNAME=exa-tokyo-xft701.sub04130423250.vcn.oraclevcn.com
	ORACLE_HOME=/u02/app/oracle/product/19.0.0.0/dbhome_1
```


**2) DGMGRL接続**
Oracle Data Guardコマンドライン・インタフェース(DGMGRL)を使用してData Guardを確認

```shell
[oracle@exa-tokyo-xft701 ~]$ dgmgrl /
	DGMGRL for Linux: Release 19.0.0.0.0 - Production on Thu May 20 18:31:01 2021
	Version 19.10.0.0.0

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

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


### ・ 現在の保護モード確認

```shell
DGMGRL> show configuration verbose

	Configuration - fsc

	Protection Mode: MaxPerformance
	Members:
	DB01_nrt1kx - Physical standby database
		DB01_kix1wh - Primary database

	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    = 'DB01_CFG'

	Fast-Start Failover:  Disabled

	Configuration Status:
	SUCCESS
```

### ・ Data Guardの設定確認:Tokyo Region の DB (DB01_nrt1kx)

PRIMARYであることを確認

```shell
DGMGRL> show database verbose DB01_nrt1kx

	Database - DB01_nrt1kx

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

	Properties:
		DGConnectIdentifier             = 'DB01_nrt1kx'
		ObserverConnectIdentifier       = ''
		FastStartFailoverTarget         = 'DB01_kix1wh'
		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(*)
		StaticConnectIdentifier(*)
		TopWaitEvents(*)
		SidName(*)
		(*) - Please check specific instance for the property value

	Log file locations(*):
		(*) - Check specific instance for log file locations.

	Database Status:
	SUCCESS

DGMGRL> validate database verbose DB01_nrt1kx

  Database Role:    Primary database

  Ready for Switchover:  Yes

  Flashback Database Status:
    DB01_nrt1kx:  On
    DB01_kix1wh:  On

  Capacity Information:
    Database     Instances        Threads
    DB01_nrt1kx  2                2

  Managed by Clusterware:
    DB01_nrt1kx:  YES

  Temporary Tablespace File Information:
    DB01_nrt1kx TEMP Files:  3

  Data file Online Move in Progress:
    DB01_nrt1kx:  No

  Transport-Related Information:
    Transport On:  Yes

  Log Files Cleared:
    DB01_nrt1kx Standby Redo Log Files:  Cleared

```

### ・ Data Guardの設定確認:Osaka Region の DB (DB01_kix1whx)
PHYSICAL STANDBYであることを確認

```shell
DGMGRL>  show database verbose DB01_kix1wh

	Database - DB01_kix1wh

	Role:               PHYSICAL STANDBY
	Intended State:     APPLY-ON
	Transport Lag:      0 seconds (computed 4 seconds ago)
	Apply Lag:          0 seconds (computed 4 seconds ago)
	Average Apply Rate: 6.00 KByte/s
	Active Apply Rate:  904.00 KByte/s
	Maximum Apply Rate: 3.11 MByte/s
	Real Time Query:    ON
	Instance(s):
		DB01_kix1wh1
		DB01_kix1wh2 (apply instance)

	Properties:
		DGConnectIdentifier             = 'DB01_kix1wh'
		ObserverConnectIdentifier       = ''
		FastStartFailoverTarget         = 'DB01_nrt1kx'
		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(*)
		StaticConnectIdentifier(*)
		TopWaitEvents(*)
		SidName(*)
		(*) - Please check specific instance for the property value

	Log file locations(*):
		(*) - Check specific instance for log file locations.

	Database Status:
	SUCCESS

DGMGRL> validate database verbose DB01_kix1wh

  Database Role:     Physical standby database
  Primary Database:  DB01_nrt1kx

  Ready for Switchover:  Yes
  Ready for Failover:    Yes (Primary Running)

  Flashback Database Status:
    DB01_nrt1kx:  On
    DB01_kix1wh:  On

  Capacity Information:
    Database     Instances        Threads
    DB01_nrt1kx  2                2
    DB01_kix1wh  2                2

  Managed by Clusterware:
    DB01_nrt1kx:  YES
    DB01_kix1wh:  YES

  Temporary Tablespace File Information:
    DB01_nrt1kx TEMP Files:  3
    DB01_kix1wh TEMP Files:  3

  Data file Online Move in Progress:
    DB01_nrt1kx:  No
    DB01_kix1wh:  No

  Standby Apply-Related Information:
    Apply State:      Running
    Apply Lag:        10 seconds (computed 0 seconds ago)
    Apply Delay:      0 minutes

  Transport-Related Information:
    Transport On:  Yes
    Gap Status:    No Gap
    Transport Lag:  0 seconds (computed 0 seconds ago)
    Transport Status:  Success

  Log Files Cleared:
    DB01_nrt1kx Standby Redo Log Files:  Cleared
    DB01_kix1wh Online Redo Log Files:   Cleared
    DB01_kix1wh Standby Redo Log Files:  Available

  Current Log File Groups Configuration:
    Thread #  Online Redo Log Groups  Standby Redo Log Groups Status
              (DB01_nrt1kx)           (DB01_kix1wh)
    1         4                       5                       Sufficient SRLs
    2         4                       5                       Sufficient SRLs

  Future Log File Groups Configuration:
    Thread #  Online Redo Log Groups  Standby Redo Log Groups Status
              (DB01_kix1wh)           (DB01_nrt1kx)
    1         4                       5                       Sufficient SRLs
    2         4                       5                       Sufficient SRLs

  Current Configuration Log File Sizes:
    Thread #   Smallest Online Redo      Smallest Standby Redo
               Log File Size             Log File Size
               (DB01_nrt1kx)             (DB01_kix1wh)
    1          4000 MBytes               4000 MBytes
    2          4000 MBytes               4000 MBytes

  Future Configuration Log File Sizes:
    Thread #   Smallest Online Redo      Smallest Standby Redo
               Log File Size             Log File Size
               (DB01_kix1wh)             (DB01_nrt1kx)
    1          4000 MBytes               4000 MBytes
    2          4000 MBytes               4000 MBytes

  Apply-Related Property Settings:
    Property                        DB01_nrt1kx Value        DB01_kix1wh Value
    DelayMins                       0                        0
    ApplyParallel                   AUTO                     AUTO
    ApplyInstances                  0                        0

  Transport-Related Property Settings:
    Property                        DB01_nrt1kx Value        DB01_kix1wh Value
    LogShipping                     ON                       ON
    LogXptMode                      ASYNC                    ASYNC
    Dependency                      <empty>                  <empty>
    DelayMins                       0                        0
    Binding                         optional                 optional
    MaxFailure                      0                        0
    ReopenSecs                      300                      300
    NetTimeout                      30                       30
    RedoCompression                 DISABLE                  DISABLE
```


# ■ Switchover実行(Primary:Tokyo -> Osaka)
メンテナンス用途など計画的にプライマリ・データベースとスタンバイ・データベースを切り替えます
スイッチオーバー中にデータが失われることはありません。

## ● Primary DB (Tokyo)側作業
**1) Data Guard Associations画面**
対象DBの右にあるドットをクリックし、[Switchover]をクリック
![01_swotchover01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/97176ed6-bf23-fbcb-e58e-404906452994.jpeg)



**2) Switchover Database画面**
admin パスワードを入力し、[OK]をクリック
![01_swotchover02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/ac77d347-fb2e-c1c7-c876-7a96d3b15276.jpeg)

**3) Switchover中**
![01_swotchover03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/996b7fb5-d9c8-2477-714a-202303256ecf.jpeg)

**4) Switchover完了**
![01_swotchover06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/693532f0-edbf-8f1b-8f1e-ca5c54f02a28.jpeg)



## ● Switch over確認


### ・ Tokyo Region の DB (DB01_nrt1kx)確認
PHYSICAL STANDBYへ切り替わっていることを確認

```shell
DGMGRL> show database  DB01_nrt1kx

	Database - DB01_nrt1kx

	Role:               PHYSICAL STANDBY
	Intended State:     APPLY-ON
	Transport Lag:      0 seconds (computed 2 seconds ago)
	Apply Lag:          0 seconds (computed 2 seconds ago)
	Average Apply Rate: 25.00 KByte/s
	Real Time Query:    ON
	Instance(s):
		DB011 (apply instance)
		DB012

	Database Status:
	SUCCESS
```



### ・ Osaka Region の DB (DB01_kix1wh)確認
PRIMARYへ切り替わっていることを確認

```shell
DGMGRL> show database  DB01_kix1wh

	Database - DB01_kix1wh

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

	Database Status:
	SUCCESS
```

# ■ Failover実行(Primary: Osaka -> Tokyo)
プライマリ・データベースの障害時に、スタンバイ・データベースをプライマリ・ロールに変更します。
フラッシュバック・データベースが使用可能になっている場合は、障害の原因が修正された後、Reinstateコマンドにより元どおり新しいプライマリ・データベースのスタンバイに戻すことができます。

## ● Standby DB (Tokyo)側作業


**1) Data Guard Associations画面**
対象DBの右にあるドットをクリックし、[Failover実行]をクリック
![01_Failover01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/085ef045-db53-dec5-2d4d-c48b56083793.jpeg)


**2) Failover Database画面**
admin パスワードを入力し、[OK]をクリック
![01_Failover02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/33300569-674c-2917-eee2-912907cb4230.jpeg)


**3) Failover中**
![01_Failover03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/53f796ef-d003-142b-6dc5-cea2f97fc0c2.jpeg)

**4) Failover完了**
![01_Failover06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/fb511ac1-2a62-8aad-2b30-11b090892c50.jpeg)


## ● Failover確認


### ・ Tokyo Region の DB (DB01_nrt1kx)確認
PRIMARYへ切り替わっていることを確認

```shell
DGMGRL> show database  DB01_nrt1kx

	Database - DB01_nrt1kx

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

	Database Status:
	SUCCESS
```

### ・ Osaka Region の DB (DB01_kix1wh)確認
PHYSICAL STANDBYへ切り替わり、Statusは DISABLED - ORA-16661であることを確認

```shell
DGMGRL> show database  DB01_kix1wh

	Database - DB01_kix1wh

	Role:               PHYSICAL STANDBY
	Intended State:     APPLY-ON
	Transport Lag:      (unknown)
	Apply Lag:          (unknown)
	Average Apply Rate: (unknown)
	Real Time Query:    OFF
	Instance(s):
		DB01_kix1wh1
		DB01_kix1wh2

	Database Status:
	DISABLED - ORA-16661: the standby database needs to be reinstated
```


# ■ Reinstate実行(障害が発生したプライマリ・データベース:Osakaの回復)
フェイルオーバーした障害プライマリ・データベースをスタンバイ・データベースとして復旧します

## ● Primary DB側作業

**1) Data Guard Associations画面**
対象DBの右にあるドットをクリックし、[Reinstate実行]をクリック
![04_Reinstate01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/b47d51f1-0b55-8f8f-e88c-a593a8e733d8.jpeg)


**2) Reinstate Database画面**
admin パスワードを入力し、[OK]をクリック
![04_Reinstate02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/3f1450bd-5ee8-891d-4569-cc40805d9da8.jpeg)

**3) Failover中**
![04_Reinstate03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/56328cbf-95c9-ea05-f84a-5eacf20bbe61.jpeg)

**4) Failover完了**
![04_Reinstate06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/e3cd11fa-1aa9-3310-95c1-e32415705e68.jpeg)


## ● Reinstate確認

### ・ Tokyo Region の DB (DB01_nrt1kx)確認
Statusは変わらず、PRIMARYロールであることを確認

```shell
DGMGRL> show database  DB01_nrt1kx

	Database - DB01_nrt1kx

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

	Database Status:
	SUCCESS
```


### ・ Osaka Region の DB (DB01_kix1wh)確認
Statusは DISABLED - ORA-16661から、SUCCESSへ変わっていることを確認

```shell
DGMGRL> show database  DB01_kix1wh


	Database - DB01_kix1wh

	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: 6.00 KByte/s
	Real Time Query:    ON
	Instance(s):
		DB01_kix1wh1 (apply instance)
		DB01_kix1wh2

	Database Status:
	SUCCESS	
```


# ■ Standby DB の REDO適用遅延(LAG)確認
V$DATAGUARD_STATSは、スタンバイ・データベース上での問合せに対して、Oracle Data Guardメトリックに関する情報を示します。

```shell
SQL> select name,value,time_computed,unit from v$dataguard_stats;

	NAME				 VALUE								  TIME_COMPUTED 		 UNIT
	-------------------------------- ---------------------------------------------------------------- ------------------------------ ------------------------------
	transport lag			 +00 00:00:00							  04/27/2021 18:49:03		 day(2) to second(0) interval
	apply lag			 +00 00:00:00							  04/27/2021 18:49:03		 day(2) to second(0) interval
	apply finish time		 +00 00:00:00.000						  04/27/2021 18:49:03		 day(2) to second(3) interval
	estimated startup time		 22								  04/27/2021 18:49:03		 second
```




# ■ 参考
　・ [Using Oracle Data Guard with Exadata Cloud Service](https://docs.oracle.com/en-us/iaas/Content/Database/Tasks/exausingdataguard.htm)
　・ [Introduction to Oracle Data Guard](https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/introduction-to-oracle-data-guard-concepts.html#GUID-5E73667D-4A56-445E-911F-1E99092DD8D7)
　・ [Oracle Data Guardコマンドライン・インタフェース・リファレンス](https://docs.oracle.com/cd/F19136_01/dgbkr/oracle-data-guard-broker-commands.html#GUID-FC402EF5-D633-4A46-BE8C-4EDC6A340886)
　・ [Exadata Cloud Service](https://docs.oracle.com/en-us/iaas/Content/Database/Concepts/exaoverview.htm)
　・ [Network Setup for Exadata Cloud Service Instances](https://docs.oracle.com/en-us/iaas/Content/Database/Tasks/exanetwork.htm)