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

Active Data Guard PL/SQL Redirectを試す(Oracle Database 19c)

More than 1 year has passed since last update.

昨日はActive Data Guard環境で、更新系DMLをプライマリ・インスタンスにリダイレクトして実行する機能について検証しました。この記事では、DMLと同様にPL/SQLブロックをリダイレクトする機能について検証を行いました。

マニュアルOracle Data Guard Concepts and Administration には以下のように記述されています。

10.2.2.2 Running Top-level PL/SQL Operations on Active Data Guard Standby Databases
PL/SQL blocks that you run on Active Data Guard standby databases can be redirected to and run on the primary database, if they do not contain bind variables.

To redirect PL/SQL operations that are run on a standby to the primary, configure automatic redirection using the following command on the standby database:

ALTER SESSION ENABLE ADG_REDIRECT_PLSQL;
You can configure automatic redirection for PL/SQL operations only at the session level.

これを読むとトップ・レベルのPL/SQL操作は、ALTER SESSION ENABLE ADG_REDIRECT_PLSQL文でリダイレクトできるように読めます。先日検証を行った ALTER SESSION ENABLE ADG_REDIRECT_DMLと何が異なるのかを確認します。

SQL> ALTER SESSION ENABLE ADG_REDIRECT_DML;

Session altered.

SQL> BEGIN
  2    INSERT INTO data1 VALUES (100, 'standby1');
  3  END;
  4  /

PL/SQL procedure successfully completed.

単純なPL/SQLブロックの実行では、ADG_REDIRECT_DMLでも動作するようです。次にプライマリ・インスタンスで、データを更新するPROCEDUREを作成してスタンバイ・インスタンスで実行してみました。

  • プライマリ・インスタンス
SQL> CREATE OR REPLACE PROCEDURE insdata1(p1 NUMBER, p2 NUMBER, p3 VARCHAR2) AS
BEGIN
   IF p1 = 10 THEN
       INSERT INTO data1 VALUES (p2, p3);
   END IF;
END;
/

Procedure created.
  • スタンバイ・インスタンス
SQL> ALTER SESSION ENABLE ADG_REDIRECT_DML;

Session altered.

SQL> EXEC insdata1(10, 200, 'standby2');

PL/SQL procedure successfully completed.

SQL> SELECT * FROM data1;

        C1 C2
---------- ----------
       100 standby1
        20 standby2

ストアド・プロシージャの実行でもALTER SESSION ENABLE ADG_REDIRECT_DML文のみで実行できました。次に、EXECUTE IMMEDIATE文を実行してみました。

SQL> ALTER SESSION ENABLE ADG_REDIRECT_DML;

Session altered.

SQL> BEGIN
  2    EXECUTE IMMEDIATE 'DROP TABLE data1';
  3  END;
  4  /
BEGIN
*
ERROR at line 1:
ORA-16397: statement redirection from Oracle Active Data Guard standby database
to primary database failed
ORA-06512: at line 2

ここで初めてリダイレクト・エラー「ORA-16397」が発生しました。ALTER SESSION ENABLE ADG_REDIRECT_PLSQL文を実行して再実行します。

SQL> ALTER SESSION ENABLE ADG_REDIRECT_PLSQL;

Session altered.

SQL> BEGIN
  2    EXECUTE IMMEDIATE 'DROP TABLE data1';
  3  END;
  4  /

PL/SQL procedure successfully completed.

上記のように、EXECUTE IMMEDIATE文の実行にはALTER SESSION ENABLE ADG_REDIRECT_PLSQL文の実行が必要でした。PL/SQLブロックの操作と、ALTER SESSION文の関係をもう少し詳しくマニュアル化して欲しいと思います。

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
ユーザーは見つかりませんでした