次の各項では、Oracle Streamsの適用プロセスの監視について説明します。
注意: Oracle Streams環境の監視には、Oracle Enterprise ManagerのOracle Streamsツールを使用する方法も適しています。詳細は、Oracle Database 2日でデータ・レプリケーションおよび統合ガイドおよびOracle Streamsツールのオンライン・ヘルプを参照してください。 |
関連項目:
|
この項で説明する問合せを実行すると、データベース内の各適用プロセスに関する次の情報を確認できます。
適用プロセスの名前
適用プロセスで使用されるキューの名前
適用プロセスで使用されるポジティブ・ルール・セットの名前
適用プロセスで使用されるネガティブ・ルール・セットの名前
適用プロセスの状態(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 データ・ディクショナリ・ビューの情報とは関連がありません。 |
この項で説明する問合せを実行すると、データベース内の各適用プロセスに関する一般情報を表示できます。
適用プロセスの名前。
適用プロセスによって適用されたメッセージのタイプ。適用プロセスでは、取得LCRを適用するか、または永続LCRと永続ユーザー・メッセージを適用できます。
データベース内の各適用プロセスに関する前述の一般情報を表示するには、次の問合せを実行します。
COLUMN APPLY_NAME HEADING 'Apply Process Name' FORMAT A20 COLUMN APPLY_CAPTURED HEADING 'Applies Captured LCRs?' FORMAT A30 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
次の問合せを実行すると、データベース内の適用プロセスごとの各適用プロセス・パラメータの現行の設定が表示されます。
COLUMN APPLY_NAME HEADING 'Apply Process|Name' FORMAT A15 COLUMN PARAMETER HEADING 'Parameter' FORMAT A25 COLUMN VALUE HEADING 'Value' FORMAT A20 COLUMN SET_BY_USER HEADING 'Set by User?' FORMAT A15 SELECT APPLY_NAME, PARAMETER, VALUE, SET_BY_USER FROM DBA_APPLY_PARAMETERS;
出力は次のようになります。
Apply Process Name Parameter Value Set by User? --------------- ------------------------- -------------------- --------------- APPLY_HR ALLOW_DUPLICATE_ROWS N NO APPLY_HR COMMIT_SERIALIZATION FULL NO APPLY_HR DISABLE_ON_ERROR Y NO APPLY_HR DISABLE_ON_LIMIT N NO APPLY_HR MAXIMUM_SCN INFINITE NO APPLY_HR PARALLELISM 1 NO APPLY_HR STARTUP_SECONDS 0 NO APPLY_HR TIME_LIMIT INFINITE NO APPLY_HR TRACE_LEVEL 0 NO APPLY_HR TRANSACTION_LIMIT INFINITE NO APPLY_HR TXN_LCR_SPILL_THRESHOLD 5000 YES APPLY_HR WRITE_ALERT_LOG Y NO
注意: パラメータのSet by user 列がNO の場合、そのパラメータはデフォルト値に設定されます。パラメータのSet by user 列がYES の場合、パラメータはデフォルト値に設定されることもされないこともあります。 |
この項では、適用プロセスのメッセージ・ハンドラおよびエラー・ハンドラに関する情報を表示する手順について説明します。
この項の内容は次のとおりです。
関連項目: |
宛先データベースで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
です。このため、このハンドラはすべてのローカル適用プロセスに対して実行される汎用ハンドラです。
データベース内の各メッセージ・ハンドラを表示するには、次の問合せを実行します。
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"
この項で説明する問合せを実行すると、データベース内の適用プロセスで使用される各プリコミット・ハンドラに関する情報を表示できます。
適用プロセスの名前。
プリコミット・ハンドラの所有者および名前。
適用プロセスによって適用されたメッセージのタイプ。適用プロセスでは、取得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
適用プロセスのリーダー・サーバーは、キューからのメッセージをデキューします。リーダー・サーバーは、LCR間の依存性を計算してメッセージをトランザクションにアセンブルするプロセスです。リーダー・サーバーが、アセンブルしたトランザクションをコーディネータに返すと、コーディネータがアイドル状態の適用サーバーにトランザクションを割り当てます。
この項で説明する問合せを実行すると、各適用プロセスのリーダー・サーバーに関する次の情報が表示されます。
適用プロセスの名前
リーダー・サーバーによってデキューされたメッセージのタイプ。適用プロセスでは、取得LCRをデキューするか、または永続LCRと永続ユーザー・メッセージをデキューできます。
リーダー・サーバーで使用されるプロセスの名前。プロセスの名前の形式は、AS
nn
です(nn
には文字および数字を使用できます)。
リーダー・サーバーの現在の状態(INITIALIZING
、IDLE
、DEQUEUE
MESSAGES
、SCHEDULE
MESSAGES
、SPILLING
またはPAUSED
)。
適用プロセスが最後に起動されてから、リーダー・サーバーがデキューしたメッセージの合計数。
この問合せで表示される情報は、有効になっている適用プロセスに対してのみ有効です。
次の問合せを実行すると、各適用プロセスに関する前述の情報が表示されます。
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
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で割られ、秒単位で表示されます。 |
この項で説明する問合せを実行すると、各適用プロセスによってデキューされた最後のメッセージに関する情報が表示されます。
適用プロセスの名前。
待機時間。取得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
コーディネータ・プロセスは、リーダー・サーバーからトランザクションを取得して適用サーバーに渡します。コーディネータ・プロセスの名前はAP
nn
です(nn
はコーディネータ・プロセス番号)。
この項で説明する問合せを実行すると、各適用プロセスのコーディネータ・プロセスに関する次の情報が表示されます。
適用プロセスの名前。
プロセスの名前AP
nn
内のコーディネータの番号(nn
には文字および数字を使用できます)。
コーディネータのセッションのセッション識別子。
コーディネータのセッションのシリアル番号。
コーディネータの現在の状態(INITIALIZING
、APPLYING
、SHUTTING
DOWN
CLEANLY
またはABORTING
)。
この問合せで表示される情報は、有効になっている適用プロセスに対してのみ有効です。
次の問合せを実行すると、各適用プロセスに関する前述の情報が表示されます。
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
この項で説明する問合せを実行すると、各適用プロセスによって受信および適用されたトランザクションと現在適用されているトランザクションに関する次の情報が表示されます。
適用プロセスの名前。
適用プロセスが最後に起動されてから、コーディネータ・プロセスが受信したトランザクションの合計数。
適用プロセスが最後に起動されてから、適用プロセスによって正常に適用されたトランザクションの合計数。
適用プロセスが最後に起動されてから、適用プロセスによって適用され、適用エラーが発生したトランザクションの合計数。
適用プロセスによって現在適用されているトランザクションの合計数。
コーディネータ・プロセスによって受信されたが、適用プロセスに割り当てられていない完全なトランザクションの合計数。
適用プロセスが最後に起動されてから、適用プロセスによってトランザクションがすでに適用されていたため、コーディネータ・プロセスが受信しても無視したトランザクションの合計数。
この問合せで表示される情報は、有効になっている適用プロセスに対してのみ有効です。
たとえば、適用プロセス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
この項では、特定のメッセージに関して取得から適用までの待機時間を表示する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が作成された時刻です。
メッセージが適用プロセスによって適用された時刻。
メッセージのメッセージ番号。
V$STREAMS_APPLY_COORDINATOR
ビューを使用して次の問合せを実行すると、各適用プロセスの取得LCRまたは永続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 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;
出力は次のようになります。
Applied Apply Process Message Name Latency in Seconds Message Creation Apply Time Number ----------------- ------------------ ----------------- ----------------- ------- APPLY$_STM1_14 4 14:05:13 06/13/05 14:05:17 06/13/05 498215
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
適用プロセスでは、1つ以上の適用サーバーを使用できます。適用サーバーによって、LCRは、DML文またはDDL文としてデータベース・オブジェクトに適用されるか、または適切なハンドラに渡されます。LCR以外のメッセージの場合、それらのメッセージは、適用サーバーによってメッセージ・ハンドラに渡されます。各適用サーバーはプロセスです。
この項で説明する問合せを実行すると、各適用プロセスの適用サーバーに関する次の情報が表示されます。
適用プロセスの名前。
リーダー・サーバー・プロセスの名前(順に表示されます)。各プロセスの名前の形式は、AS
nn
です(nn
には文字および数字を使用できます)。
各適用サーバーの現在の状態。
IDLE
RECORD
LOW-WATERMARK
ADD
PARTITION
DROP
PARTITION
EXECUTE
TRANSACTION
WAIT
COMMIT
WAIT
DEPENDENCY
WAIT
FOR
NEXT
CHUNK
TRANSACTION
CLEANUP
適用プロセスが最後に起動されてから、各適用サーバーに割り当てられたトランザクションの合計数。トランザクションには、複数のメッセージが含まれる場合があります。
適用プロセスが最後に起動されてから、各適用サーバーによって適用されたメッセージの合計数。
この問合せで表示される情報は、有効になっている適用プロセスに対してのみ有効です。
次の問合せを実行すると、各適用プロセスの適用サーバーに関する情報が表示されます。
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_SPOKE AS00 IDLE 2 216 APPLY_SPOKE AS03 IDLE 1 28 APPLY_SPOKE AS04 IDLE 1 20
環境によっては、適用プロセスで、使用可能なすべての適用サーバーを使用できない場合があります。たとえば、適用プロセスの並列性を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
この場合、適用サーバー3は、適用プロセスが最後に起動されてから使用されていません。適用プロセスのparallelism
がその適用プロセスの有効な並列性より大きい値に設定されている場合は、parallelism
を小さい値に設定することを検討します。
ルールの宛先キューを指定するには、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"
ルールの実行ディレクティブを指定するには、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
取得プロセスは論理変更レコード(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
バイトを取得プロセスから受信しています。
適用エラーの有無をチェックするには、次の問合せを実行します。
COLUMN APPLY_NAME HEADING 'Apply|Process|Name' FORMAT A10 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_FROM MULT3.EXAM 1.62.948 1403 ORA-01403: no data f 1 _MULT3 PLE.COM ound APPLY_FROM MULT2.EXAM 1.54.948 1403 ORA-01403: no data f 1 _MULT2 PLE.COM ound
適用エラーがある場合は、エラーが発生したトランザクションを再実行するか、またはそのトランザクションを削除することができます。エラーが発生したトランザクションを再実行する場合は、まず、トランザクションでエラーが発生する原因となった状態を修正します。
エラーが発生したトランザクションを削除する場合、複数のデータベースでデータを共有しているときは、手動によるデータの再同期化が必要になることがあります。データを手動で再同期化する場合は、必要に応じて適切なセッション・タグを設定してください。
関連項目:
|
この項では、データベースのエラー・キューにあるエラー・トランザクションの詳細情報を表示するために使用できる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.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; /
次のプロシージャを実行すると、指定したLCRが出力されます。このプロシージャでは、「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が出力されます。このプロシージャでは、「指定した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が出力されます。このプロシージャでは、「指定した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')