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

하루에 한번씩 프로세스 현황을 각 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

가장 최근의 연재인 (작년 12/24) #8 화를 제대로 읽지를 못해서 정리하는데 시간이 조금 더 소요 되었다.


이번에는 #5부터 #8까지 내용을 정리 하였다.


이 글은 어쩌면 Andrew 님의 정리를 또 정리한 것이기 때문에 자세한 부분은 DB Guide net을 통해서 찾아보거나,

이 분이 여기저기 많이 작성한 글들이 인터넷에 있기 때문에 조금만 검색해 봐도 나올 것이다.


#5

SDN(Software Defined Network) controller

[중앙에서 모든 곳의 트래픽과 경로의 상태를 보면서 패킷이 가는 경로를 조절하는 것]


Openflow 

[SDN Controller에게 보내고 받는 명령어를 표준화]


OVS(Open Virtual Switch)

[Openflow를 사용할 수 있게 만든 오픈소스기반의 소프트웨어 스위치]

 

ex) SDN Controller는 네이베이션 안내서버 / openflow는 데이터 망 또는 핸드폰앱과 서버간의 통신 프로토콜 / OVS는 운전자


Reactive

[OVS의 경우 자신에게 설정된 flow가 없는 새로운 패킷이 들어올 때 반드시 SDN Controller에 접속해서 경로를 받아와야만 패킷을 처리]


proactive / predefined

[OVS가 SDN Controller에게 묻지 않고 자신이 알아서 차단하거나 특정 경로로 보내는 것]


1. SDN Controller에서는 클러스터 형태의 Controller를 개발하거나 분산 데이터 베이스를 사용해서 부하를 최대한 분산

2. Openflow 를 통해 패킷의 경로들이 실제 물리 네트워크는 터널 형태로 모두 연결이 되어 있어야만 함


원문

http://www.dbguide.net/knowledge.db?cmd=specialist_view&boardUid=187658&boardConfigUid=117&boardStep=0


▶해당 차트는 내용은 이해가 되지만 조금 더 깊게는 이해하기 힘들어서 정리가 힘들었습니다.


------------------------------------

#6

아마존에서 한국에 별도의 데이터 센터를 갖추어서 해당 지역내에 원활하게 가상 머신과 네트워크를 제공하는 단위를 발표

하지만 그 이전에도 몇몇 클라우드 서비스를 할려는 글로벌 기업들이 자체 데이터 센터를 세우는 대신 대기업의 데이터 센터를 임대하여 사


용함으로써 경쟁이 아닌 대기업과 상생을 하려고 함


이후 내용들은 주관적인 부분이 감미 되어 있기에 읽는 독자들의 생각과 상이할 수 있다고 느끼기에 원문으로 대체합니다.

[저는 Andrew님과 비슷한 생각을 가지고 있습니다.]


http://www.dbguide.net/knowledge.db?cmd=specialist_view&boardUid=188289&boardConfigUid=117&boardStep=0


-------------------------------------

#7

클라우드에 대해서 이야기하고 있지만 자신이 하고 있는 일에 충실하면 된다...라는 뜻으로 이해하였습니다.

지금 저에게 가장 필요한 이야기 일듯...


--------------------------------------

#8

클라우드 컴퓨팅

[프로그램가능한 리소스 관리(Protrammable resource management)]


Programmable

[프로그램 코드로써 리소스들을 관리] - 일정한 룰과 규칙을 정확하게 이해할 줄 아는 사람이 해야함(사용하는 제품의 SLA(Service Level 


Agreement) 를 정확하게 이해해야하고 제공자는 이 룰에 맞도록 제품과 서비스를 만들어야 함


Resource

[계산이나 계산에 필요한 자료를 저장하는 자원]

- 클라우드에서 제공하는 리소스는 측정 가능해야 함 (측정이 가능해야지 사용자가 얼마나 사용했는지 이에 대해 가격 및 Abusing을 막을 수 있음)

- 독립적이어야 함(멀티 테넌시의 개념과 비슷한데 추가/제거가 가능하기 때문 - CPU는 측정이 가능하지만 독립적으로 추가나 제거가 불가)


ex) 아마존의 lambda라는 서비스는 작업을 정의해 두면 해당 작업이 수행된 시간만큼만 과금(밀리초 단위)


