리눅스 DB 자동 삭제 스크립트 만들기
- Database
- 2023. 4. 22.
리눅스 쉘 스크립트로 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로 조회 시 아래와 같이 데이터가 정상적으로 들어온 게 보입니다.
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달 전 로그가 삭제된 것을 볼 수 있습니다.
테스트 후 쓸만하다고 판단이되면 crontab에 등록해서 주기적으로 자동 실행되도록 세팅할 수 있습니다. crontab에 대해 궁금하시면 아래 글을 확인해주세요.
https://change-words.tistory.com/entry/crontab
'Database' 카테고리의 다른 글
SQL, limit 사용법 (select 열 제한) (0) | 2023.04.26 |
---|---|
SQL, DISTINCT 사용법 (중복 값 제거) (0) | 2023.04.25 |
MYSQL, Client does not support authentication protocol requested by server 에러 해결 (0) | 2023.04.17 |
MYSQL, GRANT 사용법 (권한 부여) (0) | 2023.04.16 |
SQL, INSERT INTO 사용법 (데이터 삽입) (0) | 2023.04.16 |