26
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[謹賀新年] 世界中に配置した Oracle Active Data Guard から新年のご挨拶

Last updated at Posted at 2025-01-07

謹賀新年
世界各国の言葉で新年のご挨拶をお届けします!

Oracle Active Data Guard 19c では、スタンバイ・データベースで DML(INSERT/UPDATE/DELETE)が実行可能となり、真の Active Data Guard が実現しました。
これにより、世界各国に配置されたデータベースに現地の言葉を INSERT し、そのデータを 各Database で SELECT して表示することが可能です。

世界中の人々が自分の国の言葉で新年の挨拶を自国の Oracle データベースを通じて世界中の人々にお届けします。

■ 構成

構成.jpg
Active Data Guard で構成された各 Databaseへ、日本語、英語、ドイツ語、フランス語、アラビア語、ヒンディー語、タイ語、韓国語、ヘブライ語など、各地域の言語でデータを INSERT し、SELECT を通じて新年のご挨拶をお届けします(図示の通り)。

・ 各国語の新年のご挨拶
 - 日本語: あけまして おめでとうございます
 - 英語: Happy New Year
 - ヘブライ語: שנה טובה
 - ドイツ語: Ein gutes neues Jahr
 - フランス語: Bonne année
 - ヒンドゥ語: नया साल मुबारक हो
 - 韓国語: 새해 복 많이 받으세요
 - 中国語: 新年快乐
 - タイ語: สวัสดีปีใหม่ ค่ะ

■ Oracle Active Data Guard のREDO転送制御

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

構成.jpg

今回、各国でINSERTした現地の言葉が世界中を巡るようカスケード転送で複数の Database を直列に輪っかになるリング・トポロジー構成で地球一周するようREDO転送させます。

■ Oracle Active Data Guard 各国構成

前回構成した環境をします。
東京リージョンは TOKYO と SHIBUYA を Loacal Data Guard として作成し、TOKYOを始点、SHIBUYAを終点となるように構成して、TOKYO → PHOENIX → ASHBURN → FRANKFURT → MUMBAI → SEOUL → OSAKA → SHIBUYA(Tokyo Region) へ世界一周するよう直列に REDO転送するように Data Guardを構成します。

■ Active Data Guard の DML操作有効化

ACTIVE DATA GUARD DMLリダイレクトを有効化します。
これは Active Data Guard 限定の機能です。スタンバイ・データベースに対する DML 操作をプライマリ・データベースにリダイレクトできるようにし、ときおり書込みが発生するレポート・アプリケーションを Active Data Guard スタンバイ・データベースでアクティブに実行できるようにする機能です。
各Database毎にセッション単位、永続単位で個別設定できます。

● セッション単位

現在のセッションの DML 操作の自動リダイレクトを構成するには、次のコマンドを使用します。

SQL> ALTER SESSION ENABLE ADG_REDIRECT_DML;

● 永続単位

Active Data Guard環境ですべてのスタンバイ・セッションのDML操作の自動リダイレクトを構成するには、ADG_REDIRECT_DML初期化パラメータを TRUE に設定します。

SQL> ALTER SYSTEM SET ADG_REDIRECT_DML=true SCOPE=BOTH;

■ WORLD Table 作成

各国からの言葉をINSERTするためのテーブルを作成します。

CREATE TABLE WORLD
  (
  VAL VARCHAR2(50),
  REGION VARCHAR2(20)
  ) 
;

■ 新年の挨拶 INSERT

各リージョンの言語で SQL接続して、新年のご挨拶を INSERTします。

 ・各国語の「あけましておめでとう」はこちらを参照

● Tokyo Region (Primary)

[oracle@db-tokyo1 ~]$ export NLS_LANG=Japanese_Japan.AL32UTF8
[oracle@db-tokyo1 ~]$ sqlplus WORLD/<Password>@TOKYO 

	SQL*Plus: Release 19.0.0.0.0 - Production on 月 1月 2 13:04:34 2023
	Version 19.17.0.0.0

	Copyright (c) 1982, 2022, Oracle.  All rights reserved.

	Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
	Version 19.17.0.0.0
	に接続されました。

WORLD@TOKYO SQL> INSERT INTO world (val,region) SELECT 'あけまして おめでとうございます', DB_UNIQUE_NAME from v$database;

	1行が作成されました。

● Phoenix Region (Standby)

新年のご挨拶は、英語の 'Happy New Year' を INSERT します。