클라우드는 이러한 프로그램 가능한 리소스를 관리

- 생성, 삭제 부터 크기 변환 등

- 자동으로 리소스의 라이프 사이클을 관리할 수 있기 때문에 auto-scale-out 또는 auto-scale-in 가능


앞으로 self-management의 특성상 클라우드 사용자가 자신의 리소스를 관리하기 때문에 이러한 기능을 api화 해서 판매도 가능


추가로 연재가 올라오면 정리해서 올리겠습니다.


또한 Cloud 관련해서 좋은 기사나 내용이 있으면 블로그 하도록 하겠습니다.

반응형

'Cloud' 카테고리의 다른 글

[Cloud] Andrew 의 Cloud 정리-1  (0) 2016.01.13

아침부터 장애를 해결하다 보면 시간은 빨리가지만,

그만큼 빨리 지치는 것 같다.


아침에 WAS에서 DB로 접속이 간간이 안된다고 하는데, Toad에서는 접속이 잘 된다는 소리에,

크게 개의치 않고 천천히 Alert 로그를 봤다.


헉!!!!!

ORA-12516: TNS:listener could not find available handler with matching protocol stack


검색해 보니 너무나도 잘 나온 블로그가 나와 있어서...그대로 가져와 쓰고 싶지만..조금만 가져왔다-ㅎ

[출처]http://justckh.blogspot.kr/2013/09/oracle-ora-12516-tns.html

Problem
ORA-12516: TNS:리스너가 프로토콜 스택과 일치하는 처리기를 찾을 수 없습니다.

Cause
Oracle DB를 이동하여 Application을 가동하다 보면 위와 같은 Message와 마주칠 수 있습니다.

이는 동시 처리 가능한 Processes parameter 값을 초과했기 때문에 더 이상 Session을 연결할 수 없다는 message입니다.

Resolution
Processes parameter 값을 변경해주면 됩니다.


음???process 값이 수정..

확인해봤다.


참고로 여기는 2 node RAC라서 gv$resource_limit 으로 검색했다.



응??

MAX 값은 아니다...

그래서 해당 job 들에 대해서 확인을 해봤다.

어떠한 공통점이 있는지...


확인해 보니, DB_LINK가 모두 사용하고 있었다.

(개발자님...왜 같은 DB에 있는 유저에 대해서도 DB_LINK를 사용해서 보시나요...그냥 권한만 받아서 select 하시지.....-_-+++)


DB_LINK로 접속 테스트해 보았다.


앞에서 적었듯이 2node rac 이기에, 각자 instance에 접속을 테스트 해 보았다.


1번 Instance 는 전혀 문제 없이 접속..

2번 Instance는 접속이 안된다!!!!!!!!리스너 status 는 정상이며 아래와 같이 에러가 발생한다

TNS-12520: TNS:listener could not find available handler for requested type of server


TNS-12520: TNS:listener could not find available handler for requested type of server


Cause: None of the known and available service handlers for requested type of server (dedicated or shared) are appropriate for the client connection.


Action: Run "lsnrctl services" to ensure that the instance(s) have registered with the listener and that the appropriate handlers are accepting connections.

흠...

LSNRCTL SERVICES 를 확인해 보니, state 가 Block 인 것을 확인.


리스너 로그는 어느 순간 4g........왜???

매달 정리해 주는데, 언제 4g Full이 되어 있을까.


리스너 로그는 아래와 같은 에러가 계속 있는 것을 확인 하였다.

...

14-JAN-2016 13:45:03 * nsevwait_error * 0

14-JAN-2016 13:45:03 * nsevwait_error * 0

....


lsnrctl log_status off 로 한 후 

리스너 로그를 정리 및 리스너 재시작하였다.


이후에는 에러 발생이 되지 않았아.


해결은 했지만, 무슨 이유로 위와 같은 로그가 끊임없이 쌓였는지 확인이 되지 않는다.

DB Link와 관련된 문제 인 듯 한데...

원인이 발견되면 업데이트 해야겠다.


오늘도 Clear!!!!


반응형

+ Recent posts