리눅스 DB 자동 삭제 스크립트 만들기

리눅스 쉘 스크립트로 DBMS에 접근해서 특정 테이블을 삭제하는 방법을 알아보겠습니다. 주기적으로 DB 삭제가 필요한 경우 스케줄러에 등록해 놓고 삭제 작업을 자동화할 수도 있습니다. 

리눅스 DB 삭제 스크립트 만들기

예시로 테스트를 진행하기 위해 LOGDB라는 DB에 test_log라는 테이블을 생성하고 날짜 정보를 포함하는 샘플 데이터를 insert하겠습니다. DBMS는 MYSQL 기준입니다.

# test_log 테이블 생성
CREATE TABLE test_log (
  id INT AUTO_INCREMENT PRIMARY KEY,
  date DATE NOT NULL,
  content VARCHAR(255) NOT NULL
);

# test_log 테이블에 샘플 데이터 생성
INSERT INTO test_log (date, content) VALUES
('2023-04-01', 'Sample content 1'),
('2023-03-01', 'Sample content 2'),
('2023-02-28', 'Sample content 3'),
('2023-02-15', 'Sample content 4'),
('2023-01-21', 'Sample content 5'),
('2022-12-31', 'Sample content 6'),
('2022-11-30', 'Sample content 7'),
('2022-11-29', 'Sample content 8'),
('2022-11-28', 'Sample content 9'),
('2022-11-27', 'Sample content 10'),
('2023-04-05', 'Sample content 11'),
('2023-04-06', 'Sample content 12'),
('2023-04-07', 'Sample content 13'),
('2023-04-08', 'Sample content 14'),
('2023-04-09', 'Sample content 15'),
('2023-04-10', 'Sample content 16'),
('2023-04-11', 'Sample content 17'),
('2023-04-12', 'Sample content 18'),
('2023-04-13', 'Sample content 19'),
('2023-04-14', 'Sample content 20'),
('2023-04-15', 'Sample content 21'),
('2023-04-16', 'Sample content 22'),
('2023-04-17', 'Sample content 23'),
('2023-04-18', 'Sample content 24'),
('2023-04-19', 'Sample content 25'),
('2023-04-20', 'Sample content 26'),
('2023-04-21', 'Sample content 27'),
('2023-04-22', 'Sample content 28'),
('2023-04-23', 'Sample content 29'),
('2023-04-24', 'Sample content 30');

 

select로 조회 시 아래와 같이 데이터가 정상적으로 들어온 게 보입니다.

 

생성된 db
날짜가 포함된 데이터가 insert된 모습.

 

1. DB 정보를 입력할 config 파일 생성

리눅스 쉘에서 mysql에 접근하려면 DB 정보가 필요합니다. 하나의 스크립트에 DB 정보와 삭제 스크립트까지 모두 작성해도 되지만, 사용성을 고려해서 별도의 설정 파일을 만드는 식으로 하겠습니다.

 

delete_mysql_log_config.cfg라는 이름으로 파일을 만들고 아래와 같이 DB 정보를 매핑합니다. 이렇게 만들면 사용자 계정 정보, 테이블, 기간 조건 등을 직관적으로 설정할 수 있습니다. 

# delete_mysql_log_config.cfg

MYSQL_USER=root
MYSQL_PASSWORD=root
MYSQL_DATABASE=LOGDB
MYSQL_TABLE=log
MONTHS_AGO=2 # N개월 이상된 데이터를 지우기 위해 설정

 

2. 삭제 스크립트 생성

아래와 같이 delete_mysql_log.sh라는 이름으로 DB 삭제 스크립트를 생성합니다. 스크립트 내용은 N달 전에 생성된 데이터를 DELETE 하는 쿼리를 실행하는 것입니다.

#!/bin/bash

# Config 파일 불러오기
source delete_mysql_log_config.cfg

# 현재 날짜에서 n달 전 날짜 계산
N_MONTHS_AGO=$(date -d "${MONTHS_AGO} months ago" '+%Y-%m-%d')

# n달 이전의 로그를 삭제하는 쿼리
SQL_QUERY="DELETE FROM ${MYSQL_TABLE} WHERE date < '${N_MONTHS_AGO}';"

# MySQL에 접속하여 로그를 삭제하는 명령어 실행
mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} -e "${SQL_QUERY}" ${MYSQL_DATABASE}

echo "${MONTHS_AGO}달 이전의 로그 삭제 완료"

 

생성 후에는 chmod로 실행 권한을 부여합니다.

chmod 755 delete_mysql_log.sh

 

3. 삭제 스크립트 실행

[root@localhost log_delete]# ls -l
total 8
-rw-r--r--. 1 root root 132 Apr 21 01:40 delete_mysql_log_config.cfg
-rwxr-xr-x. 1 root root 497 Apr 21 01:41 delete_mysql_log.sh

 

[root@localhost log_delete]# ./delete_mysql_log.sh
mysql: [Warning] Using a password on the command line interface can be insecure.
2달 이전의 로그 삭제 완료

리눅스 커맨드에서 mysql 패스워드를 이용해서 작업을 수행하기 때문에 보안상의 위험을 경고하는 메시지가 출력되긴 하지만, select 조회 시 정상적으로 2달 전 로그가 삭제된 것을 볼 수 있습니다.

 

일부 데이터가 삭제된 모습
데이터 조회 시 일부 데이터가 delete된 것을 확인할 수 있다.

 

테스트 후 쓸만하다고 판단이되면 crontab에 등록해서 주기적으로 자동 실행되도록 세팅할 수 있습니다. crontab에 대해 궁금하시면 아래 글을 확인해주세요.

 

https://change-words.tistory.com/entry/crontab

 

리눅스 crontab 사용 방법 (작업 스케줄러)

PC는 정해진 시간에 반복적으로 작업을 수행하는 경우가 많습니다. 윈도우에서는 작업 스케줄러가 그 기능을 제공한다면, 리눅스(Linux)에선 crontab이 해당 기능을 수행합니다. Crontab crontab은 그리

change-words.tistory.com

 

반응형

댓글

Designed by JB FACTORY