DBMS_LOGSTDBY
パッケージは、ロジカル・スタンバイ・データベース環境を構成および管理するためのサブプログラムを提供します。
関連項目: SQL適用およびロジカル・スタンバイ・データベースの詳細は、『Oracle Data Guard概要および管理』を参照してください。 |
この章では、次の項目について説明します。
概要
使用上の注意
この項では、DBMS_LOGSTDBY
パッケージの使用に関連する項目について説明します。
DBMS_LOGSTDBY
パッケージを使用して、SQL適用(ロジカル・スタンバイ・データベース)環境を管理できます。 DBMS_LOGSTDBY
パッケージのサブプログラムを使用すると、次の主な目的を実現できます。
たとえば、ロジカル・スタンバイ・データベースへのトランザクションの適用方法、使用する共有プールの大きさ、SQL適用での変更の調査および適用に使用するプロセスの数などを制御します。
適切なレベルのサプリメンタル・ロギングが有効になっていること、およびLogMinerディクショナリがロジカル・スタンバイ・データベースの作成に対して適切に構築されていることの確認
ロジカル・スタンバイ・データベース内の選択した表またはスキーマ全体に対する変更の適用をスキップする方法の提供、およびSQL適用で発生する例外の処理方法の指定
メンテナンスが必要なロジカル・スタンバイ・データベース内の表へのアクセス制御
プロトタイプのロールLOGSTDBY_ADMINISTRATOR
は、デフォルトではRESOURCE
権限およびDBMS_LOGSTDBY
に対するEXECUTE
権限を伴って作成されます。このロールを使用する場合は、ロールを付与されたユーザーがSQL適用の開始と停止、およびデータベース・ガードの有効化と無効化を制御できるように、このロールに対してALTER DATABASE
権限およびALTER SESSION
権限を付与することを検討してください。ロジカル・スタンバイ・データベースで管理タスクを実行する場合は、DBA権限を持つアカウントを使用することをお薦めします。
トランザクションのスキップに関連する6つのプロシージャ(SKIP
とUNSKIP
、SKIP_ERROR
とUNSKIP_ERROR
、SKIP_TRANSACTION
とUNSKIP_TRANSACTION
)を実行するには、それらのすべてでDBA
権限が必要です。これは、それらのプロシージャのスコープにワイルドカード・スキーマが含まれている場合があるためです。SKIP
プロシージャを指定する場合は、それらのプロシージャが動作するスキーマに対して適切な権限を持つ安全なアカウント(SYS
など)によってそれらのプロシージャが所有されるようにすることをお薦めします。
表73-1 DBMS_LOGSTDBYパッケージのサブプログラム
サブプログラム | 説明 |
---|---|
|
SQL適用を構成およびメンテナンスする様々なパラメータの値を設定します。 |
|
SQL適用を構成およびメンテナンスする様々なパラメータの値をデフォルトに戻します。 |
|
サプリメンタル・ロギングが正しく有効化されていることを確認し、LogMinerディクショナリを作成します。 |
|
プライマリ・データベース内の対応する表から、スタンバイ・データベース内に表を作成し、データを移入します。 |
|
このファンクションは、ロジカル・スタンバイ適用サーバー・プロセスのコンテキストでPL/SQLから実行された場合、 |
|
プライマリ・データベースに関連するSCNをロジカル・スタンバイ・データベースの対応するSCNにマップします。マップされたSCNは、本質的に保守的です。したがって、マップされたSCNを使用すると、ロジカル・スタンバイ・データベースをフラッシュバックして、プライマリ・データベースで実行されるフラッシュバック・データベース操作を補足できます。 |
|
フェイルオーバーの後で使用され、フェイルオーバー動作に関係しなかったローカルのロジカル・スタンバイ・データベースで新しいプライマリ・データベースより多くのREDOが処理されないようにし、一貫性を保証するために置換する必要があるアーカイブREDOログ・ファイル・セットをレポートします。 |
|
ロジカル・スタンバイ・データベースに適用済で、SQL適用で不要になったアーカイブREDOログ・ファイルを識別します。 |
フェイルオーバー操作に伴ってプライマリ・データベースに役割が変更されたデータベースで、フェイルオーバー・プロセス中にその役割の変更を処理できない場合、関連するメタデータ(LogMinerディクショナリを含む)をREDOストリームに記録します。 |
|
|
SQL適用で必要なメタデータ表を、ユーザー指定の表領域に移動します。デフォルトでは、メタデータ表は、 |
|
ロジカル・スタンバイ・データベースに適用しないデータベース操作を制御するルールを指定します。 |
|
エラー発生時に実行するアクションに関するルールを指定します。 |
|
ロジカル・スタンバイ・データベースに適用しないトランザクションを指定します。このプロシージャは注意して使用してください。特定のトランザクションを適用しないことによって、ロジカル・スタンバイ・データベースのデータが破損する場合があります。 |
|
|
|
|
|
|
このプロシージャを使用して、ロジカル・スタンバイ・データベース環境でSQL適用を構成および管理するパラメータの値を設定します。 PRESERVE_COMMIT_ORDER
を除くすべてのパラメータは、SQL適用を停止しなくても変更できます。
構文
DBMS_LOGSTDBY.APPLY_SET ( inname IN VARCHAR, value IN VARCHAR);
パラメータ
表73-2 APPLY_SETプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
変更の適用に使用する |
|
SQL適用が関連イベントの発生を記録する場所を制御します。次の値を取ります。
たとえば、SQL適用が このパラメータは、 |
|
このパラメータ設定が意味を持つのは、 |
|
アーカイブREDOログ・ファイルがロジカル・スタンバイ・データベースに適用された後、そのファイルを自動的に削除します。 |
|
|
|
SQL適用で読取りとREDOの適用に使用するプロセスの数。デフォルト値は9です。最大値は2048です。 |
|
SQL適用で使用するシステム・グローバル領域(SGA)の共有プールのMB数。 デフォルト値は、30MBまたは |
|
変更の準備に使用する |
|
選択したレベルに関係なく、同じ行に対する変更は、常にプライマリ・データベースで検出される順序と同じ順序で適用されます。詳細および推奨は「使用上の注意」を参照してください。 SQL適用の実行中は、このパラメータを変更できません。 |
|
ロジカル・スタンバイ・データベースに適用されたDDL文を
|
|
スキップしたDDL文を
|
|
スキップしたエラー(「
|
|
ロジカル・スタンバイ・データベースでサポートされない、プライマリ・データベースで実行中のトランザクションに関する情報を取得します。 このプロシージャは、情報をイベントとして |
SQL適用の実行中にパラメータを変更した場合、この変更は後で有効になります。 このような場合、パラメータの変更が有効になった時点で、DBA_LOGSTDBY_EVENTS
ビューに情報行が挿入されます。
また、RAC構成でSQL適用を実行している間にパラメータを変更する場合は、SQL適用を実行しているインスタンスに接続する必要があります。
例外
表73-3 APPLY_SETプロシージャの例外
例外 | 説明 |
---|---|
|
この操作を許可するにはロジカル・スタンバイ適用を停止する必要があります。 |
|
ロジカル・スタンバイ・オプションのリクエストが無効です。 |
|
ロジカル・スタンバイ・メタデータ操作は進行中です。 |
使用上の注意
パラメータの設定をデフォルトに戻すには、APPLY_UNSET
プロシージャを使用します。
SQL適用のチューニングおよび様々なパラメータの適切な値の設定については、『Oracle Data Guard概要および管理』を参照してください。
例
DBA_LOGSTDBY_EVENTS
ビューおよびアラート・ログにDDLを記録するには、次の文を発行します。
SQL> EXECUTE DBMS_LOGSTDBY.APPLY_SET('RECORD_APPLIED_DDL', TRUE);
APPLY_UNSET
プロシージャで変更したパラメータの値をデフォルトに戻すには、APPLY_SET
プロシージャを使用します。
構文
DBMS_LOGSTDBY.APPLY_UNSET ( inname IN VARCHAR);
パラメータ
APPLY_UNSET
プロシージャのパラメータ情報は、APPLY_SET
プロシージャに関する情報と同じです。 パラメータ情報の詳細は、表73-2を参照してください。
例外
表73-4 APPLY_UNSETプロシージャの例外
例外 | 説明 |
---|---|
|
この操作を許可するにはロジカル・スタンバイ適用を停止する必要があります。 |
|
ロジカル・スタンバイ・オプションのリクエストが無効です。 |
|
ロジカル・スタンバイ・メタデータ操作は進行中です。 |
使用上の注意
パラメータにデフォルト以外の値を指定するには、APPLY_SET
プロシージャを使用します。
例
適用したDDLがDBA_LOGSTDBY_EVENTS
ビューおよびアラート・ログに記録されるように以前に指定していた場合は、次の文を実行して、適用したDDL文に関するSQL適用の動作をデフォルトに戻すことができます。
SQL> EXECUTE DBMS_LOGSTDBY.APPLY_UNSET('RECORD_APPLIED_DDL');
このプロシージャをプライマリ・データベースで使用して、関連するメタデータ(LogMinerディクショナリ)情報をREDOログに記録します。このREDOログは、その後、SQL適用で使用されます。このプロシージャによって、必要に応じて、データベース全体でのプライマリ・キーおよび一意キーのサプリメンタル・ロギングが可能になります。
構文
DBMS_LOGSTDBY.BUILD;
使用上の注意
サプリメンタル・ログ情報には、ロジカル・スタンバイ・データベース内の変更行を一意に識別する、REDOログ内の追加情報が含まれています。また、ロジカル・スタンバイ・データベースへの変更を効率的に適用するための情報も含まれています。
LogMinerディクショナリ情報を使用すると、SQL適用でREDOログ内のデータを解析できます。
DBMS_LOGSTDBY.BUILD
は、作成する各ロジカル・スタンバイ・データベースに対して1回のみ実行する必要があります。 各RACインスタンスに対して使用する必要はありません。
例
プライマリ・データベースのREDOストリーム内にLogMinerディクショナリを作成して、ロジカル・スタンバイ・データベースをインスタンス化するための追加情報を記録するには、プライマリ・データベースで次のSQL文を発行します。
SQL> EXECUTE DBMS_LOGSTDBY.BUILD;
このプロシージャは、プライマリ・データベース内の対応する表から、スタンバイ・データベース内に表を作成し、データを移入します。表には、入力パラメータとしてデータベース・リンク(dblink
)名が必要です。ロジカル・スタンバイ・データベース内に表がすでに存在する場合、その表は削除され、プライマリ・データベースの表定義に基づいて再作成されます。このプロシージャは、表に関連付けられているデータに対してのみ適用され、関連付けられている索引および制約には適用されません。
INSTANTIATE_TABLE
プロシージャを使用すると、次のことを実行できます。
スタンバイ・データベースへの表の追加
スタンバイ・データベース内の表の再作成
構文
DBMS_LOGSTDBY.INSTANTIATE_TABLE ( schema_name IN VARCHAR2, table_name IN VARCHAR2, dblink IN VARCHAR2);
パラメータ
表73-5 INSTANTIATE_TABLEプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
スキーマの名前。 |
|
スタンバイ・データベースに作成または再作成する表の名前。 |
|
プライマリ・データベース内の表の読込み権限およびロック権限があるデータベース・リンク・アカウントの名前、およびプライマリ・データベースの |
例外
表73-6 INSTANTIATE_TABLEプロシージャの例外
例外 | 説明 |
---|---|
|
この操作を許可するにはロジカル・スタンバイ適用を停止する必要があります。 |
|
ロジカル・スタンバイ・メタデータ操作は進行中です。 |
|
指定したデータベース・リンクはプライマリ・データベースに対応していません。 |
|
指定した表はロジカル・スタンバイ・データベースでサポートされていません。 |
|
指定した表でマルチオブジェクトのスキップ・ルールが定義されています。 |
使用上の注意
このプロシージャを使用すると、プライマリ・データベースとトランザクション的に一貫性のある状態にスタンバイ・データベースのデータを保つように、表が作成され、データが移入されます。
この表は、SQL適用によってメンテナンスされる他の表とは同期されません。また、SQL適用によるこの表のメンテナンスは、プライマリからの表のインスタンス化後に発生したREDOがSQL適用によって検出されるまで開始されません。 プライマリ・データベースから表をインスタンス化したSCNは、DBA_LOGSTDBY_EVENTS
ビューで使用できます。
指定した表はロジカル・スタンバイでサポートされている必要があります(つまり、プライマリ・データベースのDBA_LOGSTDBY_UNSUPPORTED_TABLES
ビューに表示されません)。
この表を(ワイルドカードを使用しないで)明示的に指定するスキップ・ルールがある場合は、INSTANTIATE_TABLE
の処理中にこれらのスキップ・ルールが削除されるため、表は引き続きSQL適用で適切に保持されます。 この表を間接的に参照するスキップ・ルール(schema_name
またはtable_name
内にワイルドカードがあり、文タイプがTABLE、DMLまたはSCHEMA_DDLであるスキップ・ルール)がある場合は、INSTANTIATE_TABLE
に失敗し、ORA-16278エラーが発生します。 INSTANTIATE_TABLE
コールを再試行する前に、この表に関連するマルチオブジェクト・スキップ・ルールをすべて削除または変更する必要があります。
例
SQL> EXECUTE DBMS_LOGSTDBY.INSTANTIATE_TABLE (- SCHEMA_NAME => 'HR', TABLE_NAME => 'EMPLOYEES', - DBLINK => 'INSTANTIATE_TBL_LINK');
このファンクションは、ロジカル・スタンバイ適用サーバー・プロセスのコンテキストでPL/SQLから実行された場合、TRUE
を戻します。このファンクションは、DBMS_DDL.SET_TRIGGER_FIRING_PROPERTY
サブプログラムのfire_once
パラメータがFALSE
に設定されている(デフォルトはTRUE
)トリガーと一緒に使用します。このようなトリガーは、適用プロセスによって関連ターゲットが更新されると実行されます。このファンクションは、トリガー本体内で使用して、トリガーがプライマリまたはスタンバイで異なるアクションを実行する(またはアクションを実行しない)ようにすることができます。
関連項目: DBMS_DDL.SET_TRIGGER_FIRING_PROPERTY サブプログラムの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。 |
構文
DBMS_LOGSTDBY.IS_APPLY_SERVER RETURN BOOLEAN;
パラメータ
なし
プライマリ・データベースの指定SCNより5分以上先行している、スタンバイのSCNを戻します。このファンクションを使用すると、プライマリ・データベースでのフラッシュバック・データベース操作またはPoint-in-Timeリカバリ操作の後に、ロジカル・スタンバイ・データベースでフラッシュバック・データベース操作を補足するときに使用する安全なSCNを判別できます。
構文
DBMS_LOGSTDBY.MAP_PRIMARY_SCN(primary_scn NUMBER) RETURN NUMBER;
例外
表73-7 MAP_PRIMARY_SCNファンクションの例外
例外 | 説明 |
---|---|
|
プライマリSCNはマップ範囲の前にあります。 |
|
SCNマッピングでは、 |
使用上の注意
このファンクションは、プライマリ・データベースのSCNに対応するロジカル・スタンバイ・データベースの保守的SCNを取得する場合に使用します。このファンクションは、プライマリ・データベースでのフラッシュバック・データベース操作またはPoint-in-Timeリカバリ操作の後に、ロジカル・スタンバイでフラッシュバック・データベース操作を補足する場合に役立ちます。
PREPARE_FOR_NEW_PRIMARY
プロシージャは、フェイルオーバーの発生後、ロジカル・スタンバイ・データベースがフェイルオーバーの対象でなかった場合、そのスタンバイ・データベースで起動する必要があります。このようなスタンバイ・データベースでは、新しいプライマリ・データベースで処理されるREDOログ・セットと同じREDOログ・セットを処理する必要があります。このルーチンは、ローカルのロジカル・スタンバイ・データベースで新しいプライマリ・データベースより多くのREDOが処理されないようにし、一貫性を保証するために置換する必要があるアーカイブ・ログ・ファイル・セットをレポートします。一連の置換ログは、アラート・ログにレポートされます。これらのログは、ロジカル・スタンバイにコピーし、ALTER DATABASE REGISTER LOGICAL LOGFILE
文を使用して登録する必要があります。
構文
DBMS_LOGSTDBY.PREPARE_FOR_NEW_PRIMARY ( FORMER_STANDBY_TYPE IN VARCHAR2, DBLINK IN VARCHAR2);
パラメータ
表73-8 PREPARE_FOR_NEW_PRIMARYプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
フェイルオーバー操作によって新しいプライマリ・データベースとなったスタンバイ・データベースのタイプ。有効な値は、' |
|
新しいプライマリ・データベースへのデータベース・リンクの名前。 |
例外
表73-9 PREPARE_FOR_NEW_PRIMARYプロシージャの例外
例外 | 説明 |
---|---|
|
ロジカル・スタンバイ・オプションのリクエストが無効です。 |
|
以前のプライマリからのログ・データの適用に失敗しました。 |
使用上の注意
このルーチンは、ロジカル・スタンバイ・システムのみを対象としています。このルーチンは、ロジカル・スタンバイ・システムのみを対象としています。新しいプライマリ・データベースが以前はロジカル・スタンバイ・データベースで、LogMinerディクショナリの作成が正常に完了していない場合、このルーチンは失敗します。アラート・ログに表示されるログ・ファイルは、端末ログと呼ばれます。ファイル・パスは、新しいプライマリ・データベースに対する相対パスであり、ローカルに解決できない場合があることに注意してください。端末ログを手動で登録する際は、START LOGICAL STANDBY APPLY
(新しいプライマリ・データベースが、以前はフィジカル・スタンバイ・データベースだった場合)またはSTART LOGICAL STANDBY APPLY NEW PRIMARY
(新しいプライマリ・データベースが、以前はロジカル・スタンバイ・データベースだった場合)のいずれかをコールして、処理を完了する必要があります。例外が発生した理由の詳細は、アラート・ログを参照してください。
例
SQL> EXECUTE DBMS_LOGSTDBY.PREPARE_FOR_NEW_PRIMARY ( - FORMER_STANDBY_TYPE => 'LOGICAL', - DBLINK => 'dblink_to_newprimary');
ロジカル・スタンバイ・データベースに適用済で、SQL適用で不要になったすべてのアーカイブREDOログ・ファイルを識別します。識別後、オペレーティング・システム・コマンドを発行して、一部またはすべての不要なアーカイブREDOログ・ファイルを削除できます。
構文
DBMS_LOGSTDBY.PURGE_SESSION;
例外
使用上の注意
このプロシージャでは、アーカイブREDOログ・ファイルは削除されません。不要なファイルは、オペレーティング・システム・コマンドを発行して削除する必要があります。
このプロシージャを実行すると、ロジカル・スタンバイ・データベースに適用されたアーカイブREDOログ・ファイルを表示するDBA_LOGMNR_PURGED_LOG
ビューが更新されます。
Oracle Database 10g リリース2(10.2)では、アーカイブREDOログ・ファイルに関連するメタデータ(および実際のアーカイブREDOログ・ファイル)が、LOG_AUTO_DELETE
パラメータのデフォルト設定(「DBMS_LOGSTDBY.APPLY_SET
プロシージャ」を参照)に基づいて自動的にパージされます。
例
不要なファイルを識別して削除するには、次の手順を実行します。
ロジカル・スタンバイ・データベースで、次の文を入力します。
SQL> EXECUTE DBMS_LOGSTDBY.PURGE_SESSION;
DBA_LOGMNR_PURGED_LOG
ビューを問い合せて、削除可能なアーカイブREDOログ・ファイルを表示します。
SQL> SELECT * FROM DBA_LOGMNR_PURGED_LOG; FILE_NAME ------------------------------------ /boston/arc_dest/arc_1_40_509538672.log /boston/arc_dest/arc_1_41_509538672.log /boston/arc_dest/arc_1_42_509538672.log /boston/arc_dest/arc_1_43_509538672.log /boston/arc_dest/arc_1_44_509538672.log /boston/arc_dest/arc_1_45_509538672.log /boston/arc_dest/arc_1_46_509538672.log /boston/arc_dest/arc_1_47_509538672.log
オペレーティング・システム固有のコマンドを使用して、アーカイブREDOログ・ファイルをファイル・システムから削除します。
このプロシージャは、フェイルオーバー操作に伴ってプライマリ・データベースに役割が変更されたデータベースで、関連するメタデータ(LogMinerディクショナリを含む)を他のロジカル・スタンバイ・データベースで必要なREDOストリームに記録できない場合に使用します。
構文
DBMS_LOGSTDBY.REBUILD;
使用上の注意
LogMinerディクショナリ情報はREDOログ・ファイルに記録されます。スタンバイREDOログ・ファイル(存在する場合)は、アーカイブされます。
例
SQL> EXECUTE DBMS_LOGSTDBY.REBUILD;
SQL適用で必要なメタデータ表を、ユーザー指定の表領域に移動します。デフォルトでは、メタデータ表は、SYSAUX
表領域内に作成されます。このプロシージャを起動しているときは、SQL適用を実行できません。
構文
DBMS_LOGSTDBY.SET_TABLESPACE( NEW_TABLESPACE IN VARCHAR2)
パラメータ
例外
表73-12 SET_TABLESPACEプロシージャの例外
例外 | 説明 |
---|---|
|
この操作を許可するにはロジカル・スタンバイ適用を停止する必要があります。 |
|
ロジカル・スタンバイ・メタデータ操作は進行中です。 |
例
LOGSTDBY_TBS
という新しい表領域にメタデータ表を移動するには、次の文を発行します。
SQL> EXECUTE DBMS_LOGSTDBY.SET_TABLESPACE (new_tablespace => 'LOGSTDBY_TBS');
SKIP
プロシージャを使用すると、SQL適用で特定の変更がロジカル・スタンバイ・データベースに適用されないようにする場合に使用するルールを定義できます。たとえば、SKIP
プロシージャを使用すると、ロジカル・スタンバイ・データベース内の表のサブセットへの変更をスキップできます。また、ロジカル・スタンバイ・データベースで適用しないDDL文、またはロジカル・スタンバイ・データベースで適用する前に変更の必要があるDDL文の指定もできます。DDL文の変更は、ロジカル・スタンバイ・データベースで別のディレクトリ構造に対応する場合などに行う必要があります。
構文
DBMS_LOGSTDBY.SKIP ( stmt IN VARCHAR2, schema_name IN VARCHAR2 DEFAULT NULL, object_name IN VARCHAR2 DEFAULT NULL, proc_name IN VARCHAR2 DEFAULT NULL, use_like IN BOOLEAN DEFAULT TRUE, esc IN CHAR1 DEFAULT NULL);
パラメータ
表73-13 SKIPプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
SQL文のセットまたは特定のSQL文を識別するキーワード。キーワード(通常はデータベース・オブジェクトで定義)を使用すると構成が簡単になります。キーワードによって、指定オブジェクトで動作するすべてのSQL文が識別されるためです。 表73-14に、キーワードおよびそれに対応するSQL文を示します。いずれもこのパラメータの値として有効です。 キーワード |
|
|
|
|
|
SQL適用で、特定の文がstmt、schema_nameおよびobject_nameパラメータによって定義されたフィルタと一致していると判断されたときにコールされるストアド・プロシージャの名前。次のフォーマットで指定します。
このプロシージャは、SQL適用に対して、文の実行、文のスキップまたは代替文の実行のいずれかを行うように指示する値を戻します。 DDLの場合、SQL適用は、次のコール識別記号を指定してストアド・プロシージャをコールします。
PL/SQLの場合、SQL適用は、次のコール識別記号を指定してストアド・プロシージャをコールします。
|
|
注意1: 注意2: プロシージャの終了が処理されると、SQL適用はスキップ・ハンドラをコールします。 注意3: PL/SQLではワイルドカードがサポートされていないため、 次の例では、 Create or replace procedure sec_mgr.skip_drop_policy ( statement in varchar2, pkgown in varchar2, pkgname in varchar2, procnm in varchar2, cuser in varchar2, xidusn in number, xidslt in number, xidsqn in number, exstatus in number, skip_action out number) Is Begin If 0 = exstatus Then Insert Into sec_mgr.logit Values ('Success: '||pkgown||'.'||pkgname||'.'||procnm|| ' by '||cuser); If cuser != 'TESTSCHEMA' Then skip_action := DBMS_LOGSTDBY.SKIP_ACTION_APPLY; Else skip_action := DBMS_LOGSTDBY.SKIP_ACTION_SKIP; End If; End If; End skip_drop_policy; Execute dbms_logstdby.skip('PL/SQL', 'SYS', 'DBMS_RLS', 'DROP_POLICY', 'SEC_MGR.SKIP_DROP_POLICY', FALSE); |
|
パターン・マッチングによって、ロジカル・スタンバイ・データベース上でスキップする表を区別することができます。 |
|
パターン・マッチングに使用できるエスケープ文字(文字"/"など)を識別します。パターン内の文字%または_の前にエスケープ文字があると、Oracleではこの文字を特殊なパターン・マッチング文字としてではなく、パターン内の文字通りに解釈します。パターン・マッチングの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
使用上の注意
このプロシージャを実行するには、DBA
権限が必要です。
DML文のコンテキストで起動されるストアド・プロシージャは、関連付けできません。 たとえば、次の文は、「ORA-16104: ロジカル・スタンバイ・オプションのリクエストが無効です。」
エラーを戻します。
SQL> EXECUTE DBMS_LOGSTDBY.SKIP(- stmt => 'DML', - schema_name => 'HR', - object_name => 'EMPLOYEES', - proc_name => 'DML_HANDLER');
また、ルールの指定時にワイルドカードを使用したか、またはルールを重複して指定したため、1つのイベントが複数のルールに一致する場合は、次のようになります。 たとえば、HR.EMPLOYEES
表にSCHEMA_DDL
イベントのルールおよびALTER TABLE
イベントのルールを指定すると、(プロシージャ名のアルファベット順に従って)一致するプロシージャのいずれか1つのみが起動されます。次のコード例のルールを指定したとします。
SQL> EXECUTE DBMS_LOGSTDBY.SKIP( - stmt => 'SCHEMA DDL', - schema_name => 'HR', - object_name => 'EMPLOYEES', - proc_name => 'SCHEMA_DDL_HANDLER'); SQL> EXECUTE DBMS_LOGSTDBY.SKIP( - stmt => 'ALTER TABLE', - schema_name => 'HR', - object_name => 'EMPLOYEES', - proc_name => 'TABLE_ALTER_HANDLER');
ALTER TABLE
文が検出されると、schema_ddl_handler
プロシージャが起動されます。これは、このプロシージャの名前が、この文に関連するプロシージャのアルファベット順にソートされたリストの最上位にあるためです。ワイルドカードを使用して指定したためルール・セットで競合が発生した場合も、同様に解決されます。 たとえば、次の例のルールでALTER TABLE HR.EMPLOYEES ADD COLUMN RATING NUMBER
文が検出されると、empddl_handler
プロシージャが起動されます。
SQL> EXECUTE DBMS_LOGSTDBY.SKIP(- stmt => 'ALTER TABLE', - schema_name => 'HR', - object_name => 'EMP%', - proc_name => 'EMPDDL_HANDLER'); SQL> EXECUTE DBMS_LOGSTDBY.SKIP( - stmt => 'ALTER TABLE', - schema_name => 'HR', - object_name => 'EMPLOYEES', - proc_name => 'EMPLOYEE_DDL_HANDLER');
SKIP
プロシージャは、DDL文をスキップする場合は特に注意して使用してください。たとえば、CREATE
TABLE
文をスキップする場合は、その表を参照する他のDDL文もSKIP
プロシージャで指定する必要があります。このように処理しないと、文が失敗し、例外が発生する原因となります。例外が発生すると、SQL適用の実行が停止します。
SKIP
プロシージャをコールする前に、SQL適用を停止する必要があります。これを行うには、ALTER DATABASE STOP LOGICAL STANDBY APPLY
文を発行します。必要なフィルタをすべて指定した後、ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE
文を発行して、新しいフィルタ設定でSQL適用を開始します。
SKIP
プロシージャの設定を元に戻す(UNDOする)方法は、「UNSKIP
プロシージャ」を参照してください。
USER
文では、SCHEMA_NAME
パラメータはユーザーになります。OBJECT_NAME
パラメータには'%'を指定する必要があります。
PROC_NAME
パラメータを指定する場合は、このプロシージャがDBA_PROCEDURES
にすでに存在している必要があります。また、このプロシージャをDEFINER
権限で実行する必要があります。 このプロシージャをINVOKER
権限で宣言すると、「ORA-1031: 権限が不足しています。」
メッセージが戻されます。
このプロシージャによってREPLACEMENT
文が戻された場合、このREPLACEMENT
文は、プロシージャの所有者のSYSTEM
およびOBJECT
権限を使用して実行されます。
SKIP
プロシージャのPL/SQLブロックは、自律型トランザクションであると宣言されていないかぎり、トランザクション制御文(COMMIT
、ROLLBACK
、SAVEPOINT
、SET CONSTRAINT
など)を含むことはできません。
スキップ文のオプション
表73-14に、SKIP
プロシージャのstmt
パラメータに対してサポートされる値を示します。表の左の列は、その右側のSQL文のセットを識別するために使用されるキーワードです。 また、sys.audit_actions
表に示されたSQL文(表73-14の右列を参照)はすべて、有効な値でもあります。キーワードは通常、データベース・オブジェクトによって定義されることに注意してください。
表73-14 stmt
パラメータに対してサポートされる値
キーワード | 対応するSQL文 |
---|---|
SQL文のこのグループには、キーワードはありません。 |
|
|
|
|
|
|
|
|
|
|
|
|
表に対するDML文( |
|
|
|
特定のスキーマに関係しないすべてのDDL 注意: |
|
オラクル社が提供するパッケージを実行します。 |
|
|
|
|
|
|
|
|
|
スキーマ・オブジェクト(表、索引、列など)を作成、変更または削除するすべてのDDL文 注意: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 サポート対象パッケージの詳細は、『Oracle Data Guard概要および管理』を参照してください。
2 Javaスキーマ・オブジェクト(ソース、クラスおよびリソース)は、SQL文をスキップする(処理しない)という目的に関してはプロシージャと同様であるとみなされます。
例外
表73-15 DBMS_LOGSTDBY.SKIPプロシージャの例外
例外 | 説明 |
---|---|
|
権限が不足しています。
|
|
この操作を許可するにはロジカル・スタンバイ適用を停止する必要があります。 |
|
ロジカル・スタンバイ・オプションのリクエストが無効です。 |
|
|
|
ロジカル・スタンバイ・メタデータ操作は進行中です。 |
例
例1 スキーマに対するDMLおよびDDLのすべての変更をスキップ
次の例は、HRスキーマに対するDDL文とDML文の両方をSQL適用でスキップするルールの指定方法を示しています。
SQL> EXECUTE DBMS_LOGSTDBY.SKIP(STMT => 'SCHEMA DDL', - schema_name => 'HR', - table_name => '%', - proc_name => null); SQL> EXECUTE DBMS_LOGSTDBY.SKIP(STMT => 'DML', - schema_name => 'HR', - table_name => '%', - proc_name => null);
例2 異なるファイル・システムの編成を処理するプロシージャの作成
たとえば、ファイル・システムの編成がロジカル・スタンバイ・データベースとプライマリ・データベースで異なる場合は、ファイルが指定されたDDL文を透過的に処理するSKIP
プロシージャを作成できます。次のプロシージャは、ファイル指定文字列に関する特定のネーミング規則に従っているかぎり、DDL文を処理できます。
表領域DDL文を処理するSKIP
プロシージャを作成します。
CREATE OR REPLACE PROCEDURE sys.handle_tbs_ddl ( old_stmt IN VARCHAR2, stmt_typ IN VARCHAR2, schema IN VARCHAR2, name IN VARCHAR2, xidusn IN NUMBER, xidslt IN NUMBER, xidsqn IN NUMBER, action OUT NUMBER, new_stmt OUT VARCHAR2 ) AS BEGIN -- All primary file specification that contains a directory -- /usr/orcl/primary/dbs -- should go to /usr/orcl/stdby directory specification new_stmt = replace(old_stmt, '/usr/orcl/primary/dbs', '/usr/orcl/stdby'); action := DBMS_LOGSTDBY.SKIP_ACTION_REPLACE; EXCEPTION WHEN OTHERS THEN action := DBMS_LOGSTDBY.SKIP_ACTION_ERROR; new_stmt := NULL; END handle_tbs_ddl;
SKIP
プロシージャをSQL適用に登録します。
SQL> EXECUTE DBMS_LOGSTDBY.SKIP (stmt => 'TABLESPACE', - proc_name => 'SYS.HANDLE_TBS_DDL');
エラーが発生すると、ロジカル・スタンバイ・データベースは、このプロシージャに含まれている基準を使用して、SQL適用を停止するかどうかを判断します。スキップされるエラーはすべて、例外の処理方法を記述するシステム表に格納されます。
構文
DBMS_LOGSTDBY.SKIP_ERROR ( stmt IN VARCHAR2, schema_name IN VARCHAR2, object_name IN VARCHAR2, proc_name IN VARCHAR2, use_like IN BOOLEAN, esc IN CHAR1);
パラメータ
表73-16 SKIP_ERRORプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
SQL文のセットまたは特定のSQL文を識別するキーワード。キーワード(通常はデータベース・オブジェクトで定義)を使用すると構成が簡単になります。キーワードによって、指定オブジェクトで動作するすべてのSQL文が識別されるためです。 表73-14に、キーワードおよびそれに対応するSQL文を示します。いずれもこのパラメータの値として有効です。 |
|
|
|
|
|
SQL適用で、特定の文が
このプロシージャは、SQL適用に対して、文の実行、文のスキップまたは代替文の実行のいずれかを行うように指示する値を戻します。 SQL適用は、次のコール識別記号を指定してストアド・プロシージャをコールします。
|
|
パターン・マッチングによって、ロジカル・スタンバイ・データベース上でスキップする表を区別することができます。 |
|
パターン・マッチングに使用できるエスケープ文字(文字"%"または"_"など)を識別します。パターン内の文字%または_の前にエスケープ文字があると、Oracleではこの文字を特殊なパターン・マッチング文字としてではなく、パターン内の文字通りに解釈します。パターン・マッチングの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
使用上の注意
SKIP_ERROR
プロシージャに提供されているストアド・プロシージャは、SQL適用で、スタンバイ・データベースへのREDOログの適用を停止する可能性のあるエラーが発生した場合にコールされます。
このストアド・プロシージャの実行は、DBA_LOGSTDBY_EVENTS
表のSTATUS
列に書き込まれるエラーに作用します。 STATUS_CODE
列は変更されません。 ストアド・プロシージャの効果がない、つまり適用が停止された場合は、NEW_ERROR
がイベント表に書き込まれます。 まったく効果がないようにするには、そのプロシージャでNEW_ERROR
をERROR
に設定します。
ストアド・プロシージャで停止の回避が必要な場合は、NEW_ERROR
をNULL
に設定します。
このプロシージャを実行するには、DBA
権限が必要です。
USER
文では、SCHEMA_NAME
パラメータはユーザーになります。OBJECT_NAME
パラメータには'%'を指定する必要があります。
PROC_NAME
パラメータを指定する場合は、このプロシージャがDBA_PROCEDURES
にすでに存在している必要があります。また、このプロシージャをDEFINERS
権限で実行する必要があります。 このプロシージャをINVOKERS
権限で宣言すると、「ORA-1031: 権限が不足しています。」
メッセージが戻されます。
SKIP_ERROR
プロシージャのPL/SQLブロックは、次に示す構文を使用して自律型トランザクションであると宣言されていないかぎり、トランザクション制御文(COMMIT
、ROLLBACK
、SAVEPOINT
、SET CONSTRAINT
など)を含むことはできません。
PRAGMA AUTONOMOUS_TRANSACTION
例外
表73-17 SKIP_ERRORプロシージャの例外
例外 | 説明 |
---|---|
|
権限が不足しています。
|
|
この操作を許可するにはロジカル・スタンバイ適用を停止する必要があります。 |
|
ロジカル・スタンバイ・オプションのリクエストが無効です。 |
|
ロジカル・スタンバイ・メタデータ操作は進行中です。 |
例
SYS
またはHR
スキーマで発生したGRANT
文のエラーをスキップするには、プロシージャhandle_error_ddl
を定義して登録します。 次の例では、handle_error_ddl
が、SYS
スキーマ内の自立型プロシージャであることを想定しています。
エラー・ハンドラ・プロシージャを作成します。
CREATE OR REPLACE PROCEDURE sys.handle_error_ddl ( old_stmt IN VARCHAR2, stmt_type IN VARCHAR2, schema IN VARCHAR2, name IN VARCHAR2, xidusn IN NUMBER, xidslt IN NUMBER, xidsqn IN NUMBER, error IN VARCHAR2, new_stmt OUT VARCHAR2 ) AS BEGIN -- Default to what we already have new_stmt := old_stmt; -- Ignore any GRANT errors on SYS or HR schemas IF ((INSTR(UPPER(old_stmt),'GRANT')) > 0) OR ((INSTR(UPPER(old_stmt),'REVOKE')) > 0) THEN IF schema IS NULL OR (schema IS NOT NULL AND (UPPER(schema) = 'SYS' OR UPPER(schema) = 'HR' )) THEN new_stmt := NULL; -- record the fact that we just skipped an error on 'SYS' or 'HR' schemas -- code not shown here END IF; END IF; END handle_error_ddl; /
エラー・ハンドラをSQL適用に登録します。
SQL> EXECUTE DBMS_LOGSTDBY.SKIP_ERROR ( - statement => 'NON_SCHEMA_DDL', - schema_name => NULL, - object_name => NULL, - proc_name => 'SYS.HANDLE_ERROR_DDL');
このプロシージャは、ロジカル・スタンバイ・データベースへのトランザクションの適用をスキップする(処理しない)方法を提供します。トランザクション識別情報を指定することによって、特定のトランザクションをスキップできます。
構文
DBMS_LOGSTDBY.SKIP_TRANSACTION ( xidusn IN NUMBER, xidslt IN NUMBER, xidsqn IN NUMBER);
パラメータ
表73-18 SKIP_TRANSACTIONプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
スキップ対象トランザクションのトランザクションID UNDOセグメント番号。 |
|
スキップ対象トランザクションのトランザクションIDスロット番号。 |
|
スキップ対象トランザクションのトランザクションID順序番号。 |
使用上の注意
特定のトランザクション(例: DDLトランザクション)が原因でSQL適用が停止した場合、そのトランザクションIDを指定して、適用を継続できます。このプロシージャは、SQL適用で処理しないトランザクションの数と同じ回数コールできます。
注意:
DMLの失敗をスキップするには、 |
このプロシージャを実行するには、DBA
権限が必要です。
DBA_LOGSTDBY_SKIP_TRANSACTION
ビューを使用すると、SQL適用でスキップされる予定のトランザクションが示されます。
『Oracle Database SQL言語リファレンス』のALTER DATABASE START LOGICAL STANDBY SKIP FAILED TRANSACTION
文に関する項も参照してください。
例外
表73-19 SKIP_TRANSACTIONプロシージャの例外
例外 | 説明 |
---|---|
|
|
|
この操作を許可するにはロジカル・スタンバイ適用を停止する必要があります。 |
|
ロジカル・スタンバイ・オプションのリクエストが無効です。 |
例
XIDUSN
、XIDSLT
、XIDSQN
がそれぞれ1、13、1726であるDDLトランザクションをスキップするには、次の例に示すルールを登録します。
SQL> EXECUTE DBMS_LOGSTDBY.SKIP_TRANSACTION (- XIDUSN => 1, XIDSLT => 13, XIDSQN => 1726);
UNSKIP
プロシージャは、SKIP
プロシージャで指定済のルールを削除するために使用します。指定済のルールを削除するには、UNSKIP
プロシージャで指定するパラメータが正確に一致している必要があります。
構文
DBMS_LOGSTDBY.UNSKIP ( stmt IN VARCHAR2, schema_name IN VARCHAR2 DEFAULT NULL, object_name IN VARCHAR2 DEFUALT NULL);
パラメータ
UNSKIP
プロシージャのパラメータ情報は、SKIP
プロシージャで説明した情報と同じです。 パラメータ情報の詳細は、表73-13を参照してください。
例外
表73-20 UNSKIPプロシージャの例外
例外 | 説明 |
---|---|
|
このプロシージャを実行するには、 |
|
この操作を許可するにはロジカル・スタンバイ適用を停止する必要があります。 |
|
ロジカル・スタンバイ・オプションのリクエストが無効です。 |
使用上の注意
注意: 表に対するDML変更をスキップし、その補足が行われていない場合、 |
このプロシージャを実行するには、DBA権限が必要です。
schema_name
またはobject_name
パラメータに渡されたワイルドカードは展開されません。ワイルドカード文字は、文字レベルで照合されます。したがって、UNSKIP
プロシージャでは、指定済のルールを1つのみ削除できます。UNSKIP
プロシージャは、指定済のルールを削除するたびに個別にコールする必要があります。
たとえば、HR.EMPLOYEE
表およびHR.EMPTEMP
表へのDML文の適用をスキップする次の2つのルールが指定済であるとします。
SQL> EXECUTE DBMS_LOGSTDBY.SKIP (STMT => 'DML',- SCHEMA_NAME => 'HR', - OBJECT_NAME => 'EMPLOYEE', - PROC_NAME => null); SQL> EXECUTE DBMS_LOGSTDBY.SKIP (STMT => 'DML',- SCHEMA_NAME => 'HR', - OBJECT_NAME => 'EMPTEMP', - PROC_NAME => null);
次の例では、OBJECT_NAME
パラメータにワイルドカードが使用されていますが、これで指定済のルールを削除することはできません。
SQL> EXECUTE DBMS_LOGSTDBY.UNSKIP (STMT => 'DML',- SCHEMA_NAME => 'HR', - OBJECT_NAME => 'EMP%');
OBJECT_NAME
パラメータのワイルドカード文字は展開されないため、このUNSKIP
プロシージャは、実際にはいずれのルールとも一致しません。この場合、ワイルドカード文字は完全一致で使用され、対応するSKIP
ルールが検索されます。
UNSKIP_ERROR
プロシージャは、SKIP_ERROR
プロシージャで指定済のルールを削除するために使用します。 指定済のルールを削除するには、UNSKIP_ERROR
プロシージャで指定するパラメータが正確に一致している必要があります。
構文
DBMS_LOGSTDBY.UNSKIP_ERROR ( stmt IN VARCHAR2, schema_name IN VARCHAR2 DEFAULT NULL, object_name IN VARCHAR2 DEFAULT NULL);
パラメータ
UNSKIP_ERROR
プロシージャのパラメータ情報は、SKIP_ERROR
プロシージャに関する情報と同じです。 パラメータ情報の詳細は、表73-16を参照してください。
例外
表73-21 UNSKIP_ERRORプロシージャの例外
例外 | 説明 |
---|---|
|
|
|
この操作を許可するにはロジカル・スタンバイ適用を停止する必要があります。 |
|
ロジカル・スタンバイ・オプションのリクエストが無効です。 |
使用上の注意
このプロシージャを実行するには、DBA
権限が必要です。
schema_name
またはobject_name
パラメータに渡されたワイルドカードは展開されません。この場合、ワイルドカード文字は他の文字と同様に扱われ、完全一致検索が行われます。 したがって、UNSKIP_ERROR
プロシージャでは、指定済のルールを1つのみ削除できます。UNSKIP_ERROR
プロシージャは、指定済のルールを削除するたびに個別にコールする必要があります。
たとえば、HR.EMPLOYEE
表およびHR.EMPTEMP
表を処理する次の2つのルールが指定済であるとします。
SQL> EXECUTE DBMS_LOGSTDBY.SKIP_ERROR (STMT => 'DML',- SCHEMA_NAME => 'HR', - OBJECT_NAME => 'EMPLOYEE', - PROC_NAME => 'hr_employee_handler'); SQL> EXECUTE DBMS_LOGSTDBY.SKIP_ERROR (STMT => 'DML',- SCHEMA_NAME => 'HR', - OBJECT_NAME => 'EMPTEMP', - PROC_NAME => 'hr_tempemp_handler');
この場合、次のUNSKIP_ERROR
プロシージャを使用して、指定済のルールを削除することはできません。
SQL> EXECUTE DBMS_LOGSTDBY.UNSKIP_ERROR (STMT => 'DML',- SCHEMA_NAME => 'HR', - OBJECT_NAME => 'EMP%');
OBJECT_NAME
パラメータのワイルドカード文字は展開されないため、このUNSKIP_ERROR
プロシージャは、実際にはいずれのルールとも一致しません。
例
SQL適用に登録済のハンドラを削除して、エラー発生時にコールされないようにするには、次の文を発行します。
DBMS_LOGSTDBY.UNSKIP_ERROR ( - statement => 'NON_SCHEMA_DDL', - schema_name => NULL, - object_name => NULL);
UNSKIP_TRANSACTION
プロシージャは、SKIP_TRANSACTION
プロシージャで指定済のルールを削除するために使用します。 指定済のルールを削除するには、UNSKIP_TRANSACTION
プロシージャで指定するパラメータが正確に一致している必要があります。
構文
DBMS_LOGSTDBY.UNSKIP_TRANSACTION ( xidusn_p IN NUMBER, xidslt_p IN NUMBER, xidsqn_p IN NUMBER);
パラメータ
表73-22 UNSKIP_TRANSACTIONプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
スキップ対象トランザクションのトランザクションID UNDOセグメント番号。 |
|
スキップ対象トランザクションのトランザクションIDスロット番号。 |
|
スキップ対象トランザクションのトランザクションID順序番号。 |
例外
表73-23 UNSKIP_TRANSACTIONプロシージャの例外
例外 | 説明 |
---|---|
|
このプロシージャを実行するには、 |
|
この操作を許可するにはロジカル・スタンバイ適用を停止する必要があります。 |
|
ロジカル・スタンバイ・オプションのリクエストが無効です。 |
使用上の注意
このプロシージャを実行するには、DBA
権限が必要です。
DBA_LOGSTDBY_SKIP_TRANSACTION
ビューを問い合せると、SQL適用でスキップされる予定のトランザクションが示されます。
例
XIDUSN
、XIDSLT
、XIDSQN
がそれぞれ1、13、1726であるトランザクションの適用をスキップするように指定されていたルールを削除するには、次の文を発行します。
SQL> DBMS_LOGSTDBY.UNSKIP_TRANSACTION (XIDUSN => 1, XIDSLT => 13, XIDSQN => 1726);