26 Oracle Streams適用プロセスの監視

次の各項では、Oracle Streamsの適用プロセスの監視について説明します。

注意:

Oracle Enterprise Manager Cloud ControlのOracle Streamsツールも、Oracle Streams環境を監視するための優れた手段です。Oracle Streamsツールの詳細は、Oracle Enterprise Manager Cloud Controlのオンライン・ヘルプを参照してください。

26.1 各適用プロセスのキュー、ルール・セットおよび状態の確認

この項で説明する問合せを実行すると、データベース内の各適用プロセスに関する次の情報を確認できます。

データベース内の各適用プロセスに関する前述の一般情報を表示するには、次の問合せを実行します。

COLUMN APPLY_NAME HEADING 'Apply|Process|Name' FORMAT A15
COLUMN QUEUE_NAME HEADING 'Apply|Process|Queue' FORMAT A15
COLUMN RULE_SET_NAME HEADING 'Positive|Rule Set' FORMAT A15
COLUMN NEGATIVE_RULE_SET_NAME HEADING 'Negative|Rule Set' FORMAT A15
COLUMN STATUS HEADING 'Apply|Process|Status' FORMAT A15

SELECT APPLY_NAME, 
       QUEUE_NAME, 
       RULE_SET_NAME, 
       NEGATIVE_RULE_SET_NAME,
       STATUS
  FROM DBA_APPLY;

出力は次のようになります。

Apply           Apply                                           Apply
Process         Process         Positive        Negative        Process
Name            Queue           Rule Set        Rule Set        Status
--------------- --------------- --------------- --------------- ---------------
STRM01_APPLY    STREAMS_QUEUE   RULESET$_36                     ENABLED
APPLY_EMP       STREAMS_QUEUE   RULESET$_16                     DISABLED
APPLY           STREAMS_QUEUE   RULESET$_21     RULESET$_23     ENABLED

適用プロセスの状態がABORTEDの場合、DBA_APPLYデータ・ディクショナリ・ビューのERROR_NUMBERおよびERROR_MESSAGE列を問い合せてエラーを特定できます。これらの列は、適用プロセスが強制終了された場合または適用プロセスが制限値に達して無効になった場合に移入されます。適用プロセスを再起動すると、これらの列は消去されます。

注意:

DBA_APPLYデータ・ディクショナリ・ビューのERROR_NUMBERおよびERROR_MESSAGE列は、DBA_APPLY_ERRORデータ・ディクショナリ・ビューの情報とは関連がありません。

関連項目:

適用プロセスの状態がABORTEDの場合に適用エラーの有無をチェックするには、適用エラーのチェックを参照

26.2 各適用プロセスに関する一般情報の表示

この項で説明する問合せを実行すると、データベース内の各適用プロセスに関する一般情報を表示できます。

データベース内の各適用プロセスに関する前述の一般情報を表示するには、次の問合せを実行します。

COLUMN APPLY_NAME HEADING 'Apply Process Name' FORMAT A20
COLUMN APPLY_CAPTURED HEADING 'Applies Captured LCRs?' FORMAT A22
COLUMN APPLY_USER HEADING 'Apply User' FORMAT A20
 
SELECT APPLY_NAME, APPLY_CAPTURED, APPLY_USER
  FROM DBA_APPLY;

出力は次のようになります。

Apply Process Name   Applies Captured LCRs? Apply User         
-------------------- ---------------------- --------------------
STRM01_APPLY         YES                    STRMADMIN           
SYNC_APPLY           NO                     STRMADMIN           

26.3 各適用プロセスのパラメータ設定の表示

次の問合せを実行すると、データベース内の適用プロセスごとの各適用プロセス・パラメータの現行の設定が表示されます。

COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A15
COLUMN PARAMETER HEADING 'Parameter' FORMAT A30
COLUMN VALUE HEADING 'Value' FORMAT A22
COLUMN SET_BY_USER HEADING 'Set by|User?' FORMAT A10

SELECT APPLY_NAME,
       PARAMETER, 
       VALUE,
       SET_BY_USER  
  FROM DBA_APPLY_PARAMETERS;

出力は次のようになります。

Apply Process                                                         Set by
Name            Parameter                      Value                  User?
--------------- ------------------------------ ---------------------- ----------
APPLY$_DB_3     ALLOW_DUPLICATE_ROWS           N                      NO
APPLY$_DB_3     APPLY_SEQUENCE_NEXTVAL         N                      NO
APPLY$_DB_3     COMMIT_SERIALIZATION           DEPENDENT_TRANSACTIONS NO
APPLY$_DB_3     COMPARE_KEY_ONLY               N                      NO
APPLY$_DB_3     DISABLE_ON_ERROR               Y                      NO
APPLY$_DB_3     DISABLE_ON_LIMIT               N                      NO
APPLY$_DB_3     GROUPTRANSOPS                  250                    NO
APPLY$_DB_3     IGNORE_TRANSACTION                                    NO
APPLY$_DB_3     MAXIMUM_SCN                    INFINITE               NO
APPLY$_DB_3     MAX_SGA_SIZE                   INFINITE               NO
APPLY$_DB_3     PARALLELISM                    4                      NO
APPLY$_DB_3     PRESERVE_ENCRYPTION            Y                      NO
APPLY$_DB_3     RTRIM_ON_IMPLICIT_CONVERSION   Y                      NO
APPLY$_DB_3     STARTUP_SECONDS                0                      NO
APPLY$_DB_3     TIME_LIMIT                     INFINITE               NO
APPLY$_DB_3     TRACE_LEVEL                    0                      NO
APPLY$_DB_3     TRANSACTION_LIMIT              INFINITE               NO
APPLY$_DB_3     TXN_AGE_SPILL_THRESHOLD        900                    NO
APPLY$_DB_3     TXN_LCR_SPILL_THRESHOLD        10000                  NO
APPLY$_DB_3     WRITE_ALERT_LOG                Y                      NO

注意:

パラメータのSet by user列がNOの場合、そのパラメータはデフォルト値に設定されます。パラメータのSet by user列がYESの場合、パラメータはユーザーによって設定され、デフォルト値に設定されることもされないこともあります。

関連項目:

26.4 適用ハンドラの情報の表示

この項では、適用プロセス適用ハンドラに関する情報を表示する手順について説明します。

この項の内容は次のとおりです。

26.4.1 DMLハンドラに関する情報の表示

次の各項では、DMLハンドラの情報を表示する手順について説明します。

関連項目:

26.4.1.1 すべてのDMLハンドラに関する情報の表示

データベース内のすべてのDMLハンドラ(すべての文DMLハンドラおよびすべてのプロシージャDMLハンドラを含む)に関する次の情報を表示できます。

  • DMLハンドラが設定されている表の所有者および名前

  • DMLハンドラが設定されている操作

  • DMLハンドラの名前

  • DMLハンドラのタイプ(文またはプロシージャのいずれか)

  • DMLハンドラが使用されている適用プロセスの名前

データベース内の各DMLハンドラに関する前述の情報を表示するには、次の問合せを実行します。

COLUMN OBJECT_OWNER HEADING 'Table|Owner' FORMAT A7
COLUMN OBJECT_NAME HEADING 'Table Name' FORMAT A11
COLUMN OPERATION_NAME HEADING 'Operation' FORMAT A9
COLUMN HANDLER HEADING 'DML Handler' FORMAT A13
COLUMN HANDLER_TYPE HEADING 'Handler|Type' FORMAT A9
COLUMN APPLY_NAME HEADING 'Apply|Process|Name' FORMAT A15
 
SELECT OBJECT_OWNER,
       OBJECT_NAME,
       OPERATION_NAME,
       NVL(USER_PROCEDURE,HANDLER_NAME) Handler,
       DECODE(HANDLER_TYPE,'PROCEDURE HANDLER','PROCEDURE','STMT HANDLER', 
              'STATEMENT','UNKNOWN') HANDLER_TYPE,
       APPLY_NAME
  FROM DBA_APPLY_DML_HANDLERS
  WHERE ERROR_HANDLER = 'N' AND
        APPLY_DATABASE_LINK IS NULL
  ORDER BY OBJECT_OWNER, OBJECT_NAME;

出力は次のようになります。

                                                      Apply
Table                                       Handler   Process
Owner   Table Name  Operation DML Handler   Type      Name
------- ----------- --------- ------------- --------- ---------------
HR      DEPARTMENTS UPDATE    "STRMADMIN"." PROCEDURE
                              SQL_GEN_DEP"
HR      JOBS        UPDATE    TRACK_JOBS    STATEMENT APPLY$_PROD_25
OE      ORDERS      INSERT    MODIFY_ORDERS STATEMENT APPLY$_PROD_25

strmadmin.sql_gen_depプロシージャDMLハンドラのApply Process NameNULLであるため、このハンドラは、すべてのローカル適用プロセスに対して実行される汎用ハンドラです。

26.4.1.2 文DMLハンドラに関する情報の表示

次の各項では、データベース内の文DMLハンドラに関する情報を表示する問合せについて説明します。

26.4.1.2.1 データベース内の文DMLハンドラの表示

データベース内の文DMLハンドラに関する次の情報を表示できます。

  • 文DMLハンドラの名前

  • 文DMLハンドラのコメント

  • 文DMLハンドラが作成された時間

  • 文DMLハンドラが最後に変更された時間

