[완료]mysql에 적재된 data를 주기적으로 삭제하는데 어떻게 하면 좋을까요
현재 제가 사용하는 부분은 mysql + snort + base를 통한 IDS입니다.
헌데 이거 적재되는양이 시간당 대략 1만건이 넘더군요 ㅡㅡ;
이를 주기적으로 삭제하려 보았더니 적용테이블은 다음과 같습니다.
(사용 snort 버전은 2.9.2 입니다)
+-------------------+
| Tables_in_snortdb |
+-------------------+
| acid_ag |
| acid_ag_alert |
| acid_event |
| acid_ip_cache |
| base_roles |
| base_users |
| data |
| detail |
| encoding |
| event |
| icmphdr |
| iphdr |
| opt |
| reference |
| reference_system |
| schema |
| sensor |
| sig_class |
| sig_reference |
| signature |
| tcphdr |
| udphdr |
+-------------------+
그리고 날자 기준으로 30일이 지난 데이터는 지우고자 보았더니 시간이 필드지정된 table은 acid_event, event둘뿐이더군요
여기에 각 테이블들은 cid라는 일종의 순서번호로 서로 묶여있습니다.
하지만 event에서 일부 지워도 data table과 같이 실질적으로 데이터 용량을 가장 많이 차지하는곳에 적재된 데이터는 그대로
남아있더군요....
우선은 쿼리문을 crontab에 등록하여 주기적으로 지워주려하는데... 어떻게 하는게 좋을까요?
(즉 event table에서 마지막으로 지워진 data의 cid를 기준으로 data table의 data를 지워줘야 할텐데 그 방법을 모르겠습니다.)
감사합니다.
저같으면 프로시져를 사용할 것
저같으면 프로시져를 사용할 것 같습니다.
대략
cid는 auto increment로 생성되는 경우가 많으니.. 가장 큰 cid 이전 것을 지우면 되겠죠?
한달 전 것을 @maxCid라는 변수 안에 저장합니다.
select @maxCid := max(cid) from event where date <= date_sub(curdate(), INTERVAL 1 MONTH);
그리고 나서는 테이블마다 돌아다니면서
delete from data where cid < @maxCid
이런식으로 지워주면 어떨까 싶어요.
혹시 쉘스크립트에 적용해서 활용하는 방법은 없을까요?
말씀하신 방법으로 하면 되긴 합니다만 mysql에 접속한 상태에서만 가능하더군요
제가 시도한 쿼리문은 다음과 같습니다.
mysql -u사용자명 -p패스워드 DB명 -e "select @maxCid := max(cid) from 테이블명 where 칼럼명 <= date_sub(curdate(), INTERVAL 1 MONTH);"
mysql -u사용자명 -p패스워드 DB명 -e "delete from data where cid < @maxCid"
mysql -usnort -psnort123 snortdb -e "select @maxCid := max(cid) from event where timestamp <= date_sub(curdate(), INTERVAL 1 MONTH);"
mysql -usnort -psnort123 snortdb -e "delete from data where cid < @maxCid"
실행시 오류는 나타나지 않지만 select를 통해 조회해 봤더니 데이터가 지워지지않고 그대로 남아있더군요. 즉
제대로 실행이 되지 않았단건데...
스크립트문을 작성후 cron에 등록하여 주기적으로 하고픈데 적합한 방법은 없을까요?
감사합니다
MySQL에도 job scheduler가 있는걸로
MySQL에도 job scheduler가 있는걸로 알고있습니다.
프로시져를 만든뒤에 job scheduler에서 주기적으로 실행해주게 만들어놓으면 되지 않을까요?
제가 아는 DBMS(Oracle, SQL Server, Tibero 등)에서 지원하는 기능입니다.
제가 답글 단 대로 sql 파일을 전체로 한개 만드신
변수는 다시 접속하면 사라지기 때문에 생긴 문제일 거에요.
제가 답글 단 대로 sql 파일을 전체로 한개 만드신 다음에
mysql -u사용자명 -p패스워드 DB명 < sqlfile.sql
하시면 아마 한번에 처리가 될 겁니다.
감사합니다 덕분에 성공하였습니다. ^^
말씀하신대로 sql 파일을 생성하여 실행하였더니 정상적인 삭제가 이뤄지는것을 확인하였습니다.
한번에 테이블명별로 라인을 추가하여 실행하면 될 듯 싶습니다. 감사합니다. ^^
댓글 달기