[oracle@db-phoenix1 ~]$ export NLS_LANG=American_America.AL32UTF8
[oracle@db-phoenix1 ~]$ sqlplus world/<Password>@PHOENIX 

	SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jan 2 13:07:06 2023
	Version 19.17.0.0.0

	Copyright (c) 1982, 2022, Oracle.  All rights reserved.

	Connected to:
	Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
	Version 19.17.0.0.0


WORLD@PHOENIX SQL> ALTER SESSION ENABLE ADG_REDIRECT_DML;

	Session altered.


WORLD@PHOENIX SQL> INSERT INTO world (val,region) SELECT 'Happy New Year', DB_UNIQUE_NAME from v$database;

	1 row created.

WORLD@PHOENIX SQL> commit;

	Commit complete.

● Ashburn Region (Standby)

PHOENIX Regionでは、英語で挨拶しましたので、ヘブライ語の 'שנה טובה' で新年のご挨拶をしてみてみます。

[oracle@db-ashburn1 ~]$ export NLS_LANG=American_America.AL32UTF8
[oracle@db-ashburn1 ~]$ sqlplus world/<Password>@ASHBURN 

	SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jan 2 13:11:04 2023
	Version 19.17.0.0.0

	Copyright (c) 1982, 2022, Oracle.  All rights reserved.

	Connected to:
	Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
	Version 19.17.0.0.0

WORLD@ASHBURN SQL> ALTER SESSION ENABLE ADG_REDIRECT_DML;

	Session altered.


WORLD@ASHBURN SQL> INSERT INTO world (val,region) SELECT 'שנה טובה', DB_UNIQUE_NAME from v$database; 

	1 row created.


WORLD@ASHBURN SQL> commit;

	Commit complete.

● Frankfurt Region (Standby)

新年のご挨拶は、ドイツ語の 'Ein gutes neues Jahr' を INSERT します。

[oracle@db-frankfurt1 ~]$ export NLS_LANG=German_Germany.AL32UTF8
[oracle@db-frankfurt1 ~]$ sqlplus WORLD/<Password>@FRANKFURT

	SQL*Plus: Release 19.0.0.0.0 - Production on Mo Jan 2 13:21:13 2023
	Version 19.17.0.0.0

	Copyright (c) 1982, 2022, Oracle.  All rights reserved.

	Verbunden mit:
	Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
	Version 19.17.0.0.0

WORLD@FRANKFURT SQL> ALTER SESSION ENABLE ADG_REDIRECT_DML;

	Session wurde geändert.

WORLD@FRANKFURT SQL> INSERT INTO world (val,region) SELECT 'Ein gutes neues Jahr', DB_UNIQUE_NAME from v$database;

	1 Zeile wurde erstellt.


WORLD@FRANKFURT SQL> commit;

	Transaktion mit COMMIT abgeschlossen.

● Mumbai Region (Standby)

新年のご挨拶は、ヒンドゥ語の 'नया साल मुबारक हो' を INSERT します。

[oracle@db-mumbai1 ~]$ export NLS_LANG=Hindi_India.AL32UTF8
[oracle@db-mumbai1 ~]$ sqlplus WORLD/<Password>@MUMBAI

	SQL*Plus: Release 19.0.0.0.0 - Production on सोम जनवरी 2 13:29:48 2023
	Version 19.17.0.0.0

	Copyright (c) 1982, 2022, Oracle.  All rights reserved.

	Connected to:
	Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
	Version 19.17.0.0.0


WORLD@MUMBAI SQL> ALTER SESSION ENABLE ADG_REDIRECT_DML;

	Session altered.


WORLD@MUMBAI SQL> INSERT INTO world (val,region) SELECT 'नया साल मुबारक हो', DB_UNIQUE_NAME from v$database;

	1 row created.

WORLD@MUMBAI SQL> commit;

	Commit complete.

● Seoul Region (Standby)

新年のご挨拶は、韓国語の '새해 복 많이 받으세요' を INSERT します。

[oracle@db-seoul1 ~]$ export NLS_LANG=Korean_Korea.AL32UTF8
[oracle@db-seoul1 ~]$ sqlplus world/<Password>@SEOUL 

	SQL*Plus: Release 19.0.0.0.0 - Production on 월 1월 2 13:40:57 2023
	Version 19.17.0.0.0

	Copyright (c) 1982, 2022, Oracle.  All rights reserved.

	다음에 접속됨:
	Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
	Version 19.17.0.0.0


WORLD@SEOUL SQL> ALTER SESSION ENABLE ADG_REDIRECT_DML;

	세션이 변경되었습니다.


WORLD@SEOUL SQL> INSERT INTO world (val,region) SELECT '새해 복 많이 받으세요', DB_UNIQUE_NAME from v$database;

	1 개의 행이 만들어졌습니다.

WORLD@SEOUL SQL> commit;

	커밋이 완료되었습니다.

● Osaka Region (Standby)

TOKYO Regionでは、日本語で挨拶しましたので、中国語の '新年快乐' で新年のご挨拶をしてみてみます。

[oracle@db-osaka1 ~]$ export NLS_LANG='SIMPLIFIED Chinese_China.AL32UTF8'
[oracle@db-osaka1 ~]$ sqlplus WORLD/<Password>@OSAKA

	SQL*Plus: Release 19.0.0.0.0 - Production on 星期一 1月 2 13:52:18 2023
	Version 19.17.0.0.0

	Copyright (c) 1982, 2022, Oracle.  All rights reserved.

	连接到:
	Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
	Version 19.17.0.0.0


WORLD@OSAKA SQL> ALTER SESSION ENABLE ADG_REDIRECT_DML;

	会话已更改。

WORLD@OSAKA SQL> INSERT INTO world (val,region) SELECT '新年快乐', DB_UNIQUE_NAME from v$database;

	已创建 1 行。

WORLD@OSAKA SQL> commit;

	提交完成。

● Shibuya Region (Standby)

TOKYO Regionでは、日本語で挨拶しましたので、タイ語の 'สวัสดีปีใหม่ ค่ะ' で新年のご挨拶をしてみてみます。

[oracle@db-shibuya1 ~]$ export NLS_LANG='Thai_Thailand.AL32UTF8'
[oracle@db-shibuya1 ~]$ sqlplus world/<Password>@SHIBUYA

	SQL*Plus: Release 19.0.0.0.0 - Production on จ. ม.ค. 2 13:59:51 2023
	Version 19.17.0.0.0

	Copyright (c) 1982, 2022, Oracle.  All rights reserved.

	เชื่อมต่อกับ:
	Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
	Version 19.17.0.0.0


WORLD@SHIBUYA SQL> ALTER SESSION ENABLE ADG_REDIRECT_DML;

	แก้ไขเซสชันแล้ว


WORLD@SHIBUYA SQL> INSERT INTO world (val,region) SELECT 'สวัสดีปีใหม่ ค่ะ', DB_UNIQUE_NAME from v$database;

	สร้างแถวแล้ว 1 แถว


WORLD@SHIBUYA SQL> commit;

	การคอมมิตเสร็จสมบูรณ์

■ 各国からの INSERT した新年のご挨拶を確認

Standby DatabaseでもDML操作が有効化され、各リージョン言語の言葉で新年の挨拶が届いていることを確認できます。

WORLD@TOKYO SQL> select * from WORLD;

	VAL						     REGION
	---------------------------- ---------------------- 
	あけまして おめでとうございます  CDB_TOKYO
	Happy New Year               CDB_PHOENIX
	שנה טובה                     CDB_ASHBURN
	Ein gutes neues Jahr	     CDB_FRANKFURT
	नया साल मुबारक हो               CDB_MUMBAI
	새해 복 많이 받으세요             CDB_SEOUL
	新年快乐                      CDB_OSAKA
	สวัสดีปีใหม่ ค่ะ                  CDB_SHIBUYA

■ 謹賀新年

新しい年が平和でありますように
新しい年が愛であふれますように
Happy New Year!

■ 参考

 ・ Active Data Guard
 ・ Oracle (Active) Data Guard 19c リアルタイム・データ保護と可用性
 ・ Oracle Active Data Guardでのリアルタイム問い合わせとDMLオフロード
 ・ Active Data Guardスタンバイ・データベースでのDML操作の実行
 ・ ADG_REDIRECT_DML
 ・ Enabling DML Redirection
 ・ NLS_LANGについて: Setting Up a Globalization Support Environment
 ・ グローバリゼーション・コード
 ・ データの同時実行性と整合性
 ・ データ整合性
 ・ トランザクション
 ・ REDOルーティング・ルール

■ 参考

● Oracle Databaseの データの同時実行性と整合性

