#!/usr/bin/ksh # set -xv # author : B. Polarski # program : smenu_stream_propagation.ksh # date : 16 Decembre 2005 # 03 October 2007 Add Queue to queue (-lq) # 15 October 2007 Added stats from stream 10G healthcheck from metatlink, just for conveniance # 20 October 2007 Added list propagation schedule HOST=`hostname` HOST=`echo $HOST | awk '{ printf ("%-+15.15s",$1) }'` # -------------------------------------------------------------------------------------ยต #-- DBMS_AQADM.ALTER_PROPAGATION_SCHEDULE( #-- queue_name => '&&ApplSchema._strms_q', #-- destination => '@&&RemoteDBTNSName', #-- latency => NewParamVal, #-- destination_queue => '&&ApplSchema._strms_q'); # EXEC DBMS_AQADM.ALTER_SCHEDULE(queue_name,destination,latency=>1); function help { cat < -sourceq -pn -dblk | -trace prop -lat -pn [ -adm ] prop -s | -r | -lr | -o | -droprs prop -d [-n ] -l : List propagation process -u : owner of the propagation -lr : List propagations rules -lc : List schedule propagation -lq : propagation queue to queues correspondancies -s : Show statitics for propagations sender -r : Show statitics for propagations receiver -rcr : Drop and recreate propagation with same ruleset -lat : Set the propagation latency (in seconds) -pn : Name of the propagation -create : Create propagation process -qn : Name of the queue -drop : Drop propagation process -destq : Name of the destination queue -stop : stop propagation -dblk : database link to use with propagation queue -start : start propagation -sourceq : Name of the source queue -check : check propagation is possible -v : verbose -droprs : Drop propagation rule set -d : propagation traffic during n seconds -o : Show overal picture for propagation (status and figures) Add : -trace to set events 24024 before starting the propagation Create a propagation queue : prop -create -u -pn -sourceq -destq -dblk prop Overal image : prop -o [-u only if not STRMADMIN] -trace Stop a propagation queue : prop -stop [-u only if not STRMADMIN] Drop a propagation queue : prop -drop [-u only if not STRMADMIN] recreate propagation : prop -rcr -u -pn Set the propagation latency : prop -lat -pn [ -adm only if not STRMADMIN ] check propagation is possible : prop -check -u -pn -destq | -u2 -dblk (-u2 only if owner is # from -u ) Drop propagation rules set : prop -droprs Traffic for all propagations : prop -d 4 -n 6 # takes 6 delta of 4 secs each Stream administrator admin and his password can be deduced by smenu if you defined one for this instance in SM/3.8 ortherwise it will try to default to STRMADMIN/STRMADMIN EOF exit } # ------------------------------------------------------------------------------------- function do_execute { $SETXV sqlplus -s "$CONNECT_STRING" < '|| to_char(v_delta) ); DBMS_OUTPUT.PUT_LINE ('. %occup' ); DBMS_OUTPUT.PUT_LINE ('Propagation Statistic name Start value(kb) End value(kb) Delta(kb) Delta Kb/s dblink'); DBMS_OUTPUT.PUT_LINE ('------------------------------ ---------------------------------------- --------------- -------------- ---------- ----------- ----------') ; if b.count = 0 then return 1 ; end if; v_cpt:=0; FOR i in b.FIRST .. b.LAST LOOP if b.exists(i) then if a.exists(i) then -- we found a match of keys between A and B if a(i).c_prop_name = v_old_prop then v_prop:='.' ; else v_prop:=a(i).c_prop_name; if v_old_prop != 'to_init' then dbms_output.put_line(chr(10) ); end if; v_old_prop:=a(i).c_prop_name; end if; if tot_dblk > 0 then v_perc:=to_char( ((b(i).c_value-a(i).c_value))/tot_dblk *100 ,'990.9') ; else v_perc:='0'; end if; dbms_output.put_line(rpad(v_prop,31,' ') || rpad(a(i).c_stat_name,42,' ') || rpad(to_char(a(i).c_value/v_div,'99999999990.9'),15,' ') || rpad(to_char((b(i).c_value)/v_div,'99999999990.9'),15,' ') || rpad(to_char((b(i).c_value-a(i).c_value)/v_div,'9999990.9'),12,' ') || rpad(to_char((b(i).c_value-a(i).c_value)/v_delta/v_div,'9999990.9'),13,' ') || lpad(v_perc,9,' ') ); else DBMS_OUTPUT.PUT_LINE('Nk'||to_char(i) ); end if; end if ; END LOOP ; return 1 ; end; -- end function display result -- .................................................................. begin for r in 1..v_num_loop loop key:=0 ; v_cpt:=0 ; if a.last is null then for s in ( select distinct to_number( substr(s.session_id, 0, instr(session_id,',')-1) ) sid , p.propagation_name from DBA_QUEUE_SCHEDULES s, DBA_PROPAGATION p WHERE p.DESTINATION_DBLINK = NVL(REGEXP_SUBSTR(s.destination, '[^@]+', 1, 2), s.destination) AND s.SCHEMA = p.SOURCE_QUEUE_OWNER AND s.QNAME = p.SOURCE_QUEUE_NAME and s.message_delivery_mode='BUFFERED' and session_id is not null order by 1 ) loop v_cpt:=v_cpt+1; for c in ( select a.statistic#, value, name from v\$sesstat a, v\$statname b where sid = s.sid and a.statistic#=b.statistic# and b.name like 'bytes%dblink%' order by a.sid, a.statistic# ) loop key:=(v_cpt*10000) + c.statistic# ; -- for every session we add a multiple of 10.000 to the key so that each stats# becomes unique a(key).c_sid:=s.sid; -- v_cpt = 1 for first session, 2 for second etc..... a(key).c_prop_name:=s.propagation_name; a(key).c_stat#:=c.statistic#; a(key).c_value:=c.value; a(key).c_stat_name:=c.name; end loop; end loop; end if; -- take the First system measurement for sm in (select STATISTIC#, value from v\$sysstat where name like 'bytes%dblink%') loop -- a_sys(sm.STATISTIC#):=sm.value; a_sys_tot:=a_sys_tot+sm.value; end loop; dbms_lock.sleep(v_delta); key:=0; v_cpt:=0; for s in ( select distinct to_number( substr(session_id, 0, instr(session_id,',')-1) ) sid , p.propagation_name from DBA_QUEUE_SCHEDULES s, DBA_PROPAGATION p WHERE p.DESTINATION_DBLINK = NVL(REGEXP_SUBSTR(s.destination, '[^@]+', 1, 2), s.destination) AND s.SCHEMA = p.SOURCE_QUEUE_OWNER AND s.QNAME = p.SOURCE_QUEUE_NAME and s.message_delivery_mode='BUFFERED' and session_id is not null order by 1 ) loop v_cpt:=v_cpt+1; for c in ( select a.statistic#, value, name from v\$sesstat a, v\$statname b where sid = s.sid and a.statistic#=b.statistic# and b.name like 'bytes%dblink%' order by a.sid,a.statistic# ) loop key:=(v_cpt*10000) + c.statistic# ; b(key).c_sid:=s.sid; b(key).c_prop_name:=s.propagation_name; b(key).c_stat#:=c.statistic#; b(key).c_value:=c.value; b(key).c_stat_name:=c.name; end loop; end loop; -- take the Second system measurement for sm in (select STATISTIC#, value from v\$sysstat where name like 'bytes%dblink%') loop -- b_sys(sm.STATISTIC#):=sm.value; b_sys_tot:=b_sys_tot+sm.value; end loop; tot_dblk:=b_sys_tot-a_sys_tot; -- read result v_cpt:=show_result; a:=b; -- old values becomes the new references end loop; end ; / EOF done echo exit # ................................................................................... elif [ "$CHOICE" = "STATS_R" ];then SQL=" COLUMN SRC_QUEUE_NAME HEADING 'Source|Queue|Name' FORMAT A20 COLUMN DST_QUEUE_NAME HEADING 'Target|Queue|Name' FORMAT A20 COLUMN SRC_DBNAME HEADING 'Source|Database' FORMAT A15 COLUMN ELAPSED_UNPICKLE_TIME HEADING 'Unpickle|Time' FORMAT 99999999.99 COLUMN ELAPSED_RULE_TIME HEADING 'Rule|Evaluation|Time' FORMAT 99999999.99 COLUMN ELAPSED_ENQUEUE_TIME HEADING 'Enqueue|Time' FORMAT 99999999.99 SELECT SRC_QUEUE_NAME, SRC_DBNAME,DST_QUEUE_NAME, (ELAPSED_UNPICKLE_TIME / 100) ELAPSED_UNPICKLE_TIME, (ELAPSED_RULE_TIME / 100) ELAPSED_RULE_TIME, (ELAPSED_ENQUEUE_TIME / 100) ELAPSED_ENQUEUE_TIME, TOTAL_MSGS,HIGH_WATER_MARK FROM V\$PROPAGATION_RECEIVER; " # ................................................................................... elif [ "$CHOICE" = "STATS" ];then SQL=" prompt prompt ++ EVENTS AND BYTES PROPAGATED FOR EACH PROPAGATION++ prompt COLUMN Elapsed_propagation_TIME HEADING 'Elapsed |Propagation Time|(Seconds)' FORMAT 9999999999999999 COLUMN TOTAL_NUMBER HEADING 'Total Events|Propagated' FORMAT 9999999999999999 COLUMN SCHEDULE_STATUS HEADING 'Schedule|Status' column elapsed_dequeue_time HEADING 'Total Dequeue|Time (Secs)' column elapsed_propagation_time HEADING 'Total Propagation|Time (Secs)' justify c column elapsed_pickle_time HEADING 'Total Pickle| Time(Secs)' justify c column total_time HEADING 'Elapsed|Pickle Time|(Seconds)' justify c column high_water_mark HEADING 'High|Water|Mark' column acknowledgement HEADING 'Target |Ack' prompt pickle : Pickling is the action of building the messages, wrap the LCR before enqueuing prompt set linesize 150 SELECT p.propagation_name,q.message_delivery_mode queue_type, DECODE(p.STATUS, 'DISABLED', 'Disabled', 'ENABLED', 'Enabled') SCHEDULE_STATUS, q.instance, q.total_number TOTAL_NUMBER, q.TOTAL_BYTES/1048576 total_bytes, q.elapsed_dequeue_time/100 elapsed_dequeue_time, q.elapsed_pickle_time/100 elapsed_pickle_time, q.total_time/100 elapsed_propagation_time FROM DBA_PROPAGATION p, dba_queue_schedules q WHERE p.DESTINATION_DBLINK = NVL(REGEXP_SUBSTR(q.destination, '[^@]+', 1, 2), q.destination) AND q.SCHEMA = p.SOURCE_QUEUE_OWNER AND q.QNAME = p.SOURCE_QUEUE_NAME order by q.message_delivery_mode, p.propagation_name; " # ................................................................................... elif [ "$CHOICE" = "SET_LAT" ];then set -x # ------------------------------------------------------------------------------------ #-- DBMS_AQADM.ALTER_PROPAGATION_SCHEDULE( #-- queue_name => '&&ApplSchema._strms_q', #-- destination => '@&&RemoteDBTNSName', #-- latency => NewParamVal, #-- destination_queue => '&&ApplSchema._strms_q'); # EXEC DBMS_AQADM.ALTER_SCHEDULE(queue_name,destination,latency=>1); case $vers in 9 ) SQL="execute DBMS_AQADM.ALTER_PROPAGATION_SCHEDULE( queue_name => '$fowner.$fqueue', destination => '$fdblink', latency=>$latency)" ;; 10) SQL="col DESTINATION_QUEUE_NAME new_value DESTINATION_QUEUE_NAME noprint col DESTINATION_DBLINK new_value DESTINATION_DBLINK noprint col source_queue_name new_value source_queue_name noprint select SOURCE_QUEUE_NAME, DESTINATION_QUEUE_NAME, DESTINATION_DBLINK from SYS.DBA_PROPAGATION where propagation_name = upper('$fprop'); set serveroutput on size 9999 col cmd new_value cmd noprint execute DBMS_AQADM.ALTER_PROPAGATION_SCHEDULE( queue_name => 'STRMADMIN.&source_queue_name', destination =>'&DESTINATION_DBLINK', destination_queue=>'&DESTINATION_QUEUE_NAME', latency=>$latency, duration=>null, next_time=>null) ;" ;; esac # ................................................................................... elif [ "$CHOICE" = "STOP" ];then #SQL="execute DBMS_AQADM.DISABLE_PROPAGATION_SCHEDULE ( queue_name => '$fowner.$fqueue', destination => '$fdblink');" SQL="execute DBMS_PROPAGATION_ADM.stop_propagation('$fprop',force=>true);" # ................................................................................... elif [ "$CHOICE" = "START" ];then if [ "$vers" -eq 9 ];then SQL="$TRACE execute DBMS_PROPAGATION_ADM.start_PROPAGATION( propagation_name => '$fowner.$fprop');" else SQL=" execute DBMS_PROPAGATION_ADM.start_propagation('$fprop');" fi elif [ "$CHOICE" = "DROP" ];then if [ $vers -eq 9 ];then SQL="execute DBMS_PROPAGATION_ADM.DROP_PROPAGATION( propagation_name => '$fowner.$fprop');" else SQL="execute DBMS_PROPAGATION_ADM.DROP_PROPAGATION( propagation_name => '$fprop');" fi # ................................................................................... elif [ "$CHOICE" = "RECREATE" ];then SQL=" col propagation_name new_value propagation_name noprint col RULE_SET_NAME new_value RULE_SET_NAME noprint col RULE_SET_OWNER new_value RULE_SET_OWNER noprint col source_queue_name new_value source_queue_name noprint col source_queue_owner new_value source_queue_owner noprint col QUEUE_TO_QUEUE new_value QUEUE_TO_QUEUE noprint col DESTINATION_QUEUE_NAME new_value DESTINATION_QUEUE_NAME noprint col DESTINATION_QUEUE_OWNER new_value DESTINATION_QUEUE_OWNER noprint col DESTINATION_DBLINK new_value DESTINATION_DBLINK noprint col negative_rule_set_name new_value negative_rule_set_name noprint select propagation_name , RULE_SET_NAME, source_queue_name,QUEUE_TO_QUEUE, DESTINATION_QUEUE_NAME , RULE_SET_OWNER,SOURCE_QUEUE_OWNER, DESTINATION_DBLINK,negative_rule_set_name,DESTINATION_QUEUE_OWNER from SYS.DBA_PROPAGATION; col neg_rls new_value neg_rls select decode(NEGATIVE_RULE_SET_OWNER||'.'||NEGATIVE_RULE_SET_NAME ,'.','null', NEGATIVE_RULE_SET_OWNER||'.'||NEGATIVE_RULE_SET_NAME ) neg_rls from SYS.DBA_PROPAGATION where propagation_name = upper('$fprop'); execute DBMS_AQADM.DISABLE_PROPAGATION_SCHEDULE ( queue_name => '&DESTINATION_QUEUE_OWNER..&source_queue_name', destination => '&DESTINATION_DBLINK'); execute DBMS_PROPAGATION_ADM.DROP_PROPAGATION( propagation_name => '$fprop'); execute DBMS_PROPAGATION_ADM.CREATE_PROPAGATION( propagation_name => '$fprop', source_queue => '&SOURCE_QUEUE_OWNER..&&source_queue_name', destination_queue => '&DESTINATION_QUEUE_OWNER..&DESTINATION_QUEUE_NAME', destination_dblink => '&DESTINATION_DBLINK', rule_set_name=>'&RULE_SET_OWNER..&rule_set_name' , negative_rule_set_name=>&neg_rls , queue_to_queue=> true); " # ................................................................................... elif [ "$CHOICE" = "CREATE" ];then SQL="execute DBMS_PROPAGATION_ADM.CREATE_PROPAGATION( propagation_name => '$fowner.$fprop', source_queue => '$fowner.$fsrc_q', destination_queue => '$fowner.$fdest_q', destination_dblink => '$fdblink');" elif [ "$CHOICE" = "LIST_PROP" ];then SQL="set lines 190 select PROPAGATION_NAME prop, RULE_SET_NAME rsname , nvl(DESTINATION_DBLINK,'Local to db') d_dblk,NEGATIVE_RULE_SET_NAME from dba_propagation ; select SOURCE_QUEUE_OWNER||'.'|| SOURCE_QUEUE_NAME nams , DESTINATION_QUEUE_OWNER||'.'|| DESTINATION_QUEUE_NAME|| decode( DESTINATION_DBLINK,null,'','@'|| DESTINATION_DBLINK) namd, status , QUEUE_TO_QUEUE from dba_propagation ;" fi # ................................................................................... # Execution takes places here # ................................................................................... if [ "$EXECUTE" = "YES" ];then do_execute else echo "$SQL" fi