Active Data Guard環境のスタンバイ・インスタンスは基本的には読み込み専用です。しかし一時テーブルに対する書き込みを行うことができます。この記事ではスタンバイ・インスタンスで一時テーブルを作成し、書き込み処理ができる条件を確認します。
Active Data Guard 環境での操作
GLOBAL TEMPORARY TABLEはActive Data Guardスタンバイ・インスタンスで作成、削除ができます。
SQL> SELECT DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;
DATABASE_ROLE OPEN_MODE
---------------- --------------------
PHYSICAL STANDBY READ ONLY WITH APPLY
SQL> CREATE GLOBAL TEMPORARY TABLE gtemp1(c1 NUMBER, c2 VARCHAR2(10));
表が作成されました。
SQL> DROP TABLE gtemp1;
表が削除されました。
PRIVATE TEMPORARY TABLEもActive Data Guardスタンバイ・インスタンスで作成、削除できます。
SQL> CREATE PRIVATE TEMPORARY TABLE ora$ptt_temp1(c1 NUMBER, c2 VARCHAR2(10));
表が作成されました。
SQL> DROP TABLE ora$ptt_temp1;
表が削除されました。
しかしリアルタイム適用を停止するとPRIVATE TEMPORARY TABLEのみ作成できます。
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> CREATE GLOBAL TEMPORARY TABLE gtemp1(c1 NUMBER, c2 VARCHAR2(10));
CREATE GLOBAL TEMPORARY TABLE gtemp1(c1 NUMBER, c2 VARCHAR2(10))
*
行1でエラーが発生しました。:
ORA-16000:
データベースまたはプラガブル・データベースは読取り専用アクセスでオープンされてい
ます
SQL> CREATE PRIVATE TEMPORARY TABLE ora$ptt_temp1 (c1 NUMBER, c2 VARCHAR2(10));
表が作成されました。
DML Redirectの設定が有効な場合
DML Redirectが有効な場合でもGLOBAL TEMPORARY TABLEは作成、削除できます。テーブルに対する更新DMLはスタンバイ・インスタンス上で実行されます。
SQL> ALTER SESSION ENABLE ADG_REDIRECT_DML;
セッションが変更されました。
SQL> CREATE GLOBAL TEMPORARY TABLE gtemp1(c1 NUMBER, c2 VARCHAR(10));
表が作成されました。
SQL> INSERT INTO gtemp1 SELECT LEVEL c1, 'data1' c2 FROM DUAL CONNECT BY LEVEL <=100;
100行が作成されました。
SQL> COMMIT;
コミットが完了しました。
SQL> DROP TABLE gtemp1;
表が削除されました。
一方でPRIVATE TEMPORARY TABLEの作成、削除は実行できますが、テーブルに対する更新DMLはプライマリ・インスタンスにリダイレクトされるため ORA-00942 エラーになります(プライマリ・インスタンスにはテーブルが存在しないので)。
SQL> CREATE PRIVATE TEMPORARY TABLE ora$ptt_temp1 (c1 NUMBER, c2 VARCHAR2(10));
表が作成されました。
SQL> INSERT INTO ora$ptt_temp1 SELECT LEVEL c1, 'data1' c2 FROM DUAL CONNECT BY LEVEL <= 100;
INSERT INTO ora$ptt_temp1 SELECT LEVEL c1, 'data1' c2 FROM DUAL CONNECT BY LEVEL <= 100
*
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。 ORA-02063:
先行のエラー・メッセージを参照してくださいline(ADGREDIRECT)。
SQL> DROP TABLE ora$ptt_temp1;
表が削除されました。
プライマリ・インスタンスが停止している場合
GLOBAL TEMPORARY TABLEの作成や削除はプライマリ・インスタンスが稼働中の場合に限り成功します。
以下の例はプライマリ・インスタンスを停止した状態でGLOBAL TEMPORARY TABLEを作成しています。
SQL> CREATE GLOBAL TEMPORARY TABLE gtemp1(c1 NUMBER, c2 VARCHAR2(10));
CREATE GLOBAL TEMPORARY TABLE gtemp1(c1 NUMBER, c2 VARCHAR2(10))
*
行1でエラーが発生しました。:
ORA-03150: データベース・リンクの通信チャネルでend-of-fileが検出されました ORA-02063:
先行のエラー・メッセージを参照してくださいline(ADGREDIRECT)。
ただし既存のGLOBAL TEMPORARY TABLEに対する更新はエラーになりません。
SQL> INSERT INTO gtemp2 SELECT LEVEL c1, 'data1' c2 FROM DUAL CONNECT BY LEVEL <= 100;
100行が作成されました。
SQL> COMMIT;
コミットが完了しました。