シングル・ユーザーのデータベースでは、他のユーザーが同時に同じデータを変更することがないため、ユーザーは何も心配せずにデータを変更できます。ただし、マルチユーザー・データベースでは、複数のトランザクション内の文によって、同じデータが同時に更新される可能性があります。同時に実行される複数のトランザクションでは、意味のある一貫した結果を出すことが必要です。

マルチユーザー・データベースには次の機能が備わっている必要があります。

    ・ 複数のユーザーが同時にデータにアクセスできることの保証(データ同時実行性)
    ・ ユーザー自身のトランザクションや他のユーザーのトランザクションによる参照可能な変更を含め、各ユーザーにデータの一貫したビューが表示されることの保証(データ整合性)

トランザクションが同時に実行されるときの一貫したトランザクション動作を表すために、データベース調査者は、シリアライズ可能性と呼ばれるトランザクション分離モデルを定義しています。シリアライズ可能トランザクションは、他のユーザーがデータベースのデータを変更していないように認識される環境内で動作します。

一般に、この程度までのトランザクションの分離が望ましいとされますが、シリアライズ可能モードで数多くのアプリケーションを実行すると、アプリケーションのスループットがかなり低下する可能性があります。同時に実行される各トランザクションの完全な分離とは、あるトランザクションが問合せを実行している表に対して、他のトランザクションが挿入を実行できない状態を指します。つまり、現実には、トランザクションの完全な分離とパフォーマンスとの間の妥協点を考慮する必要があります。

Oracle Databaseでは、マルチバージョン一貫性モデルや様々なタイプのロックおよびトランザクションを使用することによって、データ整合性を維持します。これにより、データベースが複数の同時ユーザーに対してデータのビューを提示する場合、それぞれ特定の時点において一貫性があるビューになります。異なるバージョンのデータ・ブロックが同時に存在する場合があるため、トランザクションでは問合せに要求された時点でコミットされているデータのバージョンが読み取られ、ある特定の時点において一貫性のある結果が戻されます。

  • マルチバージョン読取り一貫性
    Oracle Databaseでは、マルチバージョン機能によって、データの複数のバージョンを同時にマテリアライズできます。Oracle Databaseでは、マルチバージョン読取り一貫性を維持します。
  • ロックのメカニズム
    一般に、マルチユーザー・データベースでは、なんらかのデータ・ロックを使用してデータの同時実行性、一貫性、および整合性の問題を解決しています。
  • ANSI/ISOトランザクション分離レベル
    ANSIとISO/IECの両方で採用されているSQL規格では、トランザクション分離レベルが4つ定義されています。これらのレベルは、トランザクション処理のスループットに与える影響の度合いが異なります。

Oracle Data Guard Brokerのプロパティ

REDOルーティング・ルール
例: グループ内の優先度でRedo転送ができない場合、次の優先度のDatabaseへ転送することができます。
ブローカ構成内に次の3つのメンバーが存在すると仮定します。

PRI (プライマリ・データベース)
SB1 (スタンバイ・データベース)
FS1 (遠隔同期インスタンス)

プライマリ・データベースPRIが、スタンバイ・データベースSB1で使用するREDOログを生成します。遠隔同期インスタンスFS1が存在するため、スタンバイ・データベースへのREDO転送パスには2つの可能性が考えられます。

(パス1) PRI —> FS1 —> SB1
(パス2) PRI —> SB1

(パス1)の方が(パス2)よりも望ましいと仮定します。この場合は、次のようにRedoRoutesプロパティを使用して表現できます。

PRI —RedoRoutes = (local : ( FS1 PRIORITY=1, SB1 PRIORITY=2 ) )
FS1 —RedoRoutes = ( PRI : SB1 )

PRIのRedoRoutesプロパティで指定したように、プライマリ(PRI)には2つの宛先(PRIORITY=1のFS1とPRIORITY=2のSB1)が設定されています。優先度の数字が小さいほど優先度が高くなるため、プライマリPRIは、まずFS1にREDOログを送信しようとします。

FS1が使用できる場合、プライマリはPRIORITY=1が設定されているFS1に送信します。FS1が使用できない場合、プライマリはPRIORITY=2が設定されているSB1に送信します。FS1が再度アクティブになると、PRIORITY 1はPRIORITY 2よりも優先度が高いので、プライマリはまたFS1に送信するようになります。
これを利用することで直列カスケード転送での転送エラー障害を回避することができます。

26
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?