안녕하세요.


MySQL 5.1 버전이상의 정기적인 예약 작업 수행을 할수있는 이벤트 스케줄러에 대해 포스팅해보겠습니다.


이벤트 스케줄러는 말그대로 특정 이벤트를 자동으로 정기적으로 수행시킬수 있습니다.


예를들어 '특정 UPDATE문을 2018년 11월 2일 15시 36분 03초에 시켜줘' 라고 등록을 해놓으면 DB가 자동으로 일을 수행하게됩니다.


이벤트 스케줄러 생성 하기 


먼저 기본 문법에 대해 보겠습니다.


1
2
3
4
5
6
7
8
9
CREATE EVENT IF NOT EXISTS [이벤트 이름]
    ON SCHEDULE
        [수행, 반복 할 시간]
    ON COMPLETION NOT PRESERVE
    ENABLE
    COMMENT [코멘트]
    DO 
    [수행할 명령]
END
cs


[이벤트 이름]  : 해당 이벤트 스케줄의 이름을 정해주어야 합니다.

[수행, 반복 할 시간] : 해당 명령을 수행하거나 반복할 시간 및 기간을 정해주면 됩니다.

[코멘트] : 해당 이벤트의 내용을 입력해주시면 됩니다.

[수행할 명령] : 해당 이벤트의 시간의 수행할 명령을 입력하면 됩니다.





[수행, 반복 할 시간] 설정하기

 


1
2
3
4
5
6
7
8
9
CREATE EVENT IF NOT EXISTS [이벤트 이름]
    ON SCHEDULE
       AT '2018-11-02 13:40:13' -- 특정 시간에 1회 실행
    ON COMPLETION NOT PRESERVE
    ENABLE
    COMMENT [코멘트]
    DO 
    [수행할 명령]
END
cs

특정 시간에 1회 명령을 실행 하려면 'AT [시간]'을 사용해줍니다.

1
2
3
4
5
6
7
8
9
10
CREATE EVENT IF NOT EXISTS [이벤트 이름]
    ON SCHEDULE
       EVERY 1 DAY -- 하루 한번 반복
    ON COMPLETION NOT PRESERVE
    ENABLE
    COMMENT [코멘트]
    DO 
    [수행할 명령]
END
 

cs


특정 날짜 기간에 명령을 반복 실행 하려면 'EVERY [기간, 시간]'을 사용해줍니다.

(기간, 시간은 YEAR, QUATER, MONTH, DAY, HOUR, MINUTE, WEEK, SECOND 등 사용 할 수 있습니다.)


1
2
3
4
5
6
7
8
9
10
11
CREATE EVENT IF NOT EXISTS [이벤트 이름]
    ON SCHEDULE
           EVERY 1 DAY STARTS '2018-11-02 13:32:55' ENDS '2018-11-03 13:32:55'
           -- 하루 한번 11월 2일 13:32:55 부터 11월 3일 13:32:55까지만 실행
    ON COMPLETION NOT PRESERVE
    ENABLE
    COMMENT [코멘트]
    DO 
    [수행할 명령]
END
 
cs


특정 날짜 기간에 시작일 종료일을 지정 할 수 있습니다.

(하루 한번 반복하는것을 [언제 시작할것인가, 언제 끝낼것인가])

언제 시작하는지 알리는 STARTS구문만 사용하여도 문제가 없습니다.





ON COMPLETION NOT PRESERVE ENABLE



해당 설정은 이벤트를 수행후 삭제 여부를 설정합니다.


만약, 이벤트를 수행후 이벤트를 삭제하지 않는다면 'NOT'을 제거 해주시면 됩니다.

(ON COMPLETION PRESERVE ENABLE)




샘플 (SAMPLE) 



