26 Oracle Streams適用プロセスの監視
次の各項では、Oracle Streamsの適用プロセスの監視について説明します。
注意:
Oracle Enterprise Manager Cloud ControlのOracle Streamsツールも、Oracle Streams環境を監視するための優れた手段です。Oracle Streamsツールの詳細は、Oracle Enterprise Manager Cloud Controlのオンライン・ヘルプを参照してください。
関連項目:
- 
                        
この章で説明するデータ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照
 
26.1 各適用プロセスのキュー、ルール・セットおよび状態の確認
この項で説明する問合せを実行すると、データベース内の各適用プロセスに関する次の情報を確認できます。
- 
                           
適用プロセスの名前。
 - 
                           
適用プロセスで使用されるキューの名前
 - 
                           
適用プロセスで使用されるポジティブ・ルール・セットの名前
 - 
                           
適用プロセスで使用されるネガティブ・ルール・セットの名前
 - 
                           
適用プロセスの状態(
ENABLED、DISABLEDまたはABORTED) 
データベース内の各適用プロセスに関する前述の一般情報を表示するには、次の問合せを実行します。
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 各適用プロセスに関する一般情報の表示
この項で説明する問合せを実行すると、データベース内の各適用プロセスに関する一般情報を表示できます。
- 
                           
適用プロセスの名前。
 - 
                           
適用プロセスによって適用されたメッセージのタイプ。適用プロセスでは、取得LCRを適用するか、または永続LCRと永続ユーザー・メッセージを適用できます。
 
データベース内の各適用プロセスに関する前述の一般情報を表示するには、次の問合せを実行します。
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の場合、パラメータはユーザーによって設定され、デフォルト値に設定されることもされないこともあります。
                        
関連項目:
- 
                              
適用プロセス・パラメータの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』の
DBMS_APPLY_ADM.SET_PARAMETERプロシージャに関する項を参照 - 
                              
Oracle Enterprise Manager Cloud Controlを使用した適用プロセス・パラメータの設定については、Oracle Enterprise Manager Cloud Controlのオンライン・ヘルプを参照
 
26.4 適用ハンドラの情報の表示
26.4.1 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 NameがNULLであるため、このハンドラは、すべてのローカル適用プロセスに対して実行される汎用ハンドラです。
                           
26.4.1.2 文DMLハンドラに関する情報の表示
次の各項では、データベース内の文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_TIMEがNULLの場合、ハンドラが作成以降に変更されていないことを示します。
                              
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 NameがNULLである場合、このハンドラは、すべてのローカル適用プロセスに対して実行される汎用ハンドラです。
                              
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 NameがNULLであるため、このハンドラは、すべてのローカル適用プロセスに対して実行される汎用ハンドラです。
                           
関連項目:
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"
関連項目:
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 NameはNULLです。このため、このハンドラはすべてのローカル適用プロセスに対して実行される汎用ハンドラです。 
                        
関連項目:
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 各適用プロセスのプリコミット・ハンドラの表示
この項で説明する問合せを実行すると、データベース内の適用プロセスで使用される各プリコミット・ハンドラに関する情報を表示できます。
- 
                              
適用プロセスの名前。
 - 
                              
プリコミット・ハンドラの所有者および名前。
 - 
                              
適用プロセスによって適用されたメッセージのタイプ。適用プロセスでは、取得LCRを適用するか、または永続LCRと永続ユーザー・メッセージを適用できます。
 
データベース内の各プリコミット・ハンドラに関する前述の情報を表示するには、次の問合せを実行します。
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
626.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
適用エラーがある場合は、エラーが発生したトランザクションを再実行するか、またはそのトランザクションを削除することができます。エラーが発生したトランザクションを再実行する場合は、まず、トランザクションでエラーが発生する原因となった状態を修正します。
エラーが発生したトランザクションを削除する場合、複数のデータベースでデータを共有しているときは、手動によるデータの再同期化が必要になることがあります。データを手動で再同期化する場合は、必要に応じて適切なセッション・タグを設定してください。
関連項目:
- 
                              
「エラー・キュー」
 - 
                              
「適用エラーの管理」
 - 
                              
適用エラーの考えられる原因の詳細は、「表へのDML変更の適用に関する考慮事項」を参照
 - 
                              
現行セッションで生成されるタグの値の設定の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照
 
26.20 適用エラーの詳細情報の表示
この項では、データベースのエラー・キューにあるエラー・トランザクションの詳細情報を表示するために使用できるSQLスクリプトについて説明します。これらのスクリプトはLCRの情報を表示するように設計されていますが、環境で使用される非LCRメッセージ情報を表示するようにも拡張できます。
これらのスクリプトを使用するには、次の手順を実行します。
注意:
これらのスクリプトでは、LCR内のVARCHAR2値の最初の253文字のみが表示されます。
                        
- 手順1: DBA_APPLY_ERRORビューに対する明示的なSELECT権限の付与
 - 
                           
ここで説明する
print_errorsおよびprint_transactionプロシージャを作成して実行するユーザーには、DBA_APPLY_ERRORデータ・ディクショナリ・ビューに対する明示的なSELECT権限が付与されている必要があります。この権限は、ロールを介しては付与できません。ユーザーに対してDBMS_STREAMS_AUTHパッケージのGRANT_ADMIN_PRIVILEGEプロシージャを実行すると、そのユーザーにこの権限が付与されます。ユーザーにこの権限を直接付与するには、次の手順を実行します。
- 
                                 
SQL*Plusで、権限を付与できる管理ユーザーとして接続します。
SQL*Plusでデータベースに接続する方法については、『Oracle Database管理者ガイド』を参照してください。
 - 
                                 
DBA_APPLY_ERRORデータ・ディクショナリ・ビューに対するSELECT権限を適切なユーザーに付与します。たとえば、この権限をstrmadminユーザーに付与するには、次の文を実行します。GRANT SELECT ON DBA_APPLY_ERROR TO strmadmin;
 - 
                                 
DBMS_APPLY_ADMパッケージのEXECUTE権限を付与します。たとえば、この権限をstrmadminユーザーに付与するには、次の文を実行します。GRANT EXECUTE ON DBMS_APPLY_ADM TO strmadmin;
 
 - 
                                 
 - 手順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')