データベース内の各文DMLハンドラに関する前述の情報を表示するには、次の問合せを実行します。

COLUMN HANDLER_NAME HEADING 'Handler Name' FORMAT A15
COLUMN HANDLER_COMMENT HEADING 'Comment' FORMAT A35
COLUMN CREATION_TIME HEADING 'Creation|Time' FORMAT A10
COLUMN MODIFICATION_TIME HEADING 'Last|Change|Time' FORMAT A10

SELECT HANDLER_NAME, 
       HANDLER_COMMENT, 
       CREATION_TIME, 
       MODIFICATION_TIME
  FROM DBA_STREAMS_STMT_HANDLERS
  ORDER BY HANDLER_NAME;

出力は次のようになります。

                                                               Last
                                                    Creation   Change
Handler Name    Comment                             Time       Time
--------------- ----------------------------------- ---------- ----------
MODIFY_ORDERS   Modifies inserts into the orders ta 12-MAR-09
                ble                                 07.59.56.9
                                                    46180 AM
 
TRACK_JOBS      Tracks updates to the jobs table    11-MAR-09
                                                    10.47.52.7
                                                    76489 AM

この出力でのLast Change Timeが示すようにMODIFICATION_TIMENULLの場合、ハンドラが作成以降に変更されていないことを示します。

26.4.1.2.2 各適用プロセスによって使用される文DMLハンドラの表示

宛先データベースでDBMS_APPLY_ADMパッケージのADD_STMT_HANDLERプロシージャを使用して文DMLハンドラを指定する場合、特定の適用プロセスに対してハンドラが実行されるように指定するか、または変更をローカルに適用するデータベース内のすべての適用プロセスに対して実行される汎用ハンドラとしてハンドラが実行されるように指定することができます。表の操作に対する文DMLハンドラが特定の適用プロセスによって使用され、かつ別の文DMLハンドラが同じ表の同じ操作に対する汎用ハンドラとして存在する場合、適用プロセスでその表への操作を含む行LCRがデキューされたときには、両方のハンドラが呼び出されます。各文DMLハンドラによって元の行LCRが受け取られ、文DMLハンドラは任意の順序で実行できます。

データベース内の適用プロセスによって使用される文DMLハンドラに関する次の情報を表示できます。

  • 文DMLハンドラが設定されている表の所有者および名前

  • 文DMLハンドラが設定されている操作

  • 文DMLハンドラが使用されている適用プロセスの名前

  • 文DMLハンドラの名前

各適用プロセスによって使用される文DMLハンドラに関する前述の情報を表示するには、次の問合せを実行します。

COLUMN OBJECT_OWNER HEADING 'Table|Owner' FORMAT A10
COLUMN OBJECT_NAME HEADING 'Table Name' FORMAT A10
COLUMN OPERATION_NAME HEADING 'Operation' FORMAT A9
COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A15
COLUMN HANDLER_NAME HEADING 'Statement DML|Handler Name' FORMAT A30

SELECT OBJECT_OWNER, 
       OBJECT_NAME, 
       OPERATION_NAME, 
       APPLY_NAME,
       HANDLER_NAME
  FROM DBA_APPLY_DML_HANDLERS
  WHERE HANDLER_TYPE='STMT HANDLER'
  ORDER BY OBJECT_OWNER, OBJECT_NAME, OPERATION_NAME;

出力は次のようになります。

Table                           Apply Process   Statement DML
Owner      Table Name Operation Name            Handler Name
---------- ---------- --------- --------------- ------------------------------
HR         JOBS       UPDATE    APPLY$_PROD_25  TRACK_JOBS
OE         ORDERS     INSERT    APPLY$_PROD_25  MODIFY_ORDERS

文DMLハンドラのApply Process NameNULLである場合、このハンドラは、すべてのローカル適用プロセスに対して実行される汎用ハンドラです。

26.4.1.2.3 文DMLハンドラのすべての文の表示

この項で説明する問合せを実行すると、データベース内の文DMLハンドラの文に関する次の情報が表示されます。

  • それぞれの文を含む文DMLハンドラの名前

  • それぞれの文の実行順序

  • それぞれの文のテキスト

これらの情報を表示するには、次の問合せを実行します。

COLUMN HANDLER_NAME HEADING 'Statement|Handler' FORMAT A15
COLUMN EXECUTION_SEQUENCE HEADING 'Execution|Sequence' FORMAT 999999
COLUMN STATEMENT HEADING 'Statement' FORMAT A50

SET LONG  8000
SET PAGES 8000
SELECT HANDLER_NAME,
       EXECUTION_SEQUENCE,
       STATEMENT
  FROM DBA_STREAMS_STMTS
  ORDER BY HANDLER_NAME, EXECUTION_SEQUENCE;

出力は次のようになります。

Statement       Execution
Handler          Sequence Statement
--------------- --------- --------------------------------------------------
MODIFY_ORDERS           1 INSERT INTO oe.orders(
                                       order_id,
                                       order_date,
                                       order_mode,
                                       customer_id,
                                       order_status,
                                       order_total,
                                       sales_rep_id,
                                       promotion_id)
                                     VALUES(
                                       :new.order_id,
                                       :new.order_date,
                                       :new.order_mode,
                                       :new.customer_id,
                                       DECODE(:new.order_status, 1, 2, :new.
                          order_status),
                                       :new.order_total,
                                       :new.sales_rep_id,
                                       :new.promotion_id)
 
TRACK_JOBS             10 :lcr.execute TRUE
TRACK_JOBS             20 INSERT INTO hr.track_jobs(
                                       change_id,
                                       job_id,
                                       job_title,
                                       min_salary_old,
                                       min_salary_new,
                                       max_salary_old,
                                       max_salary_new,
                                       timestamp)
                                     VALUES(
                                       hr.track_jobs_seq.NEXTVAL,
                                       :new.job_id,
                                       :new.job_title,
                                       :old.min_salary,
                                       :new.min_salary,
                                       :old.max_salary,
                                       :new.max_salary,
                                       :source_time)
26.4.1.3 プロシージャDMLハンドラに関する情報の表示

宛先データベースでDBMS_APPLY_ADMパッケージのSET_DML_HANDLERプロシージャを使用してローカルのプロシージャDMLハンドラを指定する場合、必要に応じて、特定の適用プロセスに対してハンドラが実行されるように指定するか、または変更をローカルに適用するデータベース内のすべての適用プロセスに対して実行される汎用ハンドラとしてハンドラが実行されるように指定することができます。特定のプロシージャDMLハンドラは、汎用プロシージャDMLハンドラより優先されます。DMLハンドラは、特定の表への指定した操作に対して実行されます。

データベース内の各適用プロセスに対するプロシージャDMLハンドラを表示するには、次の問合せを実行します。

COLUMN OBJECT_OWNER HEADING 'Table|Owner' FORMAT A11
COLUMN OBJECT_NAME HEADING 'Table Name' FORMAT A15
COLUMN OPERATION_NAME HEADING 'Operation' FORMAT A9
COLUMN USER_PROCEDURE HEADING 'Handler Procedure' FORMAT A25
COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A15

SELECT OBJECT_OWNER, 
       OBJECT_NAME, 
       OPERATION_NAME, 
       USER_PROCEDURE,
       APPLY_NAME
  FROM DBA_APPLY_DML_HANDLERS
  WHERE ERROR_HANDLER = 'N' AND
        USER_PROCEDURE IS NOT NULL
  ORDER BY OBJECT_OWNER, OBJECT_NAME;

出力は次のようになります。

Table                                                           Apply Process
Owner       Table Name      Operation Handler Procedure         Name
----------- --------------- --------- ------------------------- ---------------
HR          DEPARTMENTS     UPDATE    "STRMADMIN"."SQL_GEN_DEP"

strmadmin.sql_gen_depプロシージャDMLハンドラのApply Process NameNULLであるため、このハンドラは、すべてのローカル適用プロセスに対して実行される汎用ハンドラです。

26.4.2 各適用プロセスのDDLハンドラの表示

データベース内の各適用プロセスに対するDDLハンドラを表示するには、次の問合せを実行します。

COLUMN APPLY_NAME HEADING 'Apply Process Name' FORMAT A20
COLUMN DDL_HANDLER HEADING 'DDL Handler' FORMAT A40

SELECT APPLY_NAME, DDL_HANDLER FROM DBA_APPLY;

出力は次のようになります。

Apply Process Name   DDL Handler
-------------------- ----------------------------------------
STREP01_APPLY        "STRMADMIN"."HISTORY_DDL"

関連項目:

DDLハンドラの管理

26.4.3 ローカル適用プロセスのすべてのエラー・ハンドラの表示

宛先データベースDBMS_APPLY_ADMパッケージのSET_DML_HANDLERプロシージャを使用してローカルのエラー・ハンドラを指定する際、適用プロセスでエラーが発生した場合に特定の適用プロセスに対してハンドラが実行されるように指定するか、または変更をローカルに適用するデータベース内のすべての適用プロセスに対して実行される汎用ハンドラとしてハンドラが実行されるように指定することができます。特定のエラー・ハンドラは、汎用エラー・ハンドラより優先されます。エラー・ハンドラは、特定の表への指定した操作に対して実行されます。

データベース内で変更をローカルに適用する各適用プロセスに対するエラー・ハンドラを表示するには、次の問合せを実行します。

