昨日は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文の関係をもう少し詳しくマニュアル化して欲しいと思います。