OCI DBCS VM で Data Guard を有効化して、ロールベース・サービスを構成して PRIMARYロール に透過的に接続してみる。(Oracle Cloud Infrastructure)
Oracle Cloud Infrastructure(以下、OCI) の DBCS(VM) で Data Guard を有効化して、
ロールベース・サービスを構成して PRIMARYロール の DB に透過的に接続してみるやで。
彡(^)(^)
1. Data Guard の有効化 in OCI DBCS VM
OCI DBCS VM の Data Guard有効化 は マニュアル や下記記事の通りです。
基本Webコンソールでポチポチするだけ彡(゚)(゚)
仮想マシンDBシステムでOracle Data Guardを有効にするには
https://docs.oracle.com/ja-jp/iaas/Content/Database/Tasks/usingdataguard.htm
:
6. 「Data Guardアソシエーション」セクションで、「Data Guardの有効化」をクリックします。OCI DatabaseでのData Guardの作り方(VM)
https://qiita.com/fujid/items/e2a7186f1b5e74be9d78
しばらく待つと Data Guard が構成されるので、dgmgrlコマンドで様子を確認してみます。
[oracle@ayudbcs1 ~]$ dgmgrl : DGMGRL> CONNECT SYS/########@ayudbcs2.ayuprvsubnet2.ayuvcn1.oraclevcn.com:1521/ayucdb1_nrt18j.ayuprvsubnet2.ayuvcn1.oraclevcn.com DGMGRL> SHOW CONFIGURATION; Configuration - ayucdb1_nrt1fg_ayucdb1_nrt18j Protection Mode: MaxPerformance Members: ayucdb1_nrt1fg - Primary database ayucdb1_nrt18j - Physical standby database Fast-Start Failover: Disabled Configuration Status: SUCCESS (status updated 14 second ago) DGMGRL>
無事 Data Guard が有効化されてますやね彡(^)(^)
この環境では DB #1 が ayucdb1_nrt1fg、DB #2 が ayucdb1_nrt18j になります。
2. ロールベース・サービスの登録
srvctlコマンドでロールベース・サービスを (GI = Grid Infrastructure の) Clusterware に
登録します。DB #1(Primary), DB #2(Standby) のそれぞれで実行して、サービスを登録します。
Oracle Real Application Clusters 管理およびデプロイメント・ガイド 19c
A.9.103 srvctl add service
https://docs.oracle.com/cd/F19136_01/racad/server-control-utility-reference.html#GUID-EC1BA6D7-D538-4E11-9B31-C59389FDF93B
:
-role {PRIMARY | PHYSICAL_STANDBY | LOGICAL_STANDBY | SNAPSHOT_STANDBY}
Oracle Data Guard構成でのデータベースのロールを指定します。デフォルトはPRIMARYです。
:
コマンドは以下の通り、-roleパラメータがポイントで DB が PRIMARY の時だけ起動するサービス彡(゚)(゚)
# DB #1(Primary, ayucdb1_nrt1fg) srvctl add service -db ayucdb1_nrt1fg -service ayudbcs_primary2 -pdb ayupdb1 -role PRIMARY
# DB #2(Standby, ayucdb1_nrt18j) srvctl add service -db ayucdb1_nrt18j -service ayudbcs_primary2 -pdb ayupdb1 -role PRIMARY
DB #1(Primary, ayucdb1_nrt1fg) で登録したサービスを開始します。
# DB #1(Primary, ayucdb1_nrt1fg) srvctl start service -db ayucdb1_nrt1fg -service ayudbcs_primary2
DB #1 のリスナーに起動したサービスが登録されているのを確認します。
# DB #1(Primary, ayucdb1_nrt1fg) lsnrctl status LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 31-MAR-2021 04:50:37 : Service "ayudbcs_primary2.ayuprvsubnet2.ayuvcn1.oraclevcn.com" has 1 instance(s). Instance "ayucdb1", status READY, has 2 handler(s) for this service... :
ロールベース・サービスの注意事項として、ロールベース・サービスは Data Guard Broker と
GI(Grid Infrastructure, or Restart) が連携して制御されます。従って GI(or Restart) と Broker との併用が必須です。
Oracle Data Guard Broker 19c
5.6.1.2 データベース・サービスの構成要件
https://docs.oracle.com/cd/F19136_01/dgbkr/using-data-guard-broker-to-manage-switchovers-failovers.html#GUID-05918DD1-FB0F-435B-873B-A43BEC1C7638
3. ロールベース・サービスへの接続文字列構成(※接続時フェイルオーバーを有効化した書き方)
クライアントの tnsnames.ora を編集して、ロールベース・サービスへの接続文字列を構成します。
接続時フェイルオーバーで DB #1(Primary)側への接続を失敗した時に、
DB #2(旧Standby、接続時には新Primary) に接続をフェイルオーバーするように記述するのがポイント
彡(゚)(゚)
Oracle Database Net Servicesリファレンス 19c
6.8.2 FAILOVER
https://docs.oracle.com/cd/F19136_01/netrf/local-naming-parameters-in-tns-ora-file.html#GUID-4A20F0A2-EDCD-4006-9177-2EA4B12D656D
AYUDBCS_PRIMARY2=( DESCRIPTION_LIST= (LOAD_BALANCE=OFF)(FAILOVER=ON) ( DESCRIPTION= (CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=5)(RETRY_DELAY=3)(RETRY_COUNT=3)(ENABLE=BROKEN) (ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=ayudbcs1-scan.ayuprvsubnet2.ayuvcn1.oraclevcn.com)(PORT=1521)) ) (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ayudbcs_primary2.ayuprvsubnet2.ayuvcn1.oraclevcn.com)) ) ( DESCRIPTION= (CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=5)(RETRY_DELAY=3)(RETRY_COUNT=3)(ENABLE=BROKEN) (ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=ayudbcs2-scan.ayuprvsubnet2.ayuvcn1.oraclevcn.com)(PORT=1521)) ) (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ayudbcs_primary2.ayuprvsubnet2.ayuvcn1.oraclevcn.com)) ) )
上記の書き方だと、まず 1番目のDESCRIPTION(DB #1へのエントリ) に接続を試みて、
失敗すると 2番目のDESCRIPTION(DB #2へのエントリ)に接続を試みます。
4. ロールベース・サービスへの接続確認(DB #1 が PRIMARY)
まずはロールの確認、DB #1(ayucdb1_nrt1fg) が PRIMARYロール なのを確認します。
dgmgrl CONNECT SYS/########@ayudbcs2.ayuprvsubnet2.ayuvcn1.oraclevcn.com:1521/ayucdb1_nrt18j.ayuprvsubnet2.ayuvcn1.oraclevcn.com SHOW CONFIGURATION; Configuration - ayucdb1_nrt1fg_ayucdb1_nrt18j Protection Mode: MaxPerformance Members: ayucdb1_nrt1fg - Primary database ayucdb1_nrt18j - Physical standby database Fast-Start Failover: Disabled Configuration Status: SUCCESS (status updated 14 second ago)
DB #1 が Primary の状態で #3. の接続文字列でロールベース・サービスに接続します。
sqlplus /nolog CONNECT AYSHIBAT/########@AYUDBCS_PRIMARY2 SET LINESIZE 300; SET PAGESIZE 100; COLUMN HOST_NAME FORMAT A50; COLUMN MY_SERVICE FORMAT A80; SELECT NAME, DB_UNIQUE_NAME, DATABASE_ROLE, OPEN_MODE FROM V$DATABASE; SELECT INSTANCE_NAME, HOST_NAME FROM V$INSTANCE; SELECT SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS MY_SERVICE FROM DUAL; SHOW CON_NAME;
結果は以下の通り、DB #1(ayucdb1_nrt1fg) に接続できてますやね彡(^)(^)
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Mar 31 05:23:58 2021 : SQL> CONNECT AYSHIBAT/########@AYUDBCS_PRIMARY2 Connected. SQL> SET LINESIZE 300; SQL> SET PAGESIZE 100; SQL> COLUMN HOST_NAME FORMAT A50; SQL> COLUMN MY_SERVICE FORMAT A80; SQL> SELECT NAME, DB_UNIQUE_NAME, DATABASE_ROLE, OPEN_MODE FROM V$DATABASE; NAME DB_UNIQUE_NAME DATABASE_ROLE OPEN_MODE --------- ------------------------------ ---------------- -------------------- AYUCDB1 ayucdb1_nrt1fg PRIMARY READ WRITE SQL> SELECT INSTANCE_NAME, HOST_NAME FROM V$INSTANCE; INSTANCE_NAME HOST_NAME ---------------- -------------------------------------------------- ayucdb1 ayudbcs1 SQL> SELECT SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS MY_SERVICE FROM DUAL; MY_SERVICE -------------------------------------------------------------------------------- ayudbcs_primary2.ayuprvsubnet2.ayuvcn1.oraclevcn.com SQL> SHOW CON_NAME; CON_NAME ------------------------------ AYUPDB1 SQL>
5. スイッチオーバー(ロール変換)の実行 ※追記あり
※追記:OCI DBCS におけるスイッチオーバー、フェイルオーバーはWebコンソール または OCI CLI を
使うべきである、という指摘がありました。詳しくは # 8. を参照……。
dgmgrl の SWITCHOVERコマンド で DB #1(ayucdb1_nrt1fg) と DB #2(ayucdb1_nrt18j) のロールを入れ替えます。
Data Guard の手動スイッチは超面倒なんですが、dgmgrl のスイッチオーバーはコマンド一発で超らくちん彡(^)(^)
dgmgrl CONNECT SYS/########@ayudbcs2.ayuprvsubnet2.ayuvcn1.oraclevcn.com:1521/ayucdb1_nrt18j.ayuprvsubnet2.ayuvcn1.oraclevcn.com SWITCHOVER to ayucdb1_nrt18j; SHOW CONFIGURATION;
結果は以下の通り、きっちりロール(Primary, Standby)が入れ替わってますやね彡(^)(^)
[oracle@ayudbcs1 ~]$ dgmgrl DGMGRL for Linux: Release 19.0.0.0.0 - Production on Wed Mar 31 05:17:32 2021 : DGMGRL> CONNECT SYS/########@ayudbcs2.ayuprvsubnet2.ayuvcn1.oraclevcn.com:1521/ayucdb1_nrt18j.ayuprvsubnet2.ayuvcn1.oraclevcn.com Connected to "ayucdb1_nrt18j" Connected as SYSDBA. DGMGRL> SWITCHOVER to ayucdb1_nrt18j; Performing switchover NOW, please wait... New primary database "ayucdb1_nrt18j" is opening... Oracle Clusterware is restarting database "ayucdb1_nrt1fg" ... Connected to "ayucdb1_nrt1fg" Connected to "ayucdb1_nrt1fg" Switchover succeeded, new primary is "ayucdb1_nrt18j" DGMGRL> SHOW CONFIGURATION; Configuration - ayucdb1_nrt1fg_ayucdb1_nrt18j Protection Mode: MaxPerformance Members: ayucdb1_nrt18j - Primary database ayucdb1_nrt1fg - Physical standby database Fast-Start Failover: Disabled Configuration Status: SUCCESS (status updated 15 seconds ago)
6. ロールベース・サービスへの接続確認(DB #2 が PRIMARY)
DB #2 のリスナーに起動したサービスが登録されているのを確認します。
# DB #2(Primary, ayucdb1_nrt18j) lsnrctl status LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 31-MAR-2021 04:50:37 : Service "ayudbcs_primary2.ayuprvsubnet2.ayuvcn1.oraclevcn.com" has 1 instance(s). Instance "ayucdb1", status READY, has 2 handler(s) for this service... :
DB #2 が Primary の状態で #3. の接続文字列でロールベース・サービスに接続します。
sqlplus /nolog CONNECT AYSHIBAT/########@AYUDBCS_PRIMARY2 SET LINESIZE 300; SET PAGESIZE 100; COLUMN HOST_NAME FORMAT A50; COLUMN MY_SERVICE FORMAT A80; SELECT NAME, DB_UNIQUE_NAME, DATABASE_ROLE, OPEN_MODE FROM V$DATABASE; SELECT INSTANCE_NAME, HOST_NAME FROM V$INSTANCE; SELECT SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS MY_SERVICE FROM DUAL; SHOW CON_NAME;
結果は以下の通り、DB #2(ayucdb1_nrt18j) に接続できてますやね彡(^)(^)
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Mar 31 05:23:58 2021 : SQL> CONNECT AYSHIBAT/########@AYUDBCS_PRIMARY2 Connected. SQL> SET LINESIZE 300; SQL> SET PAGESIZE 100; SQL> COLUMN HOST_NAME FORMAT A50; SQL> COLUMN MY_SERVICE FORMAT A80; SQL> SELECT NAME, DB_UNIQUE_NAME, DATABASE_ROLE, OPEN_MODE FROM V$DATABASE; NAME DB_UNIQUE_NAME DATABASE_ROLE OPEN_MODE --------- ------------------------------ ---------------- -------------------- AYUCDB1 ayucdb1_nrt18j PRIMARY READ WRITE SQL> SELECT INSTANCE_NAME, HOST_NAME FROM V$INSTANCE; INSTANCE_NAME HOST_NAME ---------------- -------------------------------------------------- ayucdb1 ayudbcs2 SQL> SELECT SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS MY_SERVICE FROM DUAL; MY_SERVICE -------------------------------------------------------------------------------- ayudbcs_primary2.ayuprvsubnet2.ayuvcn1.oraclevcn.com SQL> SHOW CON_NAME; CON_NAME ------------------------------ AYUPDB1 SQL>
7. まとめ
ロールベース・サービス と 接続時フェイルオーバー の組み合わせで、クライアントの
接続文字列を変更せずに Data Guard の PRIMARYサイト に透過的に接続できる!
彡(^)(^)
これで仕込みは完了、本当にやりたかった事(AC)は次回以降に……彡(゚)(゚)
8. 追記:Webコンソール と OCI CLI による OCI DBCS の Data Guard ロール変換(スイッチオーバー/フェイルオーバー)
OCI DBCS においては Data Guard のスイッチオーバー や フェイルオーバー は Webコンソール や OCI CLI で
やるべきである、という指摘がありました。そうしないと画面の状態と実際の DB の状態が異なってしまうそうな。
なるぺそ彡(゚)(゚)
Oracle Data Guardの使用
https://docs.oracle.com/ja-jp/iaas/Content/Database/Tasks/usingdataguard.htm
:
データベースのスイッチオーバーを実行するには
:
5. スイッチオーバーを実行するData Guardアソシエーションについて、
「アクション」アイコン(3つのドット)をクリックし、「スイッチオーバー」をクリックします。
:
データベースのフェイルオーバーを実行するには
:
5. フェイルオーバーを実行するData Guardアソシエーションについて、「フェイルオーバー」をクリックします。
:
Docs >> db >> data-guard-association >> switchover
https://docs.oracle.com/en-us/iaas/tools/oci-cli/2.22.1/oci_cli_docs/cmdref/db/data-guard-association/switchover.html
Usage
oci db data-guard-association switchover [OPTIONS]
:
Docs >> db >> data-guard-association >> failover
https://docs.oracle.com/en-us/iaas/tools/oci-cli/2.22.1/oci_cli_docs/cmdref/db/data-guard-association/failover.html
Usage
oci db data-guard-association failover [OPTIONS]
皆さま、お気を付けくださいませ。(`・ω・)ゞ