2016년 11월 16일 수요일

[mysql] 이벤트 사용하기

주기적으로 데이터베이스의 공통된 작업을 해야할경우 클라이언트단 에서 주기적 요청을 통한 데이터 변경은 바람직하지 않다 데이터 베이스 스스로 처리하게 셋팅 해야한다.

예) 하루에 한번 특정 이벤트의 날짜를 수정 하여 재등록 할경우

/*(CURRENT_TIMESTAMP 는 현재시간 년월일시 리터럴)*/
DELIMITER $ /*SQL 종료문을 $로 대체하겟다는 선언*/
CREATE EVENT EVENTTEST /*이벤트이름 유니크여야함,64글자 제한,대소문자 구분 X*/
ON SCHEDULE
/*특정시간에 한번 실행 경우*/
/*
AT '2016-11-17 11:35:00' 처럼 특정시간 지정 가능(미래의 시간만 지정 가능)
또는
AT CURRENT_TIMESTAMP +  INTERVAL 5 MINUTE +  INTERVAL 30 SECOND 식으로
현재시간 에서 5분 30초 이후에 실행하게뜸 지정 가능
MINUTE 니 SECOND 말고도
YEAR|QUARTER|MONTH|DAY|HOUR|MINUTE|WEEK|SECOND|YEAR_MONTH|DAY|HOUR|MINUTE|WEEK| SECOND | YEAR_MONTH|DAY_HOUR|DAY_MINUTE| DAY_SECOND| HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND
등등 키워드를 넣어 설정할수 있고 + 를 통해 연결 가능 하다. 각각의 키워드에대해선 알아서 찾아보길.
*/

/*일적주기마다 반복 경우*/
EVERY 2 MINUTE /*2분 마다 실행, 다른 키워드 사용가능*/
STARTS '2016-11-17 11:35:00' + INTERVAL 0 MINUTE /*시작 시간을 설정하고  + 를 사용해서 인터벌을 줄수도 있다.*/
ENDS '2016-11-17 12:14:00' /*종료시간 셋팅 미입력시 무한반복*/
ON COMPLETION PRESERVE /*이벤트가 종료된후 이벤트를 남겨둘지에 대한 여부 없을경우 기본 삭제됨.*/

DO
/*실행구문*/
BEGIN
 
  /*변수 할당 SELECT 되는 컬럼 타입과 동일하게 선언*/
  DECLARE P_EVT_SEQ bigint(20);
  DECLARE P_EVT_TYPE varchar(2);
  DECLARE P_EVT_TITLE varchar(300);
  DECLARE P_EVT_CONTENT_PC text;
  DECLARE P_EVT_CONTENT_MO text;
  DECLARE P_EVT_IMG_PATH_PC varchar(200);
  DECLARE P_EVT_IMG_PATH_MO varchar(200);
  DECLARE P_EVT_START_DT varchar(8);
  DECLARE P_EVT_END_DT varchar(8);
  DECLARE P_EVT_AGENT varchar(50);
  DECLARE P_EVT_URL varchar(200);

  /*트랜잭션 시작*/
  START TRANSACTION;
 
  /*주의  :  SELECT 해온 결과를 INTO 로 변수에 할당할때 SELECT COLUMN 값이 NULL 일경우 에러발생*/
  SELECT
    EVT_SEQ
    ,EVT_TYPE
    ,EVT_TITLE
    ,EVT_CONTENT_PC
    ,EVT_CONTENT_MO
    ,EVT_IMG_PATH_PC
    ,EVT_IMG_PATH_MO
    ,DATE_FORMAT(DATE_ADD(DATE_FORMAT(EVT_START_DT,'%Y%m%d'),INTERVAL 1 DAY),'%Y%m%d') EVT_START_DT /*날짜 선택해서 하루 더하는 부분*/
    ,DATE_FORMAT(DATE_ADD(DATE_FORMAT(EVT_END_DT,'%Y%m%d'),INTERVAL 1 DAY),'%Y%m%d') EVT_END_DT /*날짜 선택해서 하루 더하는 부분*/
    ,EVT_AGENT
    ,EVT_URL
    INTO /*변수에 할당*/
    P_EVT_SEQ
    ,P_EVT_TYPE
    ,P_EVT_TITLE
    ,P_EVT_CONTENT_PC
    ,P_EVT_CONTENT_MO
    ,P_EVT_IMG_PATH_PC
    ,P_EVT_IMG_PATH_MO
    ,P_EVT_START_DT
    ,P_EVT_END_DT
    ,P_EVT_AGENT
    ,P_EVT_URL
       
  FROM ONL_EVENT
  WHERE EVT_SEQ = (SELECT EVT_SEQ FROM ONL_EVENT WHERE EVT_TYPE = 'A'           ORDER BY EVT_CREATE_DT DESC LIMIT 1);
 
  /*기존 데이터 변경*/
  UPDATE ONL_EVENT
  SET EVT_STATUS = 3
  WHERE EVT_SEQ = P_EVT_SEQ;
 
  /*새로운 데이터 추가*/
  INSERT INTO ONL_EVENT(
     EVT_TYPE
    ,EVT_TITLE
    ,EVT_CONTENT_PC
    ,EVT_CONTENT_MO
    ,EVT_IMG_PATH_PC
    ,EVT_IMG_PATH_MO
    ,EVT_START_DT
    ,EVT_END_DT
    ,EVT_STATUS
    ,EVT_AGENT
    ,EVT_URL
    ,EVT_CREATE_DT
  )VALUES(
     P_EVT_TYPE
    ,P_EVT_TITLE
    ,P_EVT_CONTENT_PC
    ,P_EVT_CONTENT_MO
    ,P_EVT_IMG_PATH_PC
    ,P_EVT_IMG_PATH_MO
    ,P_EVT_START_DT
    ,P_EVT_END_DT
    ,'2'
    ,P_EVT_AGENT
    ,P_EVT_URL
    ,NOW()
  );
 
COMMIT; /*트랜잭션 종료*/
END /*실행 구문 끝*/
$ DELIMITER ; /*SQL 종료 구분자 변경*/

/*밑에껀 보너스*/

/*이벤트 목록 보기*/
SHOW EVENTS;

/*이벤트 삭제*/
DROP EVENT EVENTTEST;

/*등록된 특정 이벤트 내용보기*/
SHOW CREATE EVENT EVENTTEST;

/*이벤트를 사용하기 위한 MYSQL 셋팅 (서버가 동작중일때)*/
/*-EVENT 사용하기 */

SET GLOBAL event_scheduler = ON;
SET @@global.event_scheduler = ON;
SET GLOBAL event_scheduler = 1;
SET @@global.event_scheduler = 1;


/*-EVENT 사용하지 않기-=*/
SET GLOBAL event_scheduler = OFF;
SET @@global.event_scheduler = OFF;
SET GLOBAL event_scheduler = 0;
SET @@global.event_scheduler = 0;


댓글 없음:

댓글 쓰기

[lunux]리눅스 폴더별 용량 확인

리눅스 폴더별 용량 확인 조회 하고자 하는 디렉토리 리스트가있는 경로로 이동후 du -h --max-depth=1