1
2
3
4
5
6
7
8
9
CREATE EVENT IF NOT EXISTS '테스트'
    ON SCHEDULE
           EVERY 1 DAY
    ON COMPLETION NOT PRESERVE
    ENABLE
    COMMENT '테스트 입니다.'
    DO 
    INSERT INTO TEST_TABLE ('TEST1''TEST2'VALUES ('테스트', NOW())
END
cs

샘플 구문을 해석 해보겠습니다.

'테스트' 라는 이벤트를 생성하며 내용은 '테스트 입니다.' 입니다.

실행완료시 해당 이벤트를 삭제를 진행하며, 매일 1회 INSERT 문으로 TEST데이터를 집어넣습니다.

(실행 되는 시간은 이벤트 생성 즉시 생성되는 시간 입니다.)


반응형


안녕하세요. 오늘은 MySQL 이벤트 스케줄러 기능활성화에 대해 알아보겠습니다.

이벤트 스케줄러에대해 간단하게 설명을 드린다면, MySQL에서 정기적으로 일을 수행시켜야할때가 있습니다.

그때 반복적 혹은 1회성으로 DBMS를 제어를 도와주는것이 이벤트 스케줄러(Event Scheduler) 입니다.


해당 기능은 MySQL 5.16부터 추가되었습니다.


이벤트 스케줄러를 사용하기전, MySQL에서 활성화 작업을 진행해야합니다.

그작업을 포스팅하였습니다.


MySQL버전 : 5.6.41

Linux : CentOS


이벤트 스케줄러 활성화 하기 



MySQL에 로그인 합니다.




MySQL에 접속한뒤 이벤트 스케줄러가활성화 되어있는지 확인해보는 명령어를 입력합니다.



show variables like 'event%';



만약 결과가 OFF라면 비활성화 되어있는상태이며 이벤트 스케줄러가 있어도 동작을 하지 않습니다.




해당 이벤트스케줄 활성 옵션을 ON으로 변경해줍니다.



 SET GLOBAL event_scheduler = ON;



다시 활성화 여부를 SELECT해보면 ON으로 바뀐것을 확인할수있습니다.


이제 MySQL의 이벤트 스케줄러를 생성후 사용하시면 동작이 가능합니다.



이벤트 스케줄러 초기화 문제 


MySQL을 재시작시에 이벤트 스케줄러 활성화 옵션이 다시 OFF로 전환되는것을 확인할수 있습니다.

이는 MySQL설정에서 변경하여 재시작시에도 계속해서 ON으로 활성화되게 설정해보는 작업을 해보겠습니다.





먼저 MySQL 부팅시 설정파일인 my.cnf 경로를 찾아 줍니다.


 주의!! CentOS기준으로 작업을 진행중 입니다.


mysqld --verbose --help | grep -A 1 'Default options'



Linux에서 해당 명령어를 입력하시면 MySQL의 my.cnf 위치를 알수있습니다.

(사진의 빨간색 네모를 확인해주세요.)



위치된 경로의 설정파일을 vi에디터로 실행시켜줍니다.



[mysqld] 안에 event_scheduler = ON을 입력해주시고 저장을 해주세요.

(저는 하단에 설정하였습니다. 사진 하단 빨간색 네모를 확인해주세요.)



그후 MySQL을 재시작합니다.

service mysqld restart

(centOS기준 재시작 명령어 입니다.)



다시 MySQL접속후에도 Value값이 ON이 되어있는것을 확인 할 수 있습니다.


이제 정상적으로 이벤트 스케줄러를 사용할수 있게 되었습니다.



반응형



MySQL에서 간혹가다 세로(종)로 쌓여있는 데이터를 가로(횡)으로 전환하여 검색결과를 출력해야 할때가 있습니다.

(특히 게시판 경우 빈번합니다.)


하지만 세로를 가로로 돌리기란 여간 복잡합니다.

특히나, 숫자형식으로된 세로로 쌓인 데이터는 비교적 가로로 데이터를 출력하기 쉬우나 문자로된 데이터는 여간 힘듭니다.


오늘은 문자 데이터를 세로를 가로로 돌리는 쿼리문을 포스팅해보겠습니다.


 1. 샘플 데이터


1
SELECT * FROM 동물_TABLE;
cs


 동물키

 종류

이름 

 그룹1

 곤충

 메뚜기

 그룹1

 포유류

코끼리

 그룹1

 양서류

개구리

 그룹2

 곤충

 사마귀

 그룹2

 포유류

 기린

 그룹2

 양서류

 도룡농


기본으로 그룹을 묶을수있는 키가 필요 합니다.

먼저 샘플데이터는, 같은 종류끼리 가로(횡)으로 정렬을 목적으로 하겠습니다.



 2. 결과 : 가로횡 SELECT 쿼리


1
2
3
4
5
6
7
8
9
SELECT
    동물키
    , MAX(CASE WHEN 종류 = '곤충' THEN 이름 END) AS 곤충
    , MAX(CASE WHEN 종류 = '포유류' THEN 이름 END) AS 포유류
    , MAX(CASE WHEN 종류 = '양서류' THEN 이름 END) AS 양서류
FROM (    
        SELECT * FROM 동물_TABLE
     ) T
GROUP BY 동물키;
cs


 동물키

 곤충

포유류

양서류

 그룹1

 메뚜기

코끼리

개구리 

 그룹2

사마귀

기린

도룡농


위와 같은 결과를 얻을수 있습니다.

CASE 문과 MAX값으로 각 그룹의 최대값을 가져와 보여주는 방식입니다.

이렇게 쉬운방식으로 세로(종) 데이터를 가로(횡) 으로 출력 할 수 있습니다.



반응형


MySQL 테이블 존재 여부 확인 과정을 거치고 그 존재 여부에 따른 상황 판단 작업이 필요하여 코드를 작성하게되었습니다. (한마디로 IF/ELSE문 입니다.)


개발 환경은 JAVA/SPRING, MySQL, Mybatis 입니다.


1. 테이블 존재 여부를 확인하여야 한다.


2. 테이블 존재 여부를 확인한 후,

->존재한다면 SELECT문을 한번더 실행

->존재하지 않는다면 0을 리턴


하는 코드값이 필요하였습니다.


#테이블 존재여부 쿼리

1
2
3
4
5
SELECT COUNT(*) #카운트 결과값이 0 이면 존재X, 1 이상 존재O
FROM information_schema.TABLES
WHERE
    TABLE_SCHEMA = 'DB 이름'
    AND TABLE_NAME = '테이블 이름'
cs



존재여부를 파악한 뒤, 처음 시도는 프로시저형식으로 시도를하였으나 제가사용하고있는 MySQL은 MyBatis에서 변수 선언식으로 동작을 하지않아 다른방법을 택하였습니다.


두가지 방법다 필요하신분이 있을수도 있어 같이 포스팅 합니다.


#변수 선언 - 1안

1
2
3
4
5
6
7
8
9
SET
@test := CASE (SELECT COUNT(*
                            FROM information_schema.TABLES
                            WHERE TABLE_SCHEMA = 'DB 이름' AND TABLE_NAME = '테이블 이름'
                             )
                       WHEN 0 THEN 0 #존재하지 않는다면 0
                       ELSE (SELECT 1+1 FROM DUAL)  #ELSE 존재한다면 후 처리 쿼리
END;
SELECT @test
cs


#MyBatis 사용 IF문 쿼리 - 2안

1
2
3
4
5
6
7
8
9
SELECT IF(
            (SELECT COUNT(*
                FROM information_schema.TABLES
                WHERE
                     TABLE_SCHEMA = 'DB 이름'
                    AND TABLE_NAME = '테이블 이름'> 0 # 결과값이 0보다 크다면 테이블이 존재
                    , (SELECT 1+1 FROM DUAL) # 존재한다면 후 처리 쿼리
                    , 0 #ELSE 존재하지 않는다면 후 처리 쿼리
            ) AS CNT
cs


참고로 제가 사용하고있는 Mybatis는 3.3.0 버전 입니다.



* 참고링크

https://stackoverflow.com/questions/18738909/mysql-select-if-table-exists


반응형

+ Recent posts