Posted at

Data Guard スタンバイ・インスタンスでできること

昨日までに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.