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と永続ユーザー・メッセージをデキューできます。
-
リーダー・サーバーで使用されるプロセスの名前。プロセスの名前の形式は、
AS
nn
です(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 各コーディネータ・プロセスに関する一般情報の表示
コーディネータ・プロセスは、リーダー・サーバーからトランザクションを取得して適用サーバーに渡します。コーディネータ・プロセスの名前はAP
nn
です(nn
はコーディネータ・プロセス番号)。
この項で説明する問合せを実行すると、各適用プロセスのコーディネータ・プロセスに関する次の情報が表示されます。
-
適用プロセスの名前。
-
プロセスの名前
AP
nn
内のコーディネータの番号(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以外のメッセージの場合、それらのメッセージは、適用サーバーによってメッセージ・ハンドラに渡されます。各適用サーバーはプロセスです。
この項で説明する問合せを実行すると、各適用プロセスの適用サーバーに関する次の情報が表示されます。
-
適用プロセスの名前。
-
リーダー・サーバー・プロセスの名前(順に表示されます)。各プロセスの名前の形式は、
AS
nn
です(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
適用エラーがある場合は、エラーが発生したトランザクションを再実行するか、またはそのトランザクションを削除することができます。エラーが発生したトランザクションを再実行する場合は、まず、トランザクションでエラーが発生する原因となった状態を修正します。
エラーが発生したトランザクションを削除する場合、複数のデータベースでデータを共有しているときは、手動によるデータの再同期化が必要になることがあります。データを手動で再同期化する場合は、必要に応じて適切なセッション・タグを設定してください。
関連項目:
-
「エラー・キュー」
-
「適用エラーの管理」
-
適用エラーの考えられる原因の詳細は、「表への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')