Oracle Database Active Data Guardはプライマリ・インスタンスからのREDOを適用しつつ、スタンバイ・インスタンスをREAD ONLY状態で稼働するオプションです。ここではスタンバイ・インスタンスでシーケンス操作を実行します。
初期状態
プライマリの状態
プライマリ・インスタンスはオープン状態です、シーケンスを作成し、キャッシュ20を指定しています。
SQL> SELECT DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;
DATABASE_ROLE OPEN_MODE
---------------- --------------------
PRIMARY READ WRITE
SQL> CREATE SEQUENCE seq01 CACHE 20;
順序が作成されました。
スタンバイの状態
スタンバイ・インスタンスはREDOを適用しつつ、READ ONLYモードでオープンしています。
SQL> SELECT DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;
DATABASE_ROLE OPEN_MODE
---------------- --------------------
PHYSICAL STANDBY READ ONLY WITH APPLY
シーケンスの操作
スタンバイで操作
スタンバイ・インスタンスでシーケンスの操作を行います。正常にシーケンス値が取得できます。
SQL> SELECT seq01.NEXTVAL FROM DUAL;
NEXTVAL
----------
1
プライマリで操作
次にプライマリ・インスタンスでシーケンス値を取得します。キャッシュ分を加えた値が取得されます。このことからActive Data Guard環境ではプライマリ・インスタンスとスタンバイ・インスタンス間でシーケンス値の重複を防ぐ動作になっていることがわかります。シーケンスのキャッシュを使い切るタイミングでプライマリ・インスタンスのログオン・トリガー(SYSユーザ)が動作することが確認できるため、スタンバイ・インスタンスからプライマリ・インスタンスへ接続が発生し、シーケンスの更新情報を伝えていると思われます。マニュアル に記載された動作です。
SQL> SELECT seq01.NEXTVAL FROM DUAL;
NEXTVAL
----------
21
再度スタンバイで操作
再度スタンバイ・インスタンスでシーケンス値を何度か取得します。プライマリ・インスタンスで、シーケンス値21~40が予約されているため、シーケンス値20の次は41になっています。
SQL> SELECT seq01.NEXTVAL FROM DUAL;
NEXTVAL
----------
2
...
SQL> SELECT seq01.NEXTVAL FROM DUAL;
NEXTVAL
----------
20
SQL> SELECT seq01.NEXTVAL FROM DUAL;
NEXTVAL
----------
41
Active DataGuardを解除
リアルタイム適用を停止して再度実行してみます。Active Data Guardを停止すると、スタンバイ・インスタンスはオープンのままですが、シーケンスの取得は失敗することがわかります。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
データベースが変更されました。
SQL> SELECT DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;
DATABASE_ROLE OPEN_MODE
---------------- --------------------
PHYSICAL STANDBY READ ONLY
SQL> SELECT seq01.NEXTVAL FROM DUAL;
SELECT seq01.NEXTVAL FROM DUAL
*
行1でエラーが発生しました。:
ORA-02289: 順序が存在しません。