본문 바로가기

빅데이터과정/WORKSHOP 2

#31_140725_WSHOP2_SCHEDULER

728x90

# SCHEDULER






  
특정 스크립트를 특정시간에 돌아가도록 자동화 하는 방법
1.     리눅스에 crontap 기능
2.     dmbs_job 패키지를 사용(9i 버전)
3.     dbms_scheduler 패키지를 사용(10g) 버전



스케줄을 사용해서 작업을 편하게 할 수 있게 하려면





스케줄 사용방법
1.     시간 기준
2.     이벤트 기준

-- 프로시져 생성
SQL> connect  /as sysdba
SQL> create or replace  procedure  gather_me  is
       begin
         dbms_stats.gather_database_stats;
      end;
/
DB에에 있는 모든 테이블들에 대해서 통계정보를 수집하는 명령어를 수행하는 프로시져
-- 프로그램 생성
SQL> exec dbms_scheduler.create_program(-
   program_name =>'scott_full2', -
   program_action => 'gather_me', -
   program_type => 'STORED_PROCEDURE', -
   enabled => true );
-- JOB 생성
SQL> exec dbms_scheduler.create_job (job_name=>'stat_scott2', -
  program_name =>'scott_full2', -
  start_Date => systimestamp, - 
  repeat_interval=> 'FREQ=DAILY;BYHOUR=1',-
enabled => true );
start_date = systimestamp : 지금부터 시작하겠다는 의미
repeat_interval : 매일 새벽 1시에 수행되도록 해라
마이너스의 의미는 다음라인에 쓰고싶을 때 연결된다


1.     job 활성화
SQL> exec dbms_scheduler.enable('stat_scott2');
2.     job 시작
SQL> exec dbms_scheduler.run_job('stat_scott2');
3.     job의 동작여부 확인
SQL> select log_date, owner, job_name, status
from user_scheduler_job_run_details
where job_name='STAT_SCOTT2'
order by log_date desc;


1. 프로시저를 만든다.
CREATE OR REPLACE PROCEDURE tblused_extend
IS
BEGIN
...
END;
/

2. job을 생성한다.
BEGIN
 dbms_scheduler.create_job
 (
  job_name => 'ex_job',
  job_type => 'STORED_PROCEDURE',

  job_action => ' tblused_extend ',
  start_date => systimestamp,
  repeat_interval => 'FREQ=SECONDLY; INTERVAL=30',
  end_date => systimestamp + interval '30' day
 );
END;
/
'FREQ=SECONDLY; INTERVAL=30' : 30초마다 수행한다는 의미
end_date => systimestamp + interval '30' day : 오늘부터 30일 후에 종료한다

 Schedule 타입
내가 저장한 프로시저일 경우 : STORED_PROCEDURE 으로 설정
PL/SQL Block일 경우 : PLSQL_BLOCK 으로 설정
실행 프로그램일 경우 : EXECUTABLE 으로 설정

 Schedule 수행 간격
FREQ : 기간
HOURLY : x시간 마다
MINUTELY : x분 마다
SECONDLY : x초 마다
WEEKLY : x주 마다
MONTHLY : 매월 마다
YEARLY: 매년 마다
INTERVAL : 간격
위의 x 값을 의미
※ 이외에도 BY옵션과 INCLUDE 옵션이 있습니다.

3. job 활성화
exec dbms_scheduler.enable('ex_job');
exec dbms_scheduler.disable('ex_job');

4. job 시작
exec dbms_scheduler.run_job('ex_job');

5. job 동작여부 조회
select log_date, owner, job_name, status
   from user_scheduler_job_run_details
   where job_name = 'EX_JOB'
   order by log_date desc;


마지막문제테이블 스패이스의 사용량이 90% 이상 되는 테이블 스패이스는 자동으로 테이블 스패이스의 공간이 늘어나도록 자동화 시키시오그리고 TS600 테이블 스패이스를 하나 만들어서 사이즈 100M로 만들고 해당 테이블 스패이스에 data를 90% 이상 입력했을 때 공간추가 명령어 alert log file 에서 수행을 확인하시오


CREATE OR REPLACE PROCEDURE tblused_extend
IS
 imsi VARCHAR2(200);
 CURSOR table_cursor IS
  SELECT u.tablespace_name SPACE,
         sum(nvl(u.bytes,0)) / 1024000 large,
         (sum(nvl(u.bytes,0)) - sum(nvl(f.bytes,0))) / 1024000 used,
         (sum(nvl(f.bytes,0))) / 1024000 unused,
         trunc((sum(nvl(f.bytes,0)) / sum(nvl(u.bytes,0))) * 100,2) unused_percent,
         100 - trunc((sum(nvl(f.bytes,0)) / sum(nvl(u.bytes,0))) * 100,2) used_percent
         FROM DBA_DATA_FILES u
         , DBA_FREE_SPACE f        
         WHERE u.file_id = f.file_id(+)
         GROUP BY
         u.tablespace_name
         ORDER BY u.tablespace_name;
        
 BEGIN

  FOR table_record IN table_cursor LOOP
   SELECT '/u01/app/oracle/oradata/dbdb/'
    ||LOWER(SUBSTR(tablespace_name,1,length(tablespace_name)-NVL(LENGTH(TRANSLATE(tablespace_name, '0123456789'
    ||tablespace_name, '0123456789')),0))) || TO_CHAR(TRANSLATE(SUBSTR(file_name,-20), '0123456789'
    ||file_name, '0123456789')+1) || '.dbf' INTO imsi
   FROM DBA_DATA_FILES
   WHERE file_id in (SELECT MAX(file_id) OVER(PARTITION BY tablespace_name) FROM dba_data_files)
    AND tablespace_name=table_record.space;

   IF table_record.used_percent >= 90 THEN
    execute IMMEDIATE
    'alter tablespace ' || TABLE_RECORD.SPACE || ' add datafile '''|| imsi ||''' size 50m';
   END IF;
  
  END LOOP;
 END;
/

SQL> BEGIN
 dbms_scheduler.create_job
 (
  job_name => 'ex_job',
  job_type => 'STORED_PROCEDURE',

  job_action => ' tblused_extend ',
  start_date => systimestamp,
  repeat_interval => 'FREQ=SECONDLY; INTERVAL=30',
  end_date => systimestamp + interval '30' day
 );
END;
/
SQL> exec dbms_scheduler.enable('ex_job');
SQL> select log_date, owner, job_name, status
   from user_scheduler_job_run_details
   where job_name = 'EX_JOB'
   order by log_date desc;
LOG_DATE                                                                    OWNER         JOB_NAME                                                           STATUS
25-JUL-14 05.38.28.374866 PM +09:00                                         SYS           EX_JOB                                                             SUCCEEDED
25-JUL-14 05.37.58.364721 PM +09:00                                         SYS           EX_JOB                                                             SUCCEEDED
25-JUL-14 05.37.28.364122 PM +09:00                                         SYS           EX_JOB                                                             SUCCEEDED
# alert log
……………………………………………………..
alter tablespace TS600 add datafile '/u01/app/oracle/oradata/dbdb/ts601.dbf' size 50m
Completed: alter tablespace TS600 add datafile '/u01/app/oracle/oradata/dbdb/ts601.dbf' size 50m