Oracle Cloud: Data Guard Broker で複数スタンバイ・データベース構成の REDO転送を制御してみてみた


Oracle Data Guard Broker は、Oracle Data Guard構成の作成、メンテナンスおよび監視を自動化および集中化する分散管理フレームワークです。
RedoRoutesプロパティを使用してREDO転送を制御することができ、Standby Databaseが複数ある場合、次の様なREDO転送制御トポロジーが考えられるのでやってみてみます。


# ■ 構成イメージ
![構成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/0f24de5b-4f23-736c-8950-ea707c20117e.jpeg)

# ■ 事前作業
2つ以上の Standby Database構成は オンプレミス同様にコマンドで Data Guard作成する必要があります。次を参考に Oracle Exadata もしくは、Oracle Database Cloud Service を使用して複数スタンバイ構成を作成しておきます。
**・参考:**
　- [Oracle Exadata Database Service: 手動コマンドで Active Data Guard を構成](https://qiita.com/shirok/items/09c67ee4945df8df9792)
　- [Oracle Database Data Guard 複数スタンバイ構成](https://qiita.com/shirok/items/77d79645c459dafa1226)


# ■ 1:n Standby構成(デフォルト)
![構成1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/1704bcab-14be-2e8d-77b5-7a29c5fa3235.jpeg)
この構成は、デフォルトです。
Primary Database から、すべての Standby Database へ REDOを送信します。
Switchoverした CDB_TOKYO 以外の Primary Database も同様に Standby Database へ REDOを送信します。

## ● 設定例
RedoRoutesプロパティのデフォルト値はNULLです。プライマリ・データベースは、(LOCAL : ALL)として扱われます。 
```:dgmgrlコマンド
DGMGRL> EDIT DATABASE 'CDB_TOKYO' SET PROPERTY 'RedoRoutes' = '';
DGMGRL> EDIT DATABASE 'CDB_SHIBUYA' SET PROPERTY 'RedoRoutes' = '';
DGMGRL> EDIT DATABASE 'CDB_OSAKA' SET PROPERTY 'RedoRoutes' = '';
DGMGRL> EDIT DATABASE 'CDB_NAMBA' SET PROPERTY 'RedoRoutes' = '';
```



# ■ Primary 負荷考慮: Standby Cascade REDO転送構成
![構成2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/0612fe7c-4492-ab28-7186-9889ecc824d1.jpeg)
Primary負荷考慮構成です。
Primaryから全ての Standby Database に REDO を送信するかわりに、近接の Standby Database からその他の 遠隔の スタンバイ・データベースに REDOを転送するように リアルタイム・カスケードを構成することができます。
また、REDOデータの受信元のメンバーに障害が発生しても REDOデータを受信できるように、リモート代替宛先を設定することもできます。

## ● REDO送信イメージ
### 1) CDB_TOKYO が Primary の場合
近接CDB_SHIBUYA から他の Remote Standby へ REDO送信

```
・ CDB_TOKYO[Primary] 
	---(SYNC)---> CDB_SHIBUYA[Standby] 
		---(ASYNC)---> CDB_OSAKA[Cascade] 
		---(ASYNC)---> CDB_NAMBA[Cascade]
```

### 2) CDB_SHIBUYA が Primary の場合
近接CDB_TOKYO から他の Remote Standby へ REDO送信

```
・ CDB_SHIBUYA[Primary] 
	---(SYNC)---> CDB_TOKYO[Standby] 
		---(ASYNC)---> CDB_OSAKA[Cascade] 
		---(ASYNC)---> CDB_NAMBA[Cascade]
```


### 3) CDB_OSAKA が Primary の場合
近接CDB_NAMBA から他の Remote Standby へ REDO送信

```
・ CDB_OSAKA[Primary] 
	---(SYNC)---> CDB_NAMBA[Standby] 
		---(ASYNC)---> CDB_TOKYO[Cascade] 
		---(ASYNC)---> CDB_SHIBUYA[Cascade]
```

### 4) CDB_NAMBA が Primary の場合
近接CDB_OSAKA から他の Remote Standby へ REDO送信

```
・ CDB_NAMBA[Primary] 
	---(SYNC)---> CDB_OSAKA[Standby] 
		---(ASYNC)---> CDB_TOKYO[Cascade] 
		---(ASYNC)---> CDB_SHIBUYA[Cascade]
```

## ● DGMGRL RedoRoutes設定例
各リモートDatabase が Primary なった場合をまとめて設定すると次の様になります。
```:dgmgrlコマンド
DGMGRL> EDIT DATABASE 'CDB_TOKYO' SET PROPERTY 'RedoRoutes' = '(LOCAL : CDB_SHIBUYA ASYNC)(CDB_SHIBUYA : (CDB_OSAKA ASYNC, CDB_NAMBA ASYNC))';
DGMGRL> EDIT DATABASE 'CDB_SHIBUYA' SET PROPERTY 'RedoRoutes' = '(LOCAL : CDB_TOKYO ASYNC)(CDB_TOKYO : (CDB_OSAKA ASYNC, CDB_NAMBA ASYNC))';
DGMGRL> EDIT DATABASE 'CDB_OSAKA' SET PROPERTY 'RedoRoutes' = '(LOCAL : CDB_NAMBA ASYNC)(CDB_NAMBA : (CDB_TOKYO ASYNC, CDB_SHIBUYA ASYNC))';
DGMGRL> EDIT DATABASE 'CDB_NAMBA' SET PROPERTY 'RedoRoutes' = '(LOCAL : CDB_OSAKA ASYNC)(CDB_OSAKA : (CDB_TOKYO ASYNC, CDB_SHIBUYA ASYNC))';
```


## ● 動作確認
### 1) CDB_TOKYO が Primary の場合

```
DGMGRL> switchover to CDB_TOKYO
	Performing switchover NOW, please wait...
	New primary database "CDB_TOKYO" is opening...
	Oracle Clusterware is restarting database "CDB_NAMBA" ...
	Connected to "CDB_NAMBA"
	Connected to "CDB_NAMBA"
	Switchover succeeded, new primary is "cdb_tokyo"

DGMGRL> show configuration;

	Configuration - dg_config

	Protection Mode: MaxPerformance
	Members:
	CDB_TOKYO   - Primary database
		CDB_SHIBUYA - Physical standby database
		  CCDB_OSAKA   - Physical standby database (receiving current redo)
		  CCDB_NAMBA   - Physical standby database (receiving current redo)

	Fast-Start Failover:  Disabled

	Configuration Status:
	SUCCESS   (status updated 46 seconds ago)
```

### 2) CDB_SHIBUYA が Primary の場合
```
DGMGRL> switchover to CDB_SHIBUYA
	Performing switchover NOW, please wait...
	Operation requires a connection to database "CDB_SHIBUYA"
	Connecting ...
	Connected to "CDB_SHIBUYA"
	Connected as SYSDBA.
	New primary database "CDB_SHIBUYA" is opening...
	Oracle Clusterware is restarting database "CDB_TOKYO" ...
	Connected to "CDB_TOKYO"
	Connected to "CDB_TOKYO"
	Switchover succeeded, new primary is "cdb_shibuya"
	DGMGRL> show configuration;


DGMGRL> show configuration;

	Configuration - dg_config

	Protection Mode: MaxPerformance
	Members:
	CDB_SHIBUYA - Primary database
		CDB_TOKYO   - Physical standby database
		  CDB_OSAKA   - Physical standby database (receiving current redo)
		  CDB_NAMBA   - Physical standby database (receiving current redo)

	Fast-Start Failover:  Disabled

	Configuration Status:
	SUCCESS   (status updated 39 seconds ago)
```

### 3) CDB_OSAKA が Primary の場合
```
DGMGRL> switchover to CDB_OSAKA
	Performing switchover NOW, please wait...
	New primary database "CDB_OSAKA" is opening...
	Oracle Clusterware is restarting database "CDB_SHIBUYA" ...
	Connected to "CDB_SHIBUYA"
	Connected to "CDB_SHIBUYA"
	Switchover succeeded, new primary is "cdb_osaka"

DGMGRL> show configuration;

	Configuration - dg_config

	Protection Mode: MaxPerformance
	Members:
	CDB_OSAKA   - Primary database
		CDB_NAMBA   - Physical standby database
		  CDB_TOKYO   - Physical standby database (receiving current redo)
		  CDB_SHIBUYA - Physical standby database (receiving current redo)

	Fast-Start Failover:  Disabled

	Configuration Status:
	SUCCESS   (status updated 24 seconds ago)
```

### 4) CDB_NAMBA が Primary の場合
```
DGMGRL> switchover to CDB_NAMBA
	Performing switchover NOW, please wait...
	New primary database "CDB_NAMBA" is opening...
	Oracle Clusterware is restarting database "CDB_OSAKA" ...
	Connected to "CDB_OSAKA"
	Connected to "CDB_OSAKA"
	Switchover succeeded, new primary is "cdb_namba"

DGMGRL> show configuration;

	Configuration - dg_config

	Protection Mode: MaxPerformance
	Members:
	CDB_NAMBA   - Primary database
		CDB_OSAKA   - Physical standby database
		  CDB_TOKYO   - Physical standby database (receiving current redo)
		  CDB_SHIBUYA - Physical standby database (receiving current redo)

	Fast-Start Failover:  Disabled

	Configuration Status:
	SUCCESS   (status updated 57 seconds ago)
```







# ■ REDO転送トポロジー設計構成
Local Standby は Primaryとして使用せず、CDB_TOKYOとCDB_OSAKAのみPrimaryとなる構成を考えてみます。
![構成3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/800a8517-d43b-4aa8-c865-72583a0246dd.jpeg)



## ● REDO送信イメージ
### ・ CDB_TOKYO が Primaryの場合
近接CDB_SHIBUYA から他の Remote Standby へ REDO送信

```
・ CDB_TOKYO[Primary] 
	---(SYNC)---> CDB_SHIBUYA[Standby] 
	---(ASYNC)---> CDB_OSAKA[Standby] 
		---(ASYNC)---> CDB_NAMBA[Cascade]
```



### ・ CDB_OSAKA が Primaryの場合
近接CDB_NAMBA から他の Remote Standby へ REDO送信

```
・ CDB_OSAKA[Primary] 
	---(SYNC)---> CDB_NAMBA[Standby] 
	---(ASYNC)---> CDB_TOKYO[Standby] 
		---(ASYNC)---> CDB_SHIBUYA[Cascade]
```

## ● DGMGRL RedoRoutes設定例
各リモートDatabase が Primary なった場合、Pattern#1Bの代変宛先を考慮してまとめて設定すると次の様になります。
```:dgmgrlコマンド
DGMGRL> EDIT DATABASE 'CDB_TOKYO' SET PROPERTY 'RedoRoutes' = '(LOCAL : (CDB_SHIBUYA ASYNC, CDB_OSAKA ASYNC))(CDB_OSAKA : CDB_SHIBUYA ASYNC)';
DGMGRL> EDIT DATABASE 'CDB_OSAKA' SET PROPERTY 'RedoRoutes' = '(CDB_TOKYO : CDB_NAMBA ASYNC)(LOCAL : (CDB_NAMBA ASYNC, CDB_TOKYO ASYNC))';
```



## ● 動作確認
### 1) CDB_TOKYO が　Primary の場合

```
DGMGRL> switchover to CDB_TOKYO
	Performing switchover NOW, please wait...
	New primary database "CDB_TOKYO" is opening...
	Oracle Clusterware is restarting database "CDB_NAMBA" ...
	Connected to "CDB_NAMBA"
	Connected to "CDB_NAMBA"
	Switchover succeeded, new primary is "cdb_tokyo"

DGMGRL> show configuration

	Configuration - dg_config

	Protection Mode: MaxPerformance
	Members:
	CDB_TOKYO   - Primary database
		CDB_SHIBUYA - Physical standby database
		CDB_OSAKA   - Physical standby database
		  CDB_NAMBA   - Physical standby database (receiving current redo)

	Fast-Start Failover:  Disabled

	Configuration Status:
	SUCCESS   (status updated 7 seconds ago)
```



### 2) CDB_OSAKA が Primary の場合
```
DGMGRL> switchover to CDB_OSAKA
	Performing switchover NOW, please wait...
	Operation requires a connection to database "CDB_OSAKA"
	Connecting ...
	Connected to "CDB_OSAKA"
	Connected as SYSDBA.
	New primary database "CDB_OSAKA" is opening...
	Oracle Clusterware is restarting database "CDB_TOKYO" ...
	Connected to "CDB_TOKYO"
	Connected to "CDB_TOKYO"
	Switchover succeeded, new primary is "cdb_osaka"

DGMGRL> show configuration

	Configuration - dg_config

	Protection Mode: MaxPerformance
	Members:
	CDB_OSAKA   - Primary database
		CDB_NAMBA   - Physical standby database
		CDB_TOKYO   - Physical standby database
		  CDB_SHIBUYA - Physical standby database (receiving current redo)

	Fast-Start Failover:  Disabled

	Configuration Status:
	SUCCESS   (status updated 43 seconds ago)
```

# ■ その他: 優先順位制御
PRIORITY=n を設定することで、 PRIORITY=1 が設定されている Standby#1 が使用できない場合、プライマリはPRIORITY=2が設定されている Standby#2 に送信することができます。

端末メンバーがREDOデータの受信元のメンバーに障害が発生してもREDOデータを受信できるように、リモート代替宛先を設定することもできます。前述の例を使用すると、プライマリ・データベースとしてCDB_TOKYO を使用し、スタンバイ・データベースCDB_SHIBUYA に障害が発生したときにREDOデータを直接CDB_OSAKA に送信できます。PRIORITY属性を使用して、CDB_SHIBUYAの障害が解決された時点でCDB_OSAKA へのREDOの送信を再開できるように設定することもできます。 

```
DGMGRL> EDIT DATABASE 'CDB_TOKYO' SET PROPERTY 'RedoRoutes' = '(LOCAL : ( CDB_SIBUYA ASYNC PRIORITY=1, CDB_OSAKA ASYNC PRIORITY=2 ))';
DGMGRL> EDIT DATABASE 'CDB_SIBUYA' SET PROPERTY 'RedoRoutes' = '(CDB_OSAKA : Remote_Sales ASYNC)';
```
# ■ 参考
**● Data Guard**
・[Data Guard](https://www.oracle.com/jp/database/data-guard/#rc30p2)
・[Oracle Exadata Cloudを使用した ディザスタ・リカバリ](https://www.oracle.com/a/tech/docs/hybrid-data-guard-to-exaoci-update-gen2-exacc-exacs.pdf)
・[Hybrid Data Guard to Exadata Cloud Services](https://www.oracle.com/technetwork/database/availability/hybrid-data-guard-to-exaoci-5600751.pdf)
・[Solution Playbooks: Deploy a hybrid DR topology for an on-premises Oracle Exadata](https://docs.oracle.com/en/solutions/hybrid-dr-for-exadata/index.html#GUID-B9D75B4F-B5EE-4ECB-84AB-F0F6AC56A010)

**● Data Guard Broker**
・[マニュアル: Oracle Data Guard Broker ](https://docs.oracle.com/cd/F19136_01/dgbkr/oracle-data-guard-broker-concepts.html#GUID-723E5B73-A350-4B2E-AF3C-5EA4EFC83966)
・[Oracle Data Guardのベスト・プラクティス](https://docs.oracle.com/cd/F19136_01/haovw/oracle-data-guard-best-practices.html)

**● Exadata**
・[概要: Oracle Exadata Database Service](https://www.oracle.com/jp/engineered-systems/exadata/database-service/)
・[キュメント: Exadataシステム](https://docs.oracle.com/ja-jp/iaas/Content/Database/Concepts/troubleshooting_topic-Exadata_DB_Systems.htm)
・[キュメント: DBAASツール: dbaascliを使用したクラウド・ツール・ログの収集およびクラウド・ツールの ヘルス・チェックの実行](https://docs.oracle.com/ja-jp/iaas/Content/Database/References/dbaascli_topic-tooling_log_collection.htm)
・[Oracle Database Product Management](https://bit.ly/dbpm-youtube)

**● Private DNS**
・[キュメント: OCI Document:プライベートDNS](https://docs.oracle.com/ja-jp/iaas/Content/DNS/Tasks/privatedns.htm)
・[チュートリアル: Private DNS Implementation](https://www.ateam-oracle.com/post/private-dns-implementation)

**● Oracle Cloud：Maximum Availability Architecture (MAA)**
・[Oracle CloudのMAAベスト・プラクティス まとめ](https://www.oracle.com/jp/database/technologies/high-availability/oracle-cloud-maa.html)
・[Oracle WebLogic Server for Oracle Cloud Infrastructureの障害時リカバリ](https://www.oracle.com/jp/a/tech/docs/maa-wls-mp-dr-ja.pdf)
・[Oracle Cloud Infrastructure Marketplace上のSOA Suiteの障害時リカバリ](https://www.oracle.com/jp/a/tech/docs/maa-soamp-dr-ja.pdf)

**● Qiitaまとめ**
・ [DRGで東京リージョンを経由して、オンプレミスと 大阪リージョンを接続](https://qiita.com/shirok/items/90cff318816fbf2a802d)
・ [Oracle Exadata Cloud Infrastructure X9M作成](https://qiita.com/shirok/items/1f7a10d254849a9fdddb)
・[Oracle Cloud: Real Application Clusters（RAC）作成](https://qiita.com/shirok/items/ff7bb98a3b771edd1b5f)
・ [リージョン間を Remote VCN Peering接続](https://qiita.com/shirok/items/192674aa6e903ea6694a)
・ [Private DNSで PeeringしたVCNどうしホスト名解決する](https://qiita.com/shirok/items/4197e09dc2bfd7db82f3)
・ [クラウド・ツール dbaascliをバージョンアップ](https://qiita.com/shirok/items/9c5f4176b86536ff221e)