Sunday, May 4, 2014

Light Weight Monitoring System (LWM) ตอนที่ 3

ข้อเขียนนี้ช่วยฉัน: 
โพสต์ครั้งแรก: 8 เมษายน 2011

ขั้นตอนการทำ Step-by-Step
ขั้นตอนการทำต่อไปนี้เป็นการสาธิตให้เห็นถึงวิธีการสร้างระบบ LWM อย่างง่าย ๆ โดยเริ่มจากสร้าง Tablespace ที่จะใช้เก็บข้อมูล และสร้าง User/Schema ที่จะใช้เก็บข้อมูลของระบบ โดยเราตั้งชื่อว่า LWM, เราจะใช้ SYS เป็นผู้สร้างระบบนี้ เริ่มจากการ Connect เข้าระบบด้วย SYSDBA
วิธีการและสคริปต์ต่าง ๆ ที่ระบุไว้ ณ ที่นี้ได้รับการทดสอบแล้วเป็นการภายใน ซึ่งสามารถใช้งานได้ตามที่ระบุไว้ อย่างไรก็ตามเราไม่สามารถรับรองได้ว่าจะได้ผลสำเร็จทุกประการสำหรับผู้อ่าน กรุณาทดสอบในสิ่งแวดล้อมของคุณก่อนที่จะใช้งานจริง
$ sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.2.0 - Production on Fri Apr 8 10:42:33 2011

Copyright (c) 1982, 2005, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> create tablespace lwm datafile '/opt/oracle/oradata/PAO1/lwm01.dbf' size 5m autoextend on maxsize 10m;

Tablespace created.

SQL> create user lwm identified by lwm
2 default tablespace lwm;

User created.

SQL> grant connect to lwm;

Grant succeeded.

SQL> alter user lwm quota unlimited on lwm;

User altered.

หลังจากนั้นเราจะสร้างตารางที่เอาไว้สำหรับเก็บข้อมูล Session ทุก ๆ หนึ่งนาที (SESS_MON), ตารางที่เอาไว้เก็บข้อมูลเก่าของตาราง SESS_MON ชื่อ SESS_MON_HISTORY และสุดท้ายตารางที่ใช้ในการเก็บค่า Baseline ชื่อ SESS_MON_BASE

SQL> create table lwm.sess_mon
2 (sess_time date,
3 sess_cnt number(4),
4 max_last_call_et number(8))
5 nologging;

Table created.

SQL> create table lwm.sess_mon_hist
2 as select * from lwm.sess_mon;

Table created.

SQL> create table lwm.sess_mon_base
2 (sess_cnt_base number(4),
3 max_last_call_et_base number(6),
4 base_date date);

Table created.

สิ่งที่เราต้องการทำทุก ๆ หนึ่งนาทีคือการบันทึก (Insert) ข้อมูลจำนวนของ Session ณ ขณะนั้น และ Last Call Elapse Time ที่สูงที่สุด ณ ขณะนั้น โดยเราใช้คำสั่ง
SQL> insert into lwm.sess_mon (sess_time,sess_cnt,max_last_call_et)
2 select sysdate,count(*),max(last_call_et)
3 from v$session
4 where username is not null
5 and status = 'ACTIVE';

จากนั้นเราจะมาถึงส่วนที่ยุ่งยากขึ้นอีกนิดคือการสร้าง Job ซึ่งก็คือการกำหนดเวลาให้ Oracle ทำงานทุก ๆ ช่วงเวลาที่เรากำหนดเช่นทุกหนึ่งนาทีให้ Insert ข้อมูลเข้าตารางข้างต้น
SQL> variable jobno number
SQL> begin
2 dbms_job.submit(:jobno,
3 'insert into lwm.sess_mon
4 (sess_time,sess_cnt,max_last_call_et)
5 select sysdate,count(*),max(last_call_et)
6 from v$session
7 where username is not null
8 and status = ''ACTIVE'';',
9 sysdate,'SYSDATE+1/24/60');
10 commit;
11 end;
12 /

PL/SQL procedure successfully completed.

เราสามารถเช็คได้ว่า Job ทำงานอยู่โดยคิวรีข้างล่างนี้ โดยทุก ๆ หนึ่งนาทีค่าในคอลัมน์ NEXT_SEC จะต้องบวกเพิ่มขึ้นหนึ่งนาที, BROKEN จะต้องเท่ากับ ‘N’ และ FAILURES = 0
SQL> set time on
09:31:34 SQL> select job,substr(what,1,20),last_sec,next_sec,broken,failures
2 from dba_jobs
3 ;
JOB        SUBSTR(WHAT,1,20)    LAST_SEC NEXT_SEC B FAILURES
---------- -------------------- -------- -------- - ----------
1          EMD_MAINTENANCE.EXEC 09:30:46 09:31:46 N 0
22         insert into lwm.sess 09:31:06 09:32:06 N 0

09:31:50 SQL> /

JOB        SUBSTR(WHAT,1,20)    LAST_SEC NEXT_SEC B FAILURES
---------- -------------------- -------- -------- - ----------
1          EMD_MAINTENANCE.EXEC 09:31:46 09:32:46 N 0
22         insert into lwm.sess 09:32:06 09:33:06 N 0

ถ้าเราต้องการลบ Job ทิ้งเพื่อรันใหม่ให้รันคำสั่งต่อไปนี้ ระวังต้องใส่หมายเลข JOB ให้ถูก เพราะบางทีอาจจะมี Job อื่น ๆ อยู่ด้วย ดูให้ดี ๆ นะครับ
SQL> begin
2 dbms_job.remove (22)
3 ;
4 end;
5 /

PL/SQL procedure successfully completed.

สมมติว่า Job ของเราใช้การได้ เราจะพบข้อมูลในตาราง SESS_MON ของเราเมื่อเวลาผ่านไปสักพัก
SQL> set pagesize 100
SQL> select to_char(sess_time,'dd-mon-yy hh24:mi'),sess_cnt,max_last_call_et
2 from lwm.sess_mon;

TO_CHAR(SESS_TI   SESS_CNT MAX_LAST_CALL_ET
--------------- ---------- ----------------
08-apr-11 09:21          3               30
08-apr-11 09:22          3               30
08-apr-11 09:23          3               30
08-apr-11 09:24          3               30
08-apr-11 09:28          3              197
08-apr-11 09:28          3               15
08-apr-11 09:29          3               20
08-apr-11 09:30          3               20
08-apr-11 09:31          3               20
08-apr-11 09:32          3               20


10 rows selected.


No comments:

Post a Comment