昨日までにActive Data Guard環境でDMLやPL/SQLブロックのリダイレクト機能を検証しましたが、Data Guardスタンバイ・インスタンス上で実行できる操作について簡単に検証しました。
プライマリ・インスタンスからの受信したREDO情報を適用した状態のスタンバイ・インスタンスは、MOUNTステータスになっているか、Read-Only状態でOPENステータスになっています。
SQL> SELECT STATUS FROM V$INSTANCE;
STATUS
------------
OPEN
SQL> SELECT DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;
DATABASE_ROLE OPEN_MODE
---------------- --------------------
PHYSICAL STANDBY READ ONLY WITH APPLY
上記状態のスタンバイ・インスタンスで、実行可能なSQL文をいくつか確認します。
ALTER DATABASE
プライマリ・インスタンス上で実行されたALTER DATABASE FORCE LOGGING文や、ALTER DATABASE FLASHBACK ON文は、スタンバイ・インスタンスに伝播しません。このため、Data Guard全体で同一性を保つためにはスタンバイ・インスタンス上でも再実行する必要があります。
- プライマリ・インスタンス上で実行
SQL> ALTER DATABASE FLASHBACK ON;
Database altered.
- スタンバイ・インスタンス上で実行
スタンバイ・インスタンスではFLASHBACK設定が有効になっていないことがわかります。
SQL> SELECT FLASHBACK_ON FROM V$DATABASE;
FLASHBACK_ON
------------------
NO
SQL> ALTER DATABASE FLASHBACK ON;
Database altered.
ALTER DATABASE FORCE LOGGING文も同じようにプライマリ・インスタンスとスタンバイ・インスタンス上では独立した設定が可能です。
- プライマリ・インスタンス上で実行
SQL> ALTER DATABASE FORCE LOGGING;
Database altered.
- スタンバイ・インスタンス上で実行
SQL> SELECT FORCE_LOGGING FROM V$DATABASE;
FORCE_LOGGING
---------------------------------------
NO
SQL> ALTER DATABASE FORCE LOGGING;
Database altered.
CREATE GLOBAL TEMPORARY TABLE
Oracle Database 18cからは、スタンバイ・インスタンス上でGLOBAL TEMPORARY TABLEの作成もできるようになっています。スタンバイ・インスタンス上で実行されたCREATE GLOBAL TEMPORARY TABLE文は、プライマリ・インスタンスに伝播して実行されます。この機能がOracle Database 19cではDML Redirectにつながったのではないかと思っています。特にこの機能のための設定は不要です。テーブルの作成だけでなく、データの格納やテーブルの削除も行うことができます。
SQL> CREATE GLOBAL TEMPORARY TABLE temp1(c1 NUMBER, c2 VARCHAR2(10)) ON COMMIT PRESERVE ROWS;
Table created.
SQL> INSERT INTO temp1 VALUES (100, 'data1');
1 row created.
SQL> COMMIT;
Commit complete.
SQL> SELECT * FROM temp1;
C1 C2
---------- ----------
100 data1
SQL> DROP TABLE temp1;
Table dropped.
スタンバイ・インスタンスで作成したテーブルはプライマリ・インスタンスでも確認できます。
SQL> SELECT TABLE_NAME, TEMPORARY FROM USER_TABLES WHERE TABLE_NAME='TEMP1';
TABLE_NAME T
------------------------------ -
TEMP1 Y
CREATE PRIVATE TEMPORARY TABLE
PRIVATE TEMPORARY TABLEはOracle Database 18cの新機能で、セッション実行中のみ有効なテーブルです。このテーブルはセッション間のみ有効なので、プライマリ・インスタンスには伝播しません。
SQL> CREATE PRIVATE TEMPORARY TABLE ora$ptt_temp1(c1 NUMBER, c2 VARCHAR2(10)) ON COMMIT PRESERVE DEFINITION;
Table created.
SQL> INSERT INTO ora$ptt_temp1 VALUES (100, 'temp1');
1 row created.
SQL> COMMIT;
Commit complete.
SQL> DROP TABLE ora$ptt_temp1;
Table dropped.