COLUMN OBJECT_OWNER HEADING 'Table|Owner' FORMAT A5
COLUMN OBJECT_NAME HEADING 'Table Name' FORMAT A10
COLUMN OPERATION_NAME HEADING 'Operation' FORMAT A10
COLUMN USER_PROCEDURE HEADING 'Handler Procedure' FORMAT A30
COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A15

SELECT OBJECT_OWNER, 
       OBJECT_NAME, 
       OPERATION_NAME, 
       USER_PROCEDURE,
       APPLY_NAME 
  FROM DBA_APPLY_DML_HANDLERS
  WHERE ERROR_HANDLER = 'Y'
  ORDER BY OBJECT_OWNER, OBJECT_NAME;

出力は次のようになります。

Table                                                      Apply Process
Owner Table Name Operation  Handler Procedure              Name
----- ---------- ---------- ------------------------------ --------------
HR    REGIONS    INSERT     "STRMADMIN"."ERRORS_PKG"."REGI
                            ONS_PK_ERROR"

strmadmin.errors_pkg.regions_pk_errorエラー・ハンドラのApply Process NameNULLです。このため、このハンドラはすべてのローカル適用プロセスに対して実行される汎用ハンドラです。

関連項目:

エラー・ハンドラの管理

26.4.4 各適用プロセスのメッセージ・ハンドラの表示

データベース内の各メッセージ・ハンドラを表示するには、次の問合せを実行します。

COLUMN APPLY_NAME HEADING 'Apply Process Name' FORMAT A20
COLUMN MESSAGE_HANDLER HEADING 'Message Handler' FORMAT A20

SELECT APPLY_NAME, MESSAGE_HANDLER FROM DBA_APPLY
  WHERE MESSAGE_HANDLER IS NOT NULL;

出力は次のようになります。

Apply Process Name   Message Handler
-------------------- --------------------
STRM03_APPLY         "OE"."MES_HANDLER"

26.4.5 各適用プロセスのプリコミット・ハンドラの表示

この項で説明する問合せを実行すると、データベース内の適用プロセスで使用される各プリコミット・ハンドラに関する情報を表示できます。

データベース内の各プリコミット・ハンドラに関する前述の情報を表示するには、次の問合せを実行します。

COLUMN APPLY_NAME HEADING 'Apply Process Name' FORMAT A15
COLUMN PRECOMMIT_HANDLER HEADING 'Precommit Handler' FORMAT A30
COLUMN APPLY_CAPTURED HEADING 'Applies Captured|Messages?' FORMAT A20

SELECT APPLY_NAME, PRECOMMIT_HANDLER, APPLY_CAPTURED
  FROM DBA_APPLY
  WHERE PRECOMMIT_HANDLER IS NOT NULL;

出力は次のようになります。

                                                    Applies Captured
Apply Process Name   Precommit Handler              Messages?
-------------------- ------------------------------ --------------------
STRM01_APPLY         "STRMADMIN"."HISTORY_COMMIT"   YES

26.5 各適用プロセスに関するセッション情報の表示

この項で説明する問合せを実行すると、データベース内の適用プロセスに関連付けられる各セッションに関する次のセッション情報が表示されます。

  • 適用プロセスのコンポーネント

  • セッション識別子

  • シリアル番号

  • オペレーション・システムのプロセス識別番号

  • コーディネータ・プロセス、リーダー・プロセスおよび適用サーバーの各プロセス名

データベースの各取得プロセスに関する前述の情報を表示するには、次の問合せを実行します。

COLUMN ACTION HEADING 'Apply Process Component' FORMAT A30
COLUMN SID HEADING 'Session ID' FORMAT 99999
COLUMN SERIAL# HEADING 'Session|Serial|Number' FORMAT 99999999
COLUMN PROCESS HEADING 'Operating System|Process Number' FORMAT A17
COLUMN PROCESS_NAME HEADING 'Process|Names' FORMAT A7
 
SELECT /*+PARAM('_module_action_old_length',0)*/ ACTION,
       SID,
       SERIAL#,
       PROCESS,
       SUBSTR(PROGRAM,INSTR(PROGRAM,'(')+1,4) PROCESS_NAME
  FROM V$SESSION
  WHERE MODULE ='Streams' AND
        ACTION LIKE '%Apply%';

出力は次のようになります。

                                            Session
                                             Serial Operating System  Process
Apply Process Component        Session ID    Number Process Number    Names
------------------------------ ---------- --------- ----------------- -------
APPLY$_EMDBB_3 - Apply Coordin         17      3040 9863              AP01
ator
APPLY$_EMDBB_3 - Apply Server          58     52788 9869              AS02
APPLY$_EMDBB_3 - Apply Reader          63        21 9865              AS01
APPLY$_EMDBB_3 - Apply Server          64        37 9872              AS03
APPLY$_EMDBB_3 - Apply Server          67        22 9875              AS04
APPLY$_EMDBB_3 - Apply Server          69         1 9877              AS05

26.6 各適用プロセスのリーダー・サーバーに関する情報の表示

適用プロセスリーダー・サーバーは、キューからのメッセージをデキューします。リーダー・サーバーは、LCR間の依存性を計算してメッセージをトランザクションにアセンブルするプロセスです。リーダー・サーバーが、アセンブルしたトランザクションをコーディネータに返すと、コーディネータがアイドル状態の適用サーバーにトランザクションを割り当てます。

この項で説明する問合せを実行すると、各適用プロセスのリーダー・サーバーに関する次の情報が表示されます。

  • 適用プロセスの名前

  • リーダー・サーバーによってデキューされたメッセージのタイプ。適用プロセスでは、取得LCRをデキューするか、または永続LCR永続ユーザー・メッセージをデキューできます。

  • リーダー・サーバーで使用されるプロセスの名前。プロセスの名前の形式は、ASnnです(nnには文字および数字を使用できます)。

  • リーダー・サーバーの現在の状態

    リーダー・サーバーの状態を参照してください。

  • 適用プロセスが最後に起動されてから、リーダー・サーバーがデキューしたメッセージの合計数。

この問合せで表示される情報は、有効になっている適用プロセスに対してのみ有効です。

次の問合せを実行すると、各適用プロセスに関する前述の情報が表示されます。

COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A15
COLUMN APPLY_CAPTURED HEADING 'Dequeues Captured|Messages?' FORMAT A17
COLUMN PROCESS_NAME HEADING 'Process|Name' FORMAT A7
COLUMN STATE HEADING 'State' FORMAT A17
COLUMN TOTAL_MESSAGES_DEQUEUED HEADING 'Total Messages|Dequeued' FORMAT 99999999

SELECT r.APPLY_NAME,
       ap.APPLY_CAPTURED,
       SUBSTR(s.PROGRAM,INSTR(s.PROGRAM,'(')+1,4) PROCESS_NAME,
       r.STATE,
       r.TOTAL_MESSAGES_DEQUEUED
       FROM V$STREAMS_APPLY_READER r, V$SESSION s, DBA_APPLY ap 
       WHERE r.SID = s.SID AND 
             r.SERIAL# = s.SERIAL# AND 
             r.APPLY_NAME = ap.APPLY_NAME;

出力は次のようになります。

Apply Process   Dequeues Captured Process                   Total Messages
Name            Messages?         Name    State                   Dequeued
--------------- ----------------- ------- ----------------- --------------
APPLY_SPOKE     YES               AS01    DEQUEUE MESSAGES              54

26.7 各適用プロセスによってオーバーフローしたトランザクションおよびメッセージの監視

txn_lcr_spill_threshold適用プロセス・パラメータがINFINITE以外の値に設定されている場合、トランザクション内のメッセージの数が指定された数を超えると、適用プロセスによって、メモリーからハード・ディスクにメッセージをオーバーフローできます。

この項で説明する最初の問合せを実行すると、メッセージがオーバーフローした適用プロセスに対して現在適用されている各トランザクションに関する次の情報が表示されます。

  • 適用プロセスの名前

  • メッセージがオーバーフローしたトランザクションのトランザクションID。

  • トランザクションの最初のメッセージのシステム変更番号(SCN)。

  • トランザクションで現在オーバーフローしているメッセージの数。

データベース内の各適用プロセスに関する前述の情報を表示するには、次の問合せを実行します。

COLUMN APPLY_NAME HEADING 'Apply Name' FORMAT A20
COLUMN 'Transaction ID' HEADING 'Transaction ID' FORMAT A15
COLUMN FIRST_SCN HEADING 'First SCN'   FORMAT 99999999
COLUMN MESSAGE_COUNT HEADING 'Message Count' FORMAT 99999999
 
SELECT APPLY_NAME,
       XIDUSN ||'.'|| 
       XIDSLT ||'.'||
       XIDSQN "Transaction ID",
       FIRST_SCN,
       MESSAGE_COUNT
  FROM DBA_APPLY_SPILL_TXN;

出力は次のようになります。

Apply Name           Transaction ID  First SCN Message Count
-------------------- --------------- --------- -------------
APPLY_HR             1.42.2277         2246944           100

この項で説明する次の問合せを実行すると、ローカル・データベース内の適用プロセスによってオーバーフローしたメッセージに関する次の情報が表示されます。

  • 適用プロセスの名前

  • 適用プロセスが最後に起動されてからオーバーフローしたメッセージの合計数。

  • 適用プロセスでメッセージのオーバーフローにかかった時間(秒単位)。

