Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

昨日までに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.
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした