conn /@DB1 as sysdba
set serveroutput on size 1000000
set linesize 200
set feedback off
set trimspool on trimout on
spool c:\dispatcher_control\dispatcher_control_run.sql
declare
type disp_no_type is table of varchar2(4)
index by binary_integer;
disp disp_no_type;

script1 varchar2(1000);
script2 varchar2(1000);
script3 varchar2(1000);
v_shut_counter number(1) default 0;
v_max_disp number(2) default 0;
v_new_disp_no number(2) default 0;

begin
 
 -- DISPATCHER(S) for shutting down IMMEDIATE
 for rec in (select name from v$dispatcher
             where accept = 'NO'
             ) loop
     dbms_output.put_line('exec dbms_lock.sleep(120)');
     script1:='alter system shutdown immediate '''||rec.name||''';';
     dbms_output.put_line(script1);
 end loop;

v_shut_counter:=0;
 -- DISPATCHER(S) for shutting down
 for rec in (
            select distinct d.name as dispatcher_name
            from v$process p, v$session s, v$dispatcher d
            where p.addr=s.paddr
            and p.addr not in (select paddr from v$bgprocess)
            and s.last_call_et >= 50000 and s.logon_time < sysdate-1
            and s.status = 'INACTIVE' and s.server <> 'DEDICATED' and p.addr = d.paddr
            and accept = 'YES'
           ) loop
     v_shut_counter:=v_shut_counter+1;
     disp(v_shut_counter):=rec.dispatcher_name;
 end loop;

 if v_shut_counter = 0 then
    return;  -- exit
 end if;

 select value
 into v_max_disp
 from v$parameter
 where name ='mts_max_dispatchers';

 if v_shut_counter < v_max_disp then
    v_new_disp_no:=v_shut_counter+3;
    if v_new_disp_no > v_max_disp then
       v_new_disp_no:=v_max_disp;
    end if;

    script2:='alter system set mts_dispatchers=''(address=(protocol=tcp))(dispatchers='||v_new_disp_no||')(connections=500)(sessions=1000)'';';
    dbms_output.put_line(script2);  
    for i in 1..v_shut_counter  loop
        dbms_output.put_line('exec dbms_lock.sleep(5)');   
        script3:='alter system shutdown '''||disp(i)||''';';
        dbms_output.put_line(script3);
    end loop;
 end if;
end;
/
spool off
@c:\dispatcher_control\dispatcher_control_run.sql

arrow
arrow
    全站熱搜

    DanBrother 發表在 痞客邦 留言(0) 人氣()