データベース内の各適用プロセスに関する前述の情報を表示するには、次の問合せを実行します。

COLUMN APPLY_NAME HEADING 'Apply Name' FORMAT A15
COLUMN TOTAL_MESSAGES_SPILLED HEADING 'Total|Spilled Messages' FORMAT 99999999
COLUMN ELAPSED_SPILL_TIME HEADING 'Elapsed Time|Spilling Messages' FORMAT 99999999.99

SELECT APPLY_NAME,
       TOTAL_MESSAGES_SPILLED,
       (ELAPSED_SPILL_TIME/100) ELAPSED_SPILL_TIME
  FROM V$STREAMS_APPLY_READER;

出力は次のようになります。

                           Total      Elapsed Time
Apply Name      Spilled Messages Spilling Messages
--------------- ---------------- -----------------
APPLY_HR                     100              2.67

注意:

メッセージのオーバーフローの経過時間は秒単位で表示されます。V$STREAMS_APPLY_READERビューには、経過時間はデフォルトでセンチセカンドで表示されます。センチセカンドは、100分の1秒です。この項で説明する問合せを実行すると、各経過時間が100で割られ、秒単位で表示されます。

26.8 メッセージが取得されてからデキューされるまでの待機時間の確認

この項で説明する問合せを実行すると、各適用プロセスによってデキューされた最後のメッセージに関する情報が表示されます。

  • 適用プロセスの名前。

  • 待機時間。取得LCRの場合、待機時間は、ソース・データベースでメッセージが作成されてから適用プロセスでデキューされるまでの時間です。他のタイプのメッセージの場合、待機時間は、ローカル・データベースでメッセージがエンキューされてから適用プロセスでデキューされるまでの時間です。

  • メッセージ作成時刻。取得LCRの場合、メッセージ作成時刻は、データ操作言語(DML)またはデータ定義言語(DDL)の変更によって、ソース・データベースでメッセージに関するREDOデータが生成された時刻です。アプリケーションまたは適用プロセスによってエンキューされたメッセージの場合、メッセージ作成時刻は、メッセージが最後にエンキューされた時刻です。メッセージは、適用プロセスに到達する前に、伝播によって1回以上エンキューされることがあります。

  • メッセージが適用プロセスによってデキューされた時刻。

  • 適用プロセスによって最後にデキューされたメッセージのメッセージ番号。

この問合せで表示される情報は、有効になっている適用プロセスに対してのみ有効です。

次の問合せを実行すると、各適用プロセスに関する前述の情報が表示されます。

COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A17
COLUMN LATENCY HEADING 'Latency|in|Seconds' FORMAT 999999
COLUMN CREATION HEADING 'Message Creation' FORMAT A17
COLUMN LAST_DEQUEUE HEADING 'Last Dequeue Time' FORMAT A20
COLUMN DEQUEUED_MESSAGE_NUMBER HEADING 'Dequeued|Message Number' FORMAT 9999999999

SELECT APPLY_NAME,
     (DEQUEUE_TIME-DEQUEUED_MESSAGE_CREATE_TIME)*86400 LATENCY,
     TO_CHAR(DEQUEUED_MESSAGE_CREATE_TIME,'HH24:MI:SS MM/DD/YY') CREATION,
     TO_CHAR(DEQUEUE_TIME,'HH24:MI:SS MM/DD/YY') LAST_DEQUEUE,
     DEQUEUED_MESSAGE_NUMBER  
  FROM V$STREAMS_APPLY_READER;

出力は次のようになります。

                  Latency
Apply Process          in                                              Dequeued
Name              Seconds Message Creation  Last Dequeue Time    Message Number
----------------- ------- ----------------- -------------------- --------------
APPLY$_STM1_14          1 15:22:15 06/13/05 15:22:16 06/13/05            502129

26.9 各コーディネータ・プロセスに関する一般情報の表示

コーディネータ・プロセスは、リーダー・サーバーからトランザクションを取得して適用サーバーに渡します。コーディネータ・プロセスの名前はAPnnです(nnはコーディネータ・プロセス番号)。

この項で説明する問合せを実行すると、各適用プロセスのコーディネータ・プロセスに関する次の情報が表示されます。

  • 適用プロセスの名前。

  • プロセスの名前APnn内のコーディネータの番号(nnには文字および数字を使用できます)

  • コーディネータのセッションのセッション識別子。

  • コーディネータのセッションのシリアル番号。

  • コーディネータの現在の状態

    コーディネータ・プロセスの状態を参照してください。

この問合せで表示される情報は、有効になっている適用プロセスに対してのみ有効です。

次の問合せを実行すると、各適用プロセスに関する前述の情報が表示されます。

COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A17
COLUMN PROCESS_NAME HEADING 'Coordinator|Process|Name' FORMAT A11
COLUMN SID HEADING 'Session|ID' FORMAT 9999
COLUMN SERIAL# HEADING 'Session|Serial|Number' FORMAT 9999
COLUMN STATE HEADING 'State' FORMAT A21

SELECT c.APPLY_NAME,
       SUBSTR(s.PROGRAM,INSTR(s.PROGRAM,'(')+1,4) PROCESS_NAME,
       c.SID,
       c.SERIAL#,
       c.STATE
       FROM V$STREAMS_APPLY_COORDINATOR c, V$SESSION s
       WHERE c.SID = s.SID AND
             c.SERIAL# = s.SERIAL#;

出力は次のようになります。

                  Coordinator         Session
Apply Process     Process     Session  Serial
Name              Name             ID  Number State
----------------- ----------- ------- ------- ---------------------
APPLY_SPOKE       AP01            944       5 IDLE

26.10 受信および適用されたトランザクションに関する情報の表示

この項で説明する問合せを実行すると、各適用プロセスによって受信および適用されたトランザクションと現在適用されているトランザクションに関する次の情報が表示されます。

  • 適用プロセスの名前。

  • 適用プロセスが最後に起動されてから、コーディネータ・プロセスが受信したトランザクションの合計数。

  • 適用プロセスが最後に起動されてから、適用プロセスによって正常に適用されたトランザクションの合計数。

  • 適用プロセスが最後に起動されてから、適用プロセスによって適用され、適用エラーが発生したトランザクションの合計数。

  • 適用プロセスによって現在適用されているトランザクションの合計数。

  • コーディネータ・プロセスによって受信されたが、適用プロセスに割り当てられていない完全なトランザクションの合計数。

  • 適用プロセスが最後に起動されてから、適用プロセスによってトランザクションがすでに適用されていたため、コーディネータ・プロセスが受信しても無視したトランザクションの合計数。

この問合せで表示される情報は、有効になっている適用プロセスに対してのみ有効です。

たとえば、適用プロセスapplyに関する前述の情報を表示するには、次の問合せを実行します。

COLUMN APPLY_NAME HEADING 'Apply Process Name' FORMAT A20
COLUMN TOTAL_RECEIVED HEADING 'Total|Trans|Received' FORMAT 99999999
COLUMN TOTAL_APPLIED HEADING 'Total|Trans|Applied' FORMAT 99999999
COLUMN TOTAL_ERRORS HEADING 'Total|Apply|Errors' FORMAT 9999
COLUMN BEING_APPLIED HEADING 'Total|Trans Being|Applied' FORMAT 99999999
COLUMN UNASSIGNED_COMPLETE_TXNS HEADING 'Total|Unnasigned|Trans' FORMAT 99999999
COLUMN TOTAL_IGNORED HEADING 'Total|Trans|Ignored' FORMAT 99999999
 
SELECT APPLY_NAME,
       TOTAL_RECEIVED,
       TOTAL_APPLIED,
       TOTAL_ERRORS,
       (TOTAL_ASSIGNED - (TOTAL_ROLLBACKS + TOTAL_APPLIED)) BEING_APPLIED,
       UNASSIGNED_COMPLETE_TXNS,
       TOTAL_IGNORED 
       FROM V$STREAMS_APPLY_COORDINATOR;

出力は次のようになります。

                         Total     Total  Total       Total      Total     Total
                         Trans     Trans  Apply Trans Being Unnasigned     Trans
Apply Process Name    Received   Applied Errors     Applied      Trans   Ignored
-------------------- --------- --------- ------ ----------- ---------- ---------
APPLY_FROM_MULT1            81        73      2           6          4         0
APPLY_FROM_MULT2           114        96      0          14          7         4

26.11 各適用プロセスのメッセージが取得されてから適用されるまでの待機時間の確認

この項では、特定のメッセージに関して取得から適用までの待機時間を表示する2つの異なる問合せについて説明します。つまり、これらの問合せでは、ソース・データベースでメッセージが作成されてから、適用プロセスで適用されるまでの時間が表示されます。一方の問合せでは、V$STREAMS_APPLY_COORDINATOR動的パフォーマンス・ビューが使用されます。もう一方の問合せでは、DBA_APPLY_PROGRESS静的データ・ディクショナリ・ビューが使用されます。

