Blog ' da Ara

Loading

28 Aralık 2011

Oracle ‘da Mail Göndermek & Grid Control Target Status Monitor Etmek


Veritabanı  Yönetiminde bazen bir durumu sürekli veritabanı üzerinden kontrol etmemeiz yada monitor etmemeiz gerekebilir. İstemediğimiz bir event oluştuğunda anında haberdar olmak ve mudahale etmek isteriz.Bunun için veritabanında çalıştırdığımız sql yada pl/sql programların bize döndürdüğü sonuç nasıl mail atılır inceleyelim.

Öncelik Veritabanında mail atmak için aşağıdaki ayarlamaların yapılması gerekmektedir.
Mail gönderebilmemeiz için bizim bir SMTP configurasyonu yapılmış bir makinamız olmalı.Bu makinanın IP sini aşağıdaki gibi veritabanına tanıtacağız.Örneğin bizim SMTP server IP miz 192.168.2.1 olsun.SMTP konfigurasyonunda default port 25 dir.Bu yüzden port tanımlamayacağız.Siz isterseniz farklı port tanımlayabilirsiniz.Bu durumda oracle üzerinde de SMTP_OUT_SERVER=’192.168.2.1:NEW_PORT’ şeklinde parametre set etmeniz gerekir.

SQL> ALTER SYSTEM SET SMTP_OUT_SERVER=’192.168.2.1’ scope=BOTH;
Daha Sonra mail göndereceğimiz Oracle USER için ACL(Access Control List) Tanımları yapmalıyız.

Örneğin mail göndereceğimiz user SYSMAN olsun. Hatta SYSMAN bize Grid Control tarafından izlenen Oracle Veritabalarından bilgi alınmasını sağlayan Grid Kontrol Agent ve Targetlerin durumlarını belli periyodlarla sorgulayıp bize mail atacak olsun.Bu durumda önce SYSMAN için ACL tanımlayalım.
EXECUTE DBMS_NETWORK_ACL_ADMIN.CREATE_ACL('acl_for_mail.xml', 'ACL for Control Center','SYSMAN', TRUE, 'connect');
EXECUTE DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('acl_for_mail.xml','192.168.2.1', 25);
COMMIT;
EXEC DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl =>'acl_for_mail.xml',principal=>'SYSMAN',is_grant=>true,privilege=>'connect');
EXEC DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl =>'acl_for_mail.xml',principal=>'SYSMAN',is_grant=> true,privilege=>'resolve');
COMMIT;
--exec DBMS_NETWORK_ACL_ADMIN.DROP_ACL('acl_for_mail.xml');
COMMIT;
Sonrasında bazı $ORACLE_HOME/rdbms/admin altında bulunan aşağıdaki paketleri kurmamaız gerekiyor.
SQL>@$ORACLE_HOME/rdbms/admin/utlmail.sql;
SQL>@$ORACLE_HOME/rdbms/admin/utlsmtp.sql;
SQL>@$ORACLE_HOME/rdbms/admin/utltcp.sql;
Artık işlemlerimizi yapmamız için tek yapmamaız gereken SYSMAN altında aşağıdaki işlemlerin yapılması.Öncelikle SEND_MAIL adında mail gönderen proceduru oluşturalım.
CREATE OR REPLACE PROCEDURE SYSMAN.send_mail (P_MESSAGE VARCHAR2, SUBJECT VARCHAR2)
IS
   MESG          VARCHAR2 (32767);
   TO_ADDRESS    VARCHAR2 (32767) := '';
   CC_ADDRESS    VARCHAR2 (32767) := '';
   BCC_ADDRESS   VARCHAR2 (32767) := '';
   v_SUBJECT VARCHAR2 (32767);
   C_CRLF             CONSTANT VARCHAR2(20) := CHR(13) || CHR(10);
   CONN          UTL_SMTP.CONNECTION;
   MAX_SIZE           CONSTANT NUMBER := 32767;
BEGIN
   CONN := UTL_SMTP.OPEN_CONNECTION ('192.168.2.1', 25);
   UTL_SMTP.HELO (CONN, '192.168.2.1');
  UTL_SMTP.MAIL (CONN, 'Target_Control');
   UTL_SMTP.RCPT(CONN, 'AlıcıMailAdresi');
   TO_ADDRESS := 'AlıcıMailAdresi';
--Birden çok alıcı adresinin aynı şekilde tanımlayabilirsiniz

   v_SUBJECT := SUBJECT;
   UTL_SMTP.OPEN_DATA (CONN);
   MESG :=
         'Date: '
      || TO_CHAR (SYSDATE, 'dd Mon yy hh24:mi:ss')
      || C_CRLF
      || 'From: '
      || 'Gönderici Adresi'
      || C_CRLF
      || 'Subject: '
      || v_SUBJECT
      || C_CRLF
      || 'To: '
      || TO_ADDRESS
      || C_CRLF
      || 'Cc: '
      || CC_ADDRESS
      || C_CRLF
      || 'Mime-Version: 1.0'
      || C_CRLF
      || 'Content-Type: multipart/mixed; boundary="DMW.Boundary.605592468"'
      || C_CRLF
      || ''
      || C_CRLF
      || '--DMW.Boundary.605592468'
      || C_CRLF
      || 'Content-Type: text/html; charset=US-ASCII'
      || C_CRLF
      || 'Content-Transfer-Encoding: 7bit'
      || C_CRLF
      || ''
      || C_CRLF
      || SUBSTR (P_MESSAGE, 1, MAX_SIZE)
      || C_CRLF;
   UTL_SMTP.WRITE_DATA (CONN, MESG);
   MESG := C_CRLF || '--DMW.Boundary.605592468--' || C_CRLF;
   UTL_SMTP.WRITE_DATA (CONN, MESG);
   UTL_SMTP.CLOSE_DATA (CONN);
   UTL_SMTP.QUIT (CONN);
