#!/usr/bin/ksh # set -xv # author : B. Polarski # program : smenu_stream_apply.ksh # date : 9 Decembre 2005 # : 15 October 2009 Added view/re-execute errors by type (error_number) HOST=`hostname` HOST=`echo $HOST | awk '{ printf ("%-+15.15s",$1) }'` # ------------------------------------------------------------------------------------- function help { cat < -dis_err -sn -l -lr -lat -c -o -p -r -s -i -dmlh -li -lo -cmp -cf -stop [-u ] -start [-u ] -drop [-u ] -xerr | -xerr -tx | -xerr -erno | -delerr | -err | -erc -ti -to -t -src_sid -scn -si -so -src_sid -scn -par | -trh -dis -cms | -trace <127|0> -an -l : List apply process -p : Show apply processes progresses -as : List apply process -prm : Show parameter for apply processes -cms : set commit_serialization to Y or N -r : Show reader process -lr : List apply process with full rule -s : Show apply server process -lo : List instantiated schema -t : Table name -dis : set disable on error -to : Table owner name -dmlh : List dml apply handler -so : source Owner of the table -an : Apply name -qn : queue name -err : List errors -sn : stream name -erc : count errors -tx : transaction id -delerr : Delete errors for apply process -scn : scn number -xerr : re-execute errors for apply name -v : Verbose : show sql text -lat : Show measured latency between source and apply -dis_err : Disable apply stream on error -c : Show coordinator process -trace : Set trace on a apply, 127 to trace, 0 to trace off -i : Show instanciated objects -trh : set TXN_LCR_SPILL_THRESHOLD to given value (default is 10 000) -o : List objects with apply on them -rec : set Recursive=TRUE when applicable -li : List object in local streams data dictionary & scn -cmp : List compare old/new fields in LCR -cf : List prebuilt update conflict handler Delete all err msg for a queue : app -delerr Change queue option : app -dis_on_err -sn Start apply : app -start -an Force to instantiate scn : app -ti -so -t
-scn -src_sid Force table instantia. scn : app -ti -so -t
-src_sid Force schema instantia. scn : app -si -so -src_sid -scn Show applied scn : app -as List dml apply handlers : app -dmlh To set parallism apply : app -par -an To set TXN_LCR_SPILL_THRESHOLD : app -trh -an To set commit_serialization : app -cms -an To set disable_on_error : app -dis -an Set trace : app -trace 127 -an INTANTIATION: Remove apply schema instantiated SCN : app -si -so -src_sid -scn null -x [-recursive] ============ Remove apply table instantiated SCN : app -ti -t
-so -src_sid -scn null -x EXEC ERRORS: view all errors : app -err [ERROR_NUMBER] [-rn ] # -rn : Limit error list to first (nn) rows re-execute all errors : app -xerr =========== re-execute on transaction : app -xerr -tx # Local_transaction id is in dba_apply_error (app -err) re-execute all errors of type nn: app -xerr -ern # nn is col ERROR_NUMBER in dba_apply_error (app -err) EOF exit } # ------------------------------------------------------------------------------------- function do_execute { $SETXV sqlplus -s "$CONNECT_STRING" <" exit fi SQL="execute DBMS_APPLY_ADM.DELETE_ALL_ERRORS( '$fapply') ;" # ................................................ # execute a queue in error # ................................................ elif [ "$CHOICE" = "XERROR" ];then set -x # Apply a single error if [ -n "$TXN_ID" ];then SQL="execute DBMS_APPLY_ADM.EXECUTE_ERROR( local_transaction_id => '$TXN_ID');" # apply a set of error_number elif [ -n "$ERRNO" ];then SQL="set serveroutput on size unlimited declare begin for c in (select local_transaction_id from dba_apply_error where error_number = $ERRNO ) loop begin execute immediate 'begin dbms_apply_adm.execute_error(local_transaction_id => :1); end; ' using c.local_transaction_id ; exception when others then null ; end ; end loop; end; / " else if [ -z "$fapply" ];then echo "No Aplly name given" exit fi SQL="prompt doing execute DBMS_APPLY_ADM.EXECUTE_ALL_ERRORS( '$fapply') ;; execute DBMS_APPLY_ADM.EXECUTE_ALL_ERRORS( '$fapply') ;" fi # ................................................ # list instantiated schema # ................................................ elif [ "$CHOICE" = "LIST_SO" ];then SQL=" col APPLY_DATABASE_LINK format a40 col SOURCE_DATABASE format a30 select SOURCE_DATABASE , SOURCE_SCHEMA , INSTANTIATION_SCN , APPLY_DATABASE_LINK from DBA_APPLY_INSTANTIATED_SCHEMAS ; " # ................................................ # list instantiated objects scn # ................................................ elif [ "$CHOICE" = "LIST_SI" ];then if [ -n "$ftable" ];then AND1=" and lvl0name=upper('$ftable')" fi if [ -n "$fowner" ];then AND2=" and OWNERNAME=upper('$fowner')" fi SQL=" break on OWNERNAME on table_name on report col global_name format a25 col OWNERNAME format a20 select OWNERNAME, lvl0name table_name , start_scn,global_name,baseobj#, INTCOLS,PROPERTY from system.logmnrc_gtlo o, system.logmnrc_dbname_uid_map m where m.logmnr_uid=o.logmnr_uid $AND1 $AND2 order by 1,2; " # ................................................ # list instantiated objects # ................................................ elif [ "$CHOICE" = "INSTANTIATE" ];then if [ -n "$fowner" ];then WHERE=" where SOURCE_OBJECT_OWNER=upper('$fowner') " fi SQL="col SOURCE_DATABASE format a30 set linesize 150 select distinct SOURCE_DATABASE, source_object_owner||'.'||source_object_name own_obj, SOURCE_OBJECT_TYPE objt, instantiation_scn, IGNORE_SCN, apply_database_link lnk from DBA_APPLY_INSTANTIATED_OBJECTS $WHERE order by 1,2;" # ................................................ # show count error # ................................................ elif [ "$CHOICE" = "COUNT_ERROR" ];then SQL="SELECT count(1) Error_count, queue_name, ERROR_MESSAGE , error_number FROM DBA_APPLY_ERROR group by queue_name, error_message, error_number;" # ................................................ # List errors # ................................................ elif [ "$CHOICE" = "ERROR" ];then if [ -n "$ERRNO" ];then AND_ERRNO=" and error_number = $ERRNO " fi SQL="col queue_name format a20 col source_database head 'Source|Database' col SOURCE_TRANSACTION_ID head 'Source|Tx Id' for a14 col SOURCE_COMMIT_SCN for 9999999999999 head 'Source scn' set lines 190 pages 66 select * from ( SELECT queue_name,source_commit_scn scn, message_count, source_database,LOCAL_TRANSACTION_ID, SOURCE_TRANSACTION_ID, SOURCE_COMMIT_SCN, ERROR_MESSAGE FROM DBA_APPLY_ERROR where 1=1 $AND_ERRNO order by message_count desc ) where rownum <=$ROWNUM ;" # ................................................ # show latency between source and target # ................................................ elif [ "$CHOICE" = "LATENCY" ];then SQL="SELECT apply_name, (DEQUEUE_TIME-DEQUEUED_MESSAGE_CREATE_TIME)*86400 LATENCY, TO_CHAR(DEQUEUED_MESSAGE_CREATE_TIME,'DD-MM HH24:MI:SS') CREATION, TO_CHAR(DEQUEUE_TIME,'DD-MM HH24:MI:SS') deqt, DEQUEUED_MESSAGE_NUMBER FROM V\$STREAMS_APPLY_READER ;" # ................................................ # # ................................................ elif [ "$CHOICE" = "OBJ" ];then BREAK="break on SOURCE_DATABASE on SOURCE_OBJECT_OWNER" SQL="SELECT SOURCE_DATABASE, SOURCE_OBJECT_OWNER, SOURCE_OBJECT_NAME, INSTANTIATION_SCN FROM DBA_APPLY_INSTANTIATED_OBJECTS order by SOURCE_DATABASE,SOURCE_OBJECT_OWNER;" # ................................................ # List parameters # ................................................ elif [ "$CHOICE" = "PARAMETER" ];then BREAK="break on APPLY_NAME" SQL="SELECT APPLY_NAME, PARAMETER, VALUE, SET_BY_USER FROM DBA_APPLY_PARAMETERS ORDER BY APPLY_NAME ;" # ................................................ # List applying server # ................................................ elif [ "$CHOICE" = "APPL_SERVER" ];then SQL="select sid, apply_name appn, server_id, state st1, MESSAGE_SEQUENCE ms, TOTAL_MESSAGES_APPLIED tap , to_char(APPLIED_MESSAGE_CREATE_TIME,'DD-MM HH24:MI:SS') amct, to_char(APPLY_TIME,'DD-MM HH24:MI:SS') applt , TOTAL_ADMIN tad, TOTAL_ASSIGNED tas from v\$streams_apply_server order by apply_name,server_id;" # ................................................ # list queue readers # ................................................ elif [ "$CHOICE" = "READER" ];then SQL="SELECT ap.APPLY_NAME, DECODE(ap.APPLY_CAPTURED,'YES','Captured LCRS', 'NO','User-Enqueued','UNKNOWN') APPLY_CAPTURED, SUBSTR(s.PROGRAM,INSTR(S.PROGRAM,'(')+1,4) PROCESS_NAME, r.STATE, r.TOTAL_MESSAGES_DEQUEUED, r.sga_used 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; SELECT APPLY_NAME, sid rsid , (DEQUEUE_TIME-DEQUEUED_MESSAGE_CREATE_TIME)*86400 LATENCY, TO_CHAR(DEQUEUED_MESSAGE_CREATE_TIME,'HH24:MI:SS MM/DD') CREATION, TO_CHAR(DEQUEUE_TIME,'HH24:MI:SS MM/DD') deqt, DEQUEUED_MESSAGE_NUMBER FROM V\$STREAMS_APPLY_READER; " # ................................................ # Show coordinator process # ................................................ elif [ "$CHOICE" = "COORD" ];then SQL=" COLUMN APPLY_PROC FORMAT A12 COLUMN LAT_SEC FORMAT 999999999 COLUMN Message_Creation FORMAT A19 head 'Msg|Creation time' justify c COLUMN Apply_Time FORMAT A19 head 'Msg|Apply time' justify c COLUMN MSG_NO FORMAT 9999999999999 select apply_name appn, apply#,sid,state, total_received totr, total_applied tap, total_wait_deps twd, TOTAL_ROLLBACKS, total_wait_commits twc, total_errors terr, to_char(hwm_time,'DD-MM HH24:MI:SS')hwt from v\$streams_apply_coordinator order by apply_name; SELECT APPLY_NAME APPLY_PROC, (HWM_TIME-HWM_MESSAGE_CREATE_TIME)*86400 LAT_SEC, 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 MSG_NO, LWM_TIME, to_char(startup_time,'DD-MM HH24:MI:SS') Startup FROM GV\$STREAMS_APPLY_COORDINATOR; " # ................................................ # start stop drop # ................................................ elif [ "$CHOICE" = "START_STOP_DROP" ];then SQL=" execute DBMS_APPLY_ADM.${ACTION}_APPLY( apply_name => '$fapply');" # ................................................ # List apply process # ................................................ elif [ "$CHOICE" = "LIST_APPLY" ];then SQL=" col apply_tag format a8 head 'Apply| Tag' col QUEUE_NAME format a24 col DDL_HANDLER format a20 col MESSAGE_HANDLER format a20 col NEGATIVE_RULE_SET_NAME format a20 head 'Negative|rule set' col apply_user format a20 set linesize 150 select apply_name uappn, queue_owner, DECODE(APPLY_CAPTURED, 'YES', 'Captured', 'NO', 'User-Enqueued') APPLY_CAPTURED, RULE_SET_NAME rsn , apply_tag, STATUS sts from dba_apply; select QUEUE_NAME,DDL_HANDLER,MESSAGE_HANDLER, NEGATIVE_RULE_SET_NAME, APPLY_USER, ERROR_NUMBER, to_char(STATUS_CHANGE_TIME,'DD-MM-YYYY HH24:MI:SS')STATUS_CHANGE_TIME from dba_apply ; set head off select ERROR_MESSAGE from dba_apply; " # ................................................ # List apply process with rule # ................................................ elif [ "$CHOICE" = "LIST_APPLY_R" ];then SQL="set long 4000 select rsr.rule_set_owner||'.'||rsr.rule_set_name rsn ,rsr.rule_owner||'.'||rsr.rule_name rn, r.rule_condition rt from dba_rule_set_rules rsr, dba_rules r where rsr.rule_name = r.rule_name and rsr.rule_owner = r.rule_owner and rule_set_name in (select rule_set_name from dba_apply) order by rsr.rule_set_owner,rsr.rule_set_name;" # ................... END if .............. fi if [ -n "$ftable" ];then AND_FTABLE=" a.table_name='$ftable' and " fi if [ -n "$WHERE0" ];then SQL="$SQL $WHERE0" fi if [ -n "$ORDER0" ];then SQL="$SQL $ORDER0" fi if [ "$EXECUTE" = "YES" ];then do_execute else echo "$SQL" fi