これらの2つの問合せは、次の点で異なっています。

  • V$STREAMS_APPLY_COORDINATORビューに対する問合せは、取得LCRまたは永続LCRが取得されてから適用されるまでの待機時間を確認する場合に使用できます。一方、DBA_APPLY_PROGRESSビューに対する問合せは、取得LCRの結果のみを戻します。

  • V$STREAMS_APPLY_COORDINATORビューに対する問合せを実行する場合は、適用プロセスが有効になっている必要がありますが、DBA_APPLY_PROGRESSビューに対する問合せは、適用プロセスが有効または無効のいずれの場合でも実行できます。したがって、適用プロセスが現在無効になっており、取得プロセスによって変更の取得が実行される場合は、DBA_APPLY_PROGRESSビューに対する問合せを実行して、取得から適用までの待機時間を確認します。

  • V$STREAMS_APPLY_COORDINATORビューに対する問合せでは、DBA_APPLY_PROGRESSビューに対する問合せより新しいトランザクションの待機時間を表示できます。

いずれの問合せでも、各適用プロセスによって適用されたメッセージに関する次の情報が表示されます。

  • 適用プロセスの名前。

  • メッセージが取得されてから適用されるまでの待機時間。

  • メッセージ作成時刻。

    取得LCRの場合、メッセージ作成時刻は、データ操作言語(DML)またはデータ定義言語(DDL)の変更によって、ソース・データベースでメッセージに関するREDOデータが生成された時刻です。

    永続LCRの場合、メッセージ作成時刻は、LCRが作成された時刻です。

  • メッセージが適用プロセスによって適用された時刻。

  • メッセージのメッセージ番号。

注意:

これらの問合せは、永続ユーザー・メッセージには関連していません。

26.11.1 待機時間に関するV$STREAMS_APPLY_COORDINATORの問合せの例

V$STREAMS_APPLY_COORDINATORビューを使用して次の問合せを実行すると、各適用プロセスの取得LCRまたは永続LCRの取得から適用までの待機時間が表示されます。

COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A13
COLUMN 'Latency in Seconds' FORMAT 999999
COLUMN 'Message Creation' FORMAT A17
COLUMN 'Apply Time' FORMAT A17
COLUMN HWM_MESSAGE_NUMBER HEADING 'Applied|Message|Number' FORMAT 9999999999

SELECT APPLY_NAME,
     (HWM_TIME-HWM_MESSAGE_CREATE_TIME)*86400 "Latency in Seconds",
     TO_CHAR(HWM_MESSAGE_CREATE_TIME,'HH24:MI:SS MM/DD/YY') 
        "Message Creation",
     TO_CHAR(HWM_TIME,'HH24:MI:SS MM/DD/YY') "Apply Time",
     HWM_MESSAGE_NUMBER  
  FROM V$STREAMS_APPLY_COORDINATOR;

出力は次のようになります。

Apply Process                                                            Message
Name          Latency in Seconds Message Creation  Apply Time             Number
------------- ------------------ ----------------- ----------------- -----------
APPLY$_DA_2                    2 13:00:10 07/14/10 13:00:12 07/14/10      672733

26.11.2 待機時間に関するDBA_APPLY_PROGRESSの問合せの例

DBA_APPLY_PROGRESSビューを使用して次の問合せを実行すると、各適用プロセスの取得LCRの取得から適用までの待機時間が表示されます。

COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A17
COLUMN 'Latency in Seconds' FORMAT 999999
COLUMN 'Message Creation' FORMAT A17
COLUMN 'Apply Time' FORMAT A17
COLUMN APPLIED_MESSAGE_NUMBER HEADING 'Applied|Message|Number' FORMAT 9999999999

SELECT APPLY_NAME,
     (APPLY_TIME-APPLIED_MESSAGE_CREATE_TIME)*86400 "Latency in Seconds",
     TO_CHAR(APPLIED_MESSAGE_CREATE_TIME,'HH24:MI:SS MM/DD/YY') 
        "Message Creation",
     TO_CHAR(APPLY_TIME,'HH24:MI:SS MM/DD/YY') "Apply Time",
     APPLIED_MESSAGE_NUMBER  
  FROM DBA_APPLY_PROGRESS;

出力は次のようになります。

                                                                         Applied
Apply Process                                                            Message
Name              Latency in Seconds Message Creation  Apply Time         Number
----------------- ------------------ ----------------- ----------------- -------
APPLY$_STM1_14                    33 14:05:13 06/13/05 14:05:46 06/13/05  498215

26.12 各適用プロセスの適用サーバーに関する情報の表示

適用プロセスでは、1つ以上の適用サーバーを使用できます。適用サーバーによって、LCRは、DML文またはDDL文としてデータベース・オブジェクトに適用されるか、または適切なハンドラに渡されます。LCR以外のメッセージの場合、それらのメッセージは、適用サーバーによってメッセージ・ハンドラに渡されます。各適用サーバーはプロセスです。

この項で説明する問合せを実行すると、各適用プロセスの適用サーバーに関する次の情報が表示されます。

  • 適用プロセスの名前。

  • リーダー・サーバー・プロセスの名前(順に表示されます)。各プロセスの名前の形式は、ASnnです(nnには文字および数字を使用できます)。

  • 各適用サーバーの現在の状態

    適用サーバーの状態を参照してください。

  • 適用プロセスが最後に起動されてから、各適用サーバーに割り当てられたトランザクションの合計数。トランザクションには、複数のメッセージが含まれる場合があります。

  • 適用プロセスが最後に起動されてから、各適用サーバーによって適用されたメッセージの合計数。

この問合せで表示される情報は、有効になっている適用プロセスに対してのみ有効です。

次の問合せを実行すると、各適用プロセスの適用サーバーに関する情報が表示されます。

COLUMN APPLY_NAME HEADING 'Apply Process Name' FORMAT A22
COLUMN PROCESS_NAME HEADING 'Process Name' FORMAT A12
COLUMN STATE HEADING 'State' FORMAT A17
COLUMN TOTAL_ASSIGNED HEADING 'Total|Transactions|Assigned' FORMAT 99999999
COLUMN TOTAL_MESSAGES_APPLIED HEADING 'Total|Messages|Applied' FORMAT 99999999

SELECT r.APPLY_NAME,
       SUBSTR(s.PROGRAM,INSTR(S.PROGRAM,'(')+1,4) PROCESS_NAME,
       r.STATE,
       r.TOTAL_ASSIGNED, 
       r.TOTAL_MESSAGES_APPLIED
  FROM V$STREAMS_APPLY_SERVER R, V$SESSION S 
  WHERE r.SID = s.SID AND 
        r.SERIAL# = s.SERIAL# 
  ORDER BY r.APPLY_NAME, r.SERVER_ID;

出力は次のようになります。

                                                             Total     Total
                                                      Transactions  Messages
Apply Process Name     Process Name State                 Assigned   Applied
---------------------- ------------ ----------------- ------------ ---------
APPLY$_DA_2            AS02         IDLE                      1012    109190
APPLY$_DA_2            AS03         IDLE                       996    107568
APPLY$_DA_2            AS04         IDLE                      1006    108648
APPLY$_DA_2            AS05         IDLE                       987    10659
6

26.13 適用プロセスの有効な適用並列性の表示

環境によっては、適用プロセスで、使用可能なすべての適用サーバーを使用できない場合があります。たとえば、適用プロセスの並列性を5に設定しても、その適用プロセスで3つの適用サーバーのみが使用される場合があります。この場合、有効な適用並列性は3です。

次の問合せを実行すると、適用プロセスapplyの有効な適用並列性が表示されます。

SELECT COUNT(SERVER_ID) "Effective Parallelism"
  FROM V$STREAMS_APPLY_SERVER
  WHERE APPLY_NAME = 'APPLY' AND
        TOTAL_MESSAGES_APPLIED > 0;

出力は次のようになります。

Effective Parallelism
---------------------
                    2

この問合せでは、有効な並列性として2が戻されています。適用プロセスapplyの並列性が3に設定されている場合は、適用プロセスが最後に起動されてから使用されていない適用サーバーが1つあることになります。

各適用サーバーによって適用されるメッセージの合計数を表示するには、次の問合せを実行します。

COLUMN SERVER_ID HEADING 'Apply Server ID' FORMAT 99
COLUMN TOTAL_MESSAGES_APPLIED HEADING 'Total Messages Applied' FORMAT 999999

SELECT SERVER_ID, TOTAL_MESSAGES_APPLIED 
  FROM V$STREAMS_APPLY_SERVER
  WHERE APPLY_NAME = 'APPLY'
  ORDER BY SERVER_ID;

出力は次のようになります。

Apply Server ID Total Messages Applied
--------------- ----------------------
              1                   2141
              2                    276
              3                      0
              4                      0

この場合、適用サーバー3および4は、適用プロセスが最後に起動されてから使用されていません。適用プロセスのparallelismがその適用プロセスの有効な並列性より大幅に大きい値に設定されている場合は、parallelismを小さい値に設定することを検討します。たとえば、parallelismが6に設定されているが、適用プロセスの有効な並列性が2である場合、小さい値に設定することを検討します。

26.14 適用時に宛先キューを指定するルールの表示

ルール宛先キューを指定するには、DBMS_APPLY_ADMパッケージのSET_ENQUEUE_DESTINATIONプロシージャを使用します。宛先キューを指定したルールが適用プロセスポジティブ・ルール・セットに含まれており、メッセージがそのルールを満たす場合、このメッセージは適用プロセスによって宛先キューにエンキューされます。

ルールの宛先キューの設定を表示するには、次の問合せを実行します。

