LoginSignup
2

More than 3 years have passed since last update.

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

Posted at

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

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
2