0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Active Data Guardスタンバイ・インスタンスで一時テーブル操作を試す(Oracle Database 19c)

Last updated at Posted at 2021-04-28

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;

コミットが完了しました。
0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?