COLUMN RULE_OWNER HEADING 'Rule Owner' FORMAT A15
COLUMN RULE_NAME HEADING 'Rule Name' FORMAT A15
COLUMN DESTINATION_QUEUE_NAME HEADING 'Destination Queue' FORMAT A30

SELECT RULE_OWNER, RULE_NAME, DESTINATION_QUEUE_NAME
  FROM DBA_APPLY_ENQUEUE;

出力は次のようになります。

Rule Owner      Rule Name       Destination Queue
--------------- --------------- ------------------------------
STRMADMIN       DEPARTMENTS17   "STRMADMIN"."STREAMS_QUEUE"

26.15 適用時に実行しないことを指定するルールの表示

ルールの実行ディレクティブを指定するには、DBMS_APPLY_ADMパッケージのSET_EXECUTEプロシージャを使用します。実行ディレクティブによって、指定したルールを満たすメッセージ適用プロセスで実行するかどうかが制御されます。適用プロセスのポジティブ・ルール・セットに、実行ディレクティブがNOに設定されたルールが含まれており、メッセージがそのルールを満たす場合、このメッセージは、適用プロセスによって実行されず、適用ハンドラにも送信されません。

実行ディレクティブがNOに設定された各ルールを表示するには、次の問合せを実行します。

COLUMN RULE_OWNER HEADING 'Rule Owner' FORMAT A20
COLUMN RULE_NAME HEADING 'Rule Name' FORMAT A20

SELECT RULE_OWNER, RULE_NAME
  FROM DBA_APPLY_EXECUTE
  WHERE EXECUTE_EVENT = 'NO';

出力は次のようになります。

Rule Owner           Rule Name
-------------------- --------------------
STRMADMIN            DEPARTMENTS18

26.16 取得と適用の複合を使用する適用プロセスの判別

取得プロセスは論理変更レコード(LCR)を 伝播受信者に直接送信する伝播送信者として動作するため、取得と適用の複合環境は効率的です。

適用プロセスで取得と適用の複合が使用される場合、V$STREAMS_APPLY_READERデータ・ディクショナリ・ビューの次の列が移入されます。

  • PROXY_SID: 伝播受信者のセッションIDが表示されます。

  • PROXY_SERIAL: 伝播受信者のシリアル番号が表示されます。

  • PROXY_SPID: 伝播受信者のプロセス識別番号が表示されます。

  • CAPTURE_BYTES_RECEIVED: 適用プロセスが最後に起動されてから受信したバイト数が表示されます。

適用プロセスで取得と適用の複合が使用されない場合、PROXY_SIDおよびPROXY_SERIAL列は0(ゼロ)になり、PROXY_SPIDおよびCAPTURE_BYTES_RECEIVED列は移入されません。

適用プロセスで取得と適用の複合が使用されるかどうかを判別するには、次の問合せを実行します。

COLUMN APPLY_NAME HEADING 'Apply Process Name' FORMAT A20
COLUMN PROXY_SID HEADING 'Propagation|Receiver|Session ID' FORMAT 99999999
COLUMN PROXY_SERIAL HEADING 'Propagation|ReceiverSerial|Number' FORMAT 99999999
COLUMN PROXY_SPID HEADING 'Propagation|Receiver|Process ID' FORMAT 99999999999
COLUMN CAPTURE_BYTES_RECEIVED HEADING 'Number of|Bytes Received' FORMAT 9999999999

SELECT APPLY_NAME,
       PROXY_SID,
       PROXY_SERIAL,
       PROXY_SPID,
       CAPTURE_BYTES_RECEIVED
   FROM V$STREAMS_APPLY_READER;

出力は次のようになります。

                     Propagation    Propagation Propagation
                        Receiver ReceiverSerial Receiver          Number of
Apply Process Name    Session ID         Number Process ID   Bytes Received
-------------------- ----------- -------------- ------------ --------------
APPLY_SPOKE1                 940              1 22636               4358614
APPLY_SPOKE2                 928              4 29154               4310581

この出力は、適用プロセスapply_spoke1で取得と適用の複合が使用されていることを示しています。この適用プロセスは、最後に起動されてから、4358614バイトを取得プロセスから受信しています。適用プロセスapply_spoke2でも取得と適用の複合が使用されています。この適用プロセスは、最後に起動されてから、4310581バイトを取得プロセスから受信しています。

26.17 宛先データベースで指定された代替キー列の表示

宛先データベースで代替キー(Oracleが適用時に表内の行を識別するのに使用できる列または列セット)を指定できます。代替キー列を使用して主キーが存在しない表のキー列を指定したり、宛先データベースで表が任意の適用プロセスによって処理されるときに代替キー列を表の主キーのかわりに使用できます。

宛先データベースで指定されたすべての代替キー列を表示するには、次の問合せを実行します。

COLUMN OBJECT_OWNER HEADING 'Table Owner' FORMAT A20
COLUMN OBJECT_NAME HEADING 'Table Name' FORMAT A20
COLUMN COLUMN_NAME HEADING 'Substitute Key Name' FORMAT A20
COLUMN APPLY_DATABASE_LINK HEADING 'Database Link|for Remote|Apply' FORMAT A15

SELECT OBJECT_OWNER, OBJECT_NAME, COLUMN_NAME, APPLY_DATABASE_LINK 
  FROM DBA_APPLY_KEY_COLUMNS
  ORDER BY APPLY_DATABASE_LINK, OBJECT_OWNER, OBJECT_NAME;

出力は次のようになります。

                                                               Database Link
                                                               for Remote
Table Owner          Table Name           Substitute Key Name  Apply
-------------------- -------------------- -------------------- ---------------
HR                   DEPARTMENTS          DEPARTMENT_NAME
HR                   DEPARTMENTS          LOCATION_ID
HR                   EMPLOYEES            FIRST_NAME
HR                   EMPLOYEES            LAST_NAME
HR                   EMPLOYEES            HIRE_DATE

注意:

この問合せを実行すると、代替キー列がOracle以外のリモート・データベースに対して指定されている場合、最後の列にデータベース・リンクが表示されます。代替キー列がローカルの宛先データベースに対して指定されている場合、最後の列はNULLとなります。

26.18 仮想依存性定義の監視

次の各項では、データベース内の仮想依存性定義に関する情報を表示する問合せについて説明します。

関連項目:

仮想依存性定義の詳細は、適用プロセスおよび依存性を参照

26.18.1 値の依存性の表示

データベース内の値の依存性を表示するには、次の問合せを実行します。

COLUMN DEPENDENCY_NAME HEADING 'Dependency Name' FORMAT A25
COLUMN OBJECT_OWNER HEADING 'Object Owner' FORMAT A15
COLUMN OBJECT_NAME HEADING 'Object Name' FORMAT A20
COLUMN COLUMN_NAME HEADING 'Column Name' FORMAT A15

SELECT DEPENDENCY_NAME, 
       OBJECT_OWNER, 
       OBJECT_NAME, 
       COLUMN_NAME 
  FROM DBA_APPLY_VALUE_DEPENDENCIES;

出力は次のようになります。

Dependency Name           Object Owner    Object Name          Column Name
------------------------- --------------- -------------------- ---------------
ORDER_ID_FOREIGN_KEY      OE              ORDERS               ORDER_ID
ORDER_ID_FOREIGN_KEY      OE              ORDER_ITEMS          ORDER_ID
KEY_53_FOREIGN_KEY        US_DESIGNS      ALL_DESIGNS_SUMMARY  KEY_53
KEY_53_FOREIGN_KEY        US_DESIGNS      DESIGN_53            KEY_53

この出力は、次の値の依存性を示しています。

  • order_id_foreign_keyという値の依存性は、oe.orders表のorder_id列とoe.order_items表のorder_id列との間の依存性を示しています。

  • key_53_foreign_keyという値の依存性は、us_designs.all_designs_summary表のkey_53列とus_designs.design_53表のkey_53列との間の依存性を示しています。

26.18.2 オブジェクト依存性の表示

データベース内のオブジェクト依存性を表示するには、次の問合せを実行します。

COLUMN OBJECT_OWNER HEADING 'Object Owner' FORMAT A15
COLUMN OBJECT_NAME HEADING 'Object Name' FORMAT A15
COLUMN PARENT_OBJECT_OWNER HEADING 'Parent Object Owner' FORMAT A20
COLUMN PARENT_OBJECT_NAME HEADING 'Parent Object Name' FORMAT A20

SELECT OBJECT_OWNER, 
       OBJECT_NAME, 
       PARENT_OBJECT_OWNER, 
       PARENT_OBJECT_NAME 
  FROM DBA_APPLY_OBJECT_DEPENDENCIES;

出力は次のようになります。

Object Owner    Object Name     Parent Object Owner  Parent Object Name
--------------- --------------- -------------------- --------------------
ORD             CUSTOMERS       ORD                  SHIP_ORDERS
ORD             ORDERS          ORD                  SHIP_ORDERS
ORD             ORDER_ITEMS     ORD                  SHIP_ORDERS

この出力は、ord.ship_orders表が次の子表の親表であるオブジェクト依存性を示しています。

  • ord.customers

  • ord.orders

  • ord.order_items

26.19 適用エラーのチェック

適用エラーの有無をチェックするには、次の問合せを実行します。

