몇일 전 프로세스 이슈인 줄 알고 찾아보면서,

하루에 한번씩 프로세스 현황을 각 DB 마다 수집 하여 

통계가 필요할 것 같아 스크립트를 작성해 보았다.


대충은 아니지만 후다닥 만든 부분 이라 앞으로 테스트로 수집하면서

필요하거나 부족한 부분을 보충하면서 완성해야 될 것 같다.


대략 흐름은 아래와 같다.


1. 모니터링을 관장할 DB에서 각 수집을 해야할 DB들의 Link를 생성

2. DB Link를 통해 매일 오전 7시에 각 DB 의 session과 Process 를 수집

  (Scheduler 를 이용)

3. 수집 대상은 session / process / instance / host 등이 된다.

  (RAC 장비들이 다수이기 때문에 gv$를 이용하여 진행)


스크립트는 아래와 같다


--DB Link생성

CREATE PUBLIC DATABASE LINK DBA_LINK

CONNECT TO SYSTEM

IDENTIFIED BY 비밀번호

USING '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = DBIP)(PORT = 포트)))(CONNECT_DATA = (SERVICE_NAME = DB서비스명)))';


--정보를 저장할 Table 생성  

create table chk_session

(

l_date date default sysdate not null,

l_instance nvarchar2(20),

l_hostname nvarchar2(20),

ss_max number default 0,

ss_current number default 0,

ss_limit number default 0,

ss_active number default 0,

ss_inactive number default 0,

ps_max number default 0,

ps_current number default 0,

ps_limit number default 0

);


--procedure 생성

create or replace procedure SYS.proc_chk_session

is

begin

  insert into chk_session

 select 

    sysdate as rs_date,

    b.instance_name AS RS_INSTANCE,

    b.host_name AS RS_HOSTNAME,

    MAX(case when  resource_name='sessions' then MAX_UTILIZATION end) as SESSION_MAX,

    MAX(case when  resource_name='sessions' then CURRENT_UTILIZATION end) as SESSION_CURRENT,

    MAX(case when  resource_name='sessions' then LIMIT_VALUE end) as SESSION_LIMIT,

    MAX((SELECT  COUNT(*) FROM GV$SESSION@DBA_LINK C WHERE C.STATUS='ACTIVE' and b.inst_id=c.inst_id)) AS SESSION_CURRENT_ACTIVE,

    MAX((SELECT  COUNT(*) FROM GV$SESSION@DBA_LINK C WHERE C.STATUS='INACTIVE' and b.inst_id=c.inst_id)) AS SESSION_CURRENT_INACTIVE,

    MAX(case when  resource_name='processes' then MAX_UTILIZATION end) as PROCESS_MAX,

    MAX(case when  resource_name='processes' then CURRENT_UTILIZATION end) as PROCESS_CURRENT,

    MAX(case when  resource_name='processes' then LIMIT_VALUE end) as PROCESS_LIMIT

  from gv$resource_limit@DBA_LINK a, gv$instance@DBA_LINK b

  where a.resource_name in ('processes', 'sessions')

    and a.inst_id = b.inst_id

  GROUP BY sysdate, b.instance_name, b.host_name;

end;

/


--scheduler 생성

begin 

SYS.dbms_scheduler.create_job

  (job_name => 'check_session_db'

  ,start_date      => TO_TIMESTAMP_TZ('2016/01/16 07:00:00','yyyy/mm/dd hh24:mi:ss')

  ,job_class  => 'DEFAULT_JOB_CLASS'

  ,JOB_TYPE => 'PLSQL_BLOCK'

  ,repeat_interval => 'FREQ=DAILY; INTERVAL=1'

  ,job_action => 'BEGIN PROC_CHK_SESSION; END;'

  );

end;

/

--scheduler 활성화 및 테스트 실행

exec sys.dbms_scheduler.enable('check_session_db');

exec sys.dbms_scheduler.run_job('check_session_db');

 



정말 허접해 보이기는 하지만 나는 이것도 내 경험이라 생각해 본다.


수정 보완점은 아래와 같다.

1. system 계정으로 진행했기 때문에 보안상 문제가 될 소지가 있다. 그래서 이 부분을 각 권한을 따로 부여하여 진행

2. 성능 부분을 체크 안했기 때문에 플랜을 확인하여 최소한의 리소스를 사용


이렇게 하나하나 쿼리를 작성하는 것도 좋을 듯 하다.


반응형

'Oracle > DBA' 카테고리의 다른 글

[튜닝가이드] 인덱스 사용 여부 관련 생각 + [펌]  (0) 2016.10.06
[펌][ORACLE] ORA-에러  (0) 2015.12.22
[Oracle] Index monitoring  (0) 2015.12.14
[Oracle] Partition Local Index 테스트  (0) 2015.12.02
[ORACLE] ASM 에 Datafile 추가  (1) 2015.11.25

+ Recent posts