END;
Şimdide Grid Control Target Stataus Kontrollerini yapacak olan Proseduru tanımlayalım ve elde ettiğimiz bilgileri send_mail prosedurumuz ile mail atalım.
CREATE OR REPLACE procedure SYSMAN.Grid_Target_Monitor as
    l_body         varchar2(32767);
begin
    l_body:='<TABLE BORDER=1 BGCOLOR="#EEEEEE">';
    l_body:=l_body||'<TR BGCOLOR="RED">';
    l_body:=l_body||'<TH><FONT COLOR="WHITE">Host</FONT>';
    l_body:=l_body||'<TH><FONT COLOR="WHITE">Target</FONT>';
    l_body:=l_body||'<TH><FONT COLOR="WHITE">Target_Type</FONT>';
    l_body:=l_body||'<TH><FONT COLOR="WHITE">Target_Status</FONT>';
    l_body:=l_body||'<TH><FONT COLOR="WHITE">Time_Stamp</FONT>';
     l_body:=l_body||'<TH><FONT COLOR="WHITE">Message</FONT>';
    l_body:=l_body||'</TR>';

    FOR c IN (
        SELECT T.HOST_NAME Host,
       substr(T.TARGET_NAME,1,20) Target,
       T.TYPE_DISPLAY_NAME Target_Type,
       DECODE (M.CURRENT_STATUS,
               0, 'Down',
               1, 'Up',
               2, 'Metric Error',
               3, 'Agent Down',
               4, 'Unreachable',
               5, 'Blackout',
               6, 'Unknown') Target_Status,
       M.START_COLLECTION_TIMESTAMP Time_Stamp,
       S.MESSAGE Message
  FROM MGMT_AVAILABILITY m,
       MGMT_TARGETS t,
       mgmt_severity s
       WHERE M.TARGET_GUID = T.TARGET_GUID
         AND S.SEVERITY_GUID = M.SEVERITY_GUID
       AND M.END_COLLECTION_TIMESTAMP IS NULL
         AND M.CURRENT_STATUS IN (0,2,3, 4,6)
ORDER BY Host ,Time_Stamp Desc  )
    LOOP
        l_body:=l_body||'<TR>';
        l_body:=l_body||'<TD>'||c.Host||'</TD>';
        l_body:=l_body||'<TD>'||c.Target||'</TD>';
        l_body:=l_body||'<TD>'||c.Target_Type||'</TD>';
        l_body:=l_body||'<TD>'||c.Target_Status||'</TD>';
        l_body:=l_body||'<TD>'||c.Time_Stamp||'</TD>';
         l_body:=l_body||'<TD>'||c.Message||'</TD>';
        l_body:=l_body||'</TR>';
    END LOOP;
    l_body:=l_body||'</TABLE>';

BEGIN SYSMAN.SEND_MAIL (l_body, 'Grid Control Monitor: Please Control Target''s Status');END;  
end;
/
 Artık Tanımlamalarımız bitti. Exec  SYSMAN.Grid_Target_Monitor; şeklinde çalıştırdığımızda bize grid control üzerindeki targetlerin statuleri, hata sebepleri, target tipleri vs.. istediğiniz bilgiler mail olarak gönderilecek.Peki ama ben bunu saatte bir çalışan job olmasını istiyorum derseniz bu durumda aşağıdaki scriptide çalıştırarak grid Control targetlerini monitor etme işlememizi otomatize etmiş oluruz ve artık sadece gelen maillleri kontrol ederek bir sorun olduğunda targetlere mudahale edip gerekli aksiyonu almış oluruz.
DECLARE
  X NUMBER;
BEGIN
  SYS.DBMS_JOB.SUBMIT
    (
      job        => X
     ,what       => 'begin SYSMAN.GRID_TARGET_MONITOR;end;'
     ,next_date  => to_date('12.26.2011 02:30:09','mm/dd/yyyy hh24:mi:ss')
     ,interval   => 'SYSDATE+1/24 '
    );
:JobNumber := to_char(X);
END;

                Grid Control Mimarisi, Yönetimi, Konfigürasyonu ve kurulumu hakkında bilgilere ilerleyen yazılarımızda yer vereceğiz.Faydalı olması dileğiyle.
                                                                                                Özcan YILDIRIM

0 YORUM:

Yorum Gönder

"Sorularınız ve Eleştirileriniz Değerlidir"