COLUMN APPLY_NAME HEADING 'Apply|Process|Name' FORMAT A11
COLUMN SOURCE_DATABASE HEADING 'Source|Database' FORMAT A10
COLUMN LOCAL_TRANSACTION_ID HEADING 'Local|Transaction|ID' FORMAT A11
COLUMN ERROR_NUMBER HEADING 'Error Number' FORMAT 99999999
COLUMN ERROR_MESSAGE HEADING 'Error Message' FORMAT A20
COLUMN MESSAGE_COUNT HEADING 'Messages in|Error|Transaction' FORMAT 99999999

SELECT APPLY_NAME, 
       SOURCE_DATABASE, 
       LOCAL_TRANSACTION_ID, 
       ERROR_NUMBER,
       ERROR_MESSAGE,
       MESSAGE_COUNT
  FROM DBA_APPLY_ERROR;

適用エラーがある場合、出力は次のようになります。

Apply                  Local                                         Messages in
Process     Source     Transaction                                         Error
Name        Database   ID          Error Number Error Message        Transaction
----------- ---------- ----------- ------------ -------------------- -----------
APPLY$_DB_2 DB.EXAMPLE 13.16.334          26786 ORA-26786: A row wit           1
            .COM                                h key ("EMPLOYEE_ID"
                                                ) = (206) exists but
                                                 has conflicting col
                                                umn(s) "SALARY" in t
                                                able HR.EMPLOYEES
                                                ORA-01403: no data f
                                                ound
APPLY$_DB_2 DB.EXAMPLE 15.17.540          26786 ORA-26786: A row wit           1
            .COM                                h key ("EMPLOYEE_ID"
                                                ) = (206) exists but
                                                 has conflicting col
                                                umn(s) "SALARY" in t
                                                able HR.EMPLOYEES
                                                ORA-01403: no data f
                                                ound

適用エラーがある場合は、エラーが発生したトランザクションを再実行するか、またはそのトランザクションを削除することができます。エラーが発生したトランザクションを再実行する場合は、まず、トランザクションでエラーが発生する原因となった状態を修正します。

エラーが発生したトランザクションを削除する場合、複数のデータベースでデータを共有しているときは、手動によるデータの再同期化が必要になることがあります。データを手動で再同期化する場合は、必要に応じて適切なセッション・タグを設定してください。

関連項目:

26.20 適用エラーの詳細情報の表示

この項では、データベースのエラー・キューにあるエラー・トランザクションの詳細情報を表示するために使用できるSQLスクリプトについて説明します。これらのスクリプトはLCRの情報を表示するように設計されていますが、環境で使用される非LCRメッセージ情報を表示するようにも拡張できます。

これらのスクリプトを使用するには、次の手順を実行します。

  1. 手順1: DBA_APPLY_ERRORビューに対する明示的なSELECT権限の付与

  2. 手順2: ANYDATAオブジェクト内の値を出力するプロシージャの作成

  3. 手順3: 指定したLCRを出力するプロシージャの作成

  4. 手順4: エラー・キューにあるすべてのLCRを出力するプロシージャの作成

  5. 手順5: トランザクションに関するすべてのエラーLCRを出力するプロシージャの作成

注意:

これらのスクリプトでは、LCR内のVARCHAR2値の最初の253文字のみが表示されます。

手順1: DBA_APPLY_ERRORビューに対する明示的なSELECT権限の付与

ここで説明するprint_errorsおよびprint_transactionプロシージャを作成して実行するユーザーには、DBA_APPLY_ERRORデータ・ディクショナリ・ビューに対する明示的なSELECT権限が付与されている必要があります。この権限は、ロールを介しては付与できません。ユーザーに対してDBMS_STREAMS_AUTHパッケージのGRANT_ADMIN_PRIVILEGEプロシージャを実行すると、そのユーザーにこの権限が付与されます。

ユーザーにこの権限を直接付与するには、次の手順を実行します。

  1. SQL*Plusで、権限を付与できる管理ユーザーとして接続します。

    SQL*Plusでデータベースに接続する方法については、『Oracle Database管理者ガイド』を参照してください。

  2. DBA_APPLY_ERRORデータ・ディクショナリ・ビューに対するSELECT権限を適切なユーザーに付与します。たとえば、この権限をstrmadminユーザーに付与するには、次の文を実行します。

    GRANT SELECT ON DBA_APPLY_ERROR TO strmadmin;
    
  3. DBMS_APPLY_ADMパッケージのEXECUTE権限を付与します。たとえば、この権限をstrmadminユーザーに付与するには、次の文を実行します。

    GRANT EXECUTE ON DBMS_APPLY_ADM TO strmadmin;
    
  4. 手順2および3で権限を付与したユーザーとして、データベースに接続します。

手順2: ANYDATAオブジェクト内の値を出力するプロシージャの作成

次のプロシージャを実行すると、選択したデータ型に対して、指定したANYDATAオブジェクト内の値が出力されます。このプロシージャには、オプションで他のデータ型を追加できます。

CREATE OR REPLACE PROCEDURE print_any(data IN ANYDATA) IS
  tn  VARCHAR2(61);
  str VARCHAR2(4000);
  chr VARCHAR2(1000);
  num NUMBER;
  dat DATE;
  rw  RAW(4000);
  res NUMBER;
BEGIN
  IF data IS NULL THEN
    DBMS_OUTPUT.PUT_LINE('NULL value');
    RETURN;
  END IF;
  tn := data.GETTYPENAME();
  IF tn = 'SYS.VARCHAR2' THEN
    res := data.GETVARCHAR2(str);
    DBMS_OUTPUT.PUT_LINE(SUBSTR(str,0,253));
  ELSIF tn = 'SYS.CHAR' then
    res := data.GETCHAR(chr);
    DBMS_OUTPUT.PUT_LINE(SUBSTR(chr,0,253));
  ELSIF tn = 'SYS.VARCHAR' THEN
    res := data.GETVARCHAR(chr);
    DBMS_OUTPUT.PUT_LINE(chr);
  ELSIF tn = 'SYS.NUMBER' THEN
    res := data.GETNUMBER(num);
    DBMS_OUTPUT.PUT_LINE(num);
  ELSIF tn = 'SYS.DATE' THEN
    res := data.GETDATE(dat);
    DBMS_OUTPUT.PUT_LINE(dat);
  ELSIF tn= 'SYS.TIMESTAMP' THEN
    res := data.GETTIMESTAMP(dat);
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(dat,'DD-MON-RR HH.MI.SSXFF AM'));
  ELSIF tn= 'SYS.TIMESTAMPTZ' THEN
    res := data.GETTIMESTAMPTZ(dat);
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(dat,'DD-MON-RR HH.MI.SSXFF AM'));
  ELSIF tn= 'SYS.TIMESTAMPLTZ' THEN
    res := data.GETTIMESTAMPLTZ(dat);
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(dat,'DD-MON-RR HH.MI.SSXFF AM'));
  ELSIF tn = 'SYS.RAW' THEN
    -- res := data.GETRAW(rw);
    -- DBMS_OUTPUT.PUT_LINE(SUBSTR(DBMS_LOB.SUBSTR(rw),0,253));
    DBMS_OUTPUT.PUT_LINE('BLOB Value');
  ELSIF tn = 'SYS.BLOB' THEN
    DBMS_OUTPUT.PUT_LINE('BLOB Found');
  ELSE
    DBMS_OUTPUT.PUT_LINE('typename is ' || tn);
  END IF;
END print_any;
/
手順3: 指定したLCRを出力するプロシージャの作成

次のプロシージャを実行すると、指定したLCRが出力されます。このプロシージャでは、手順2: ANYDATAオブジェクト内の値を出力するプロシージャの作成で作成したprint_anyプロシージャがコールされます。

CREATE OR REPLACE PROCEDURE print_lcr(lcr IN ANYDATA) IS
  typenm    VARCHAR2(61);
  ddllcr    SYS.LCR$_DDL_RECORD;
  proclcr   SYS.LCR$_PROCEDURE_RECORD;
  rowlcr    SYS.LCR$_ROW_RECORD;
  res       NUMBER;
  newlist   SYS.LCR$_ROW_LIST;
  oldlist   SYS.LCR$_ROW_LIST;
  ddl_text  CLOB;
  ext_attr  ANYDATA;
