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"