BEGIN
  typenm := lcr.GETTYPENAME();
  DBMS_OUTPUT.PUT_LINE('type name: ' || typenm);
  IF (typenm = 'SYS.LCR$_DDL_RECORD') THEN
    res := lcr.GETOBJECT(ddllcr);
    DBMS_OUTPUT.PUT_LINE('source database: ' || 
                         ddllcr.GET_SOURCE_DATABASE_NAME);
    DBMS_OUTPUT.PUT_LINE('owner: ' || ddllcr.GET_OBJECT_OWNER);
    DBMS_OUTPUT.PUT_LINE('object: ' || ddllcr.GET_OBJECT_NAME);
    DBMS_OUTPUT.PUT_LINE('is tag null: ' || ddllcr.IS_NULL_TAG);
    DBMS_LOB.CREATETEMPORARY(ddl_text, TRUE);
    ddllcr.GET_DDL_TEXT(ddl_text);
    DBMS_OUTPUT.PUT_LINE('ddl: ' || ddl_text);    
    -- Print extra attributes in DDL LCR
    ext_attr := ddllcr.GET_EXTRA_ATTRIBUTE('serial#');
      IF (ext_attr IS NOT NULL) THEN
        DBMS_OUTPUT.PUT_LINE('serial#: ' || ext_attr.ACCESSNUMBER());
      END IF;
    ext_attr := ddllcr.GET_EXTRA_ATTRIBUTE('session#');
      IF (ext_attr IS NOT NULL) THEN
        DBMS_OUTPUT.PUT_LINE('session#: ' || ext_attr.ACCESSNUMBER());
      END IF; 
    ext_attr := ddllcr.GET_EXTRA_ATTRIBUTE('thread#');
      IF (ext_attr IS NOT NULL) THEN
        DBMS_OUTPUT.PUT_LINE('thread#: ' || ext_attr.ACCESSNUMBER());
      END IF;   
    ext_attr := ddllcr.GET_EXTRA_ATTRIBUTE('tx_name');
      IF (ext_attr IS NOT NULL) THEN
        DBMS_OUTPUT.PUT_LINE('transaction name: ' || ext_attr.ACCESSVARCHAR2());
      END IF;
    ext_attr := ddllcr.GET_EXTRA_ATTRIBUTE('username');
      IF (ext_attr IS NOT NULL) THEN
        DBMS_OUTPUT.PUT_LINE('username: ' || ext_attr.ACCESSVARCHAR2());
      END IF;      
    DBMS_LOB.FREETEMPORARY(ddl_text);
  ELSIF (typenm = 'SYS.LCR$_ROW_RECORD') THEN
    res := lcr.GETOBJECT(rowlcr);
    DBMS_OUTPUT.PUT_LINE('source database: ' || 
                         rowlcr.GET_SOURCE_DATABASE_NAME);
    DBMS_OUTPUT.PUT_LINE('owner: ' || rowlcr.GET_OBJECT_OWNER);
    DBMS_OUTPUT.PUT_LINE('object: ' || rowlcr.GET_OBJECT_NAME);
    DBMS_OUTPUT.PUT_LINE('is tag null: ' || rowlcr.IS_NULL_TAG); 
    DBMS_OUTPUT.PUT_LINE('command_type: ' || rowlcr.GET_COMMAND_TYPE); 
    oldlist := rowlcr.GET_VALUES('old');
    FOR i IN 1..oldlist.COUNT LOOP
      IF oldlist(i) IS NOT NULL THEN
        DBMS_OUTPUT.PUT_LINE('old(' || i || '): ' || oldlist(i).column_name);
        print_any(oldlist(i).data);
      END IF;
    END LOOP;
    newlist := rowlcr.GET_VALUES('new', 'n');
    FOR i in 1..newlist.count LOOP
      IF newlist(i) IS NOT NULL THEN
        DBMS_OUTPUT.PUT_LINE('new(' || i || '): ' || newlist(i).column_name);
        print_any(newlist(i).data);
      END IF;
    END LOOP;
    -- Print extra attributes in row LCR
    ext_attr := rowlcr.GET_EXTRA_ATTRIBUTE('row_id');
      IF (ext_attr IS NOT NULL) THEN
        DBMS_OUTPUT.PUT_LINE('row_id: ' || ext_attr.ACCESSUROWID());
      END IF;
    ext_attr := rowlcr.GET_EXTRA_ATTRIBUTE('serial#');
      IF (ext_attr IS NOT NULL) THEN
        DBMS_OUTPUT.PUT_LINE('serial#: ' || ext_attr.ACCESSNUMBER());
      END IF;
    ext_attr := rowlcr.GET_EXTRA_ATTRIBUTE('session#');
      IF (ext_attr IS NOT NULL) THEN
        DBMS_OUTPUT.PUT_LINE('session#: ' || ext_attr.ACCESSNUMBER());
      END IF; 
    ext_attr := rowlcr.GET_EXTRA_ATTRIBUTE('thread#');
      IF (ext_attr IS NOT NULL) THEN
        DBMS_OUTPUT.PUT_LINE('thread#: ' || ext_attr.ACCESSNUMBER());
      END IF;   
    ext_attr := rowlcr.GET_EXTRA_ATTRIBUTE('tx_name');
      IF (ext_attr IS NOT NULL) THEN
        DBMS_OUTPUT.PUT_LINE('transaction name: ' || ext_attr.ACCESSVARCHAR2());
      END IF;
    ext_attr := rowlcr.GET_EXTRA_ATTRIBUTE('username');
      IF (ext_attr IS NOT NULL) THEN
        DBMS_OUTPUT.PUT_LINE('username: ' || ext_attr.ACCESSVARCHAR2());
      END IF;          
  ELSE
    DBMS_OUTPUT.PUT_LINE('Non-LCR Message with type ' || typenm);
  END IF;
END print_lcr;
/
手順4: エラー・キューにあるすべてのLCRを出力するプロシージャの作成

次のプロシージャを実行すると、すべてのエラー・キューに含まれているすべてのLCRが出力されます。このプロシージャでは、手順3: 指定したLCRを出力するプロシージャの作成で作成したprint_lcrプロシージャがコールされます。

CREATE OR REPLACE PROCEDURE print_errors IS
  CURSOR c IS
    SELECT LOCAL_TRANSACTION_ID,
           SOURCE_DATABASE,
           MESSAGE_NUMBER,
           MESSAGE_COUNT,
           ERROR_NUMBER,
           ERROR_MESSAGE
      FROM DBA_APPLY_ERROR
      ORDER BY SOURCE_DATABASE, SOURCE_COMMIT_SCN;
  i      NUMBER;
  txnid  VARCHAR2(30);
  source VARCHAR2(128);
  msgno  NUMBER;
  msgcnt NUMBER;
  errnum NUMBER := 0;
  errno  NUMBER;
  errmsg VARCHAR2(2000);
  lcr    ANYDATA;
  r      NUMBER;
BEGIN
  FOR r IN c LOOP
    errnum := errnum + 1;
    msgcnt := r.MESSAGE_COUNT;
    txnid  := r.LOCAL_TRANSACTION_ID;
    source := r.SOURCE_DATABASE;
    msgno  := r.MESSAGE_NUMBER;
    errno  := r.ERROR_NUMBER;
    errmsg := r.ERROR_MESSAGE;
DBMS_OUTPUT.PUT_LINE('*************************************************');
    DBMS_OUTPUT.PUT_LINE('----- ERROR #' || errnum);
    DBMS_OUTPUT.PUT_LINE('----- Local Transaction ID: ' || txnid);
    DBMS_OUTPUT.PUT_LINE('----- Source Database: ' || source);
    DBMS_OUTPUT.PUT_LINE('----Error in Message: '|| msgno);
    DBMS_OUTPUT.PUT_LINE('----Error Number: '||errno);
    DBMS_OUTPUT.PUT_LINE('----Message Text: '||errmsg);
    FOR i IN 1..msgcnt LOOP
      DBMS_OUTPUT.PUT_LINE('--message: ' || i);
        lcr := DBMS_APPLY_ADM.GET_ERROR_MESSAGE(i, txnid);
        print_lcr(lcr);
    END LOOP;
  END LOOP;
END print_errors;
/

このプロシージャを作成後に実行するには、次のように入力します。

SET SERVEROUTPUT ON SIZE 1000000

EXEC print_errors
手順5: トランザクションに関するすべてのエラーLCRを出力するプロシージャの作成

次のプロシージャを実行すると、特定のトランザクションに対するエラー・キューに含まれているすべてのLCRが出力されます。このプロシージャでは、手順3: 指定したLCRを出力するプロシージャの作成で作成したprint_lcrプロシージャがコールされます。

CREATE OR REPLACE PROCEDURE print_transaction(ltxnid IN VARCHAR2) IS
  i      NUMBER;
  txnid  VARCHAR2(30);
  source VARCHAR2(128);
  msgno  NUMBER;
  msgcnt NUMBER;
  errno  NUMBER;
  errmsg VARCHAR2(2000);
  lcr    ANYDATA;
BEGIN
  SELECT LOCAL_TRANSACTION_ID,
         SOURCE_DATABASE,
         MESSAGE_NUMBER,
         MESSAGE_COUNT,
         ERROR_NUMBER,
         ERROR_MESSAGE
      INTO txnid, source, msgno, msgcnt, errno, errmsg
      FROM DBA_APPLY_ERROR
      WHERE LOCAL_TRANSACTION_ID =  ltxnid;
  DBMS_OUTPUT.PUT_LINE('----- Local Transaction ID: ' || txnid);
  DBMS_OUTPUT.PUT_LINE('----- Source Database: ' || source);
  DBMS_OUTPUT.PUT_LINE('----Error in Message: '|| msgno);
  DBMS_OUTPUT.PUT_LINE('----Error Number: '||errno);
  DBMS_OUTPUT.PUT_LINE('----Message Text: '||errmsg);
  FOR i IN 1..msgcnt LOOP
  DBMS_OUTPUT.PUT_LINE('--message: ' || i);
    lcr := DBMS_APPLY_ADM.GET_ERROR_MESSAGE(i, txnid); -- gets the LCR
    print_lcr(lcr);
  END LOOP;
END print_transaction;
/

このプロシージャを作成後に実行するには、このプロシージャにエラー・トランザクションのローカル・トランザクション識別子を渡します。たとえば、ローカル・トランザクション識別子が1.17.2485の場合は、次のように入力します。

SET SERVEROUTPUT ON SIZE 1000000

EXEC print_transaction('1.17.2485')