기본 콘텐츠로 건너뛰기

Linux MySQL 자동 백업 구축: Crontab과 Shell Script 완벽 가이드

SERVER AUTOMATION

Linux MySQL 자동 백업 구축: Crontab과 Shell Script 완벽 가이드

운영 서버의 안정성을 담보하는 데이터 백업 전략은 필수입니다. mysqldump와 Crontab을 활용해 DB 및 웹 데이터를 주기적으로 백업하고, 오래된 파일을 자동 정리하는 자동화 스크립트 작성법을 소개합니다.

1. 자동 백업 쉘 스크립트 작성 (DB + 파일)

가장 먼저 수행할 작업은 MySQL 덤프와 웹 디렉터리 압축, 그리고 보관 주기가 지난 파일의 자동 삭제를 처리하는 쉘 스크립트(backup.sh)를 작성하는 것입니다. 전체적인 백업 로직의 흐름은 아래와 같습니다.

아래 스크립트는 날짜 기반으로 파일을 생성하고, 7일이 지난 백업본을 자동으로 정리하여 디스크 공간을 효율적으로 관리합니다.

#!/bin/bash

# 1. 날짜 포맷 설정 (YYYYMMDD)
DATE=$(date +%Y%m%d)

# 2. 백업 경로 설정 (환경에 맞게 수정)
DB_BACKUP_DIR=/backup/db
WEB_BACKUP_DIR=/backup/web
WEB_DIR=/www_dir

##### MySQL 데이터베이스 백업 #####
# 개별 DB 백업 (권장)
# --opt 옵션은 덤프 속도를 높여줍니다.
mysqldump -uroot -pPASSWORD db_name > "$DB_BACKUP_DIR/db_name_${DATE}.sql"

# 전체 DB 백업 (필요 시 주석 해제)
# mysqldump -uroot -pPASSWORD -A > "$DB_BACKUP_DIR/all_${DATE}.sql"

##### 웹 파일 백업 (디렉터리 압축) #####
tar czfp "$WEB_BACKUP_DIR/web_${DATE}.tar.gz" "$WEB_DIR/web"

##### 오래된 백업 삭제 (7일 전 파일 정리) #####
WEEKAGO=$(date -d "7 days ago" +%Y%m%d)

# 해당 날짜 패턴을 가진 파일 삭제
rm -f "$DB_BACKUP_DIR"/*"${WEEKAGO}.sql"
rm -f "$WEB_BACKUP_DIR"/*"${WEEKAGO}.tar.gz"

##### 보안 권한 설정 #####
# 백업 파일은 소유자만 읽을 수 있도록 제한
chmod -R 600 "$WEB_BACKUP_DIR"
chmod -R 600 "$DB_BACKUP_DIR"

이 스크립트의 핵심은 WEEKAGO 변수를 이용한 자동 삭제 로직입니다. 백업만 계속 쌓이다 보면 디스크 풀(Disk Full) 장애가 발생할 수 있으므로, 반드시 보관 주기를 설정하여 삭제하는 로직이 포함되어야 합니다.

2. Crontab을 이용한 스케줄링 등록

작성한 스크립트가 매일 지정된 시간에 자동으로 실행되도록 리눅스의 스케줄러인 Crontab에 등록합니다.

먼저 스크립트에 실행 권한을 부여합니다.

chmod +x /path/to/backup.sh

그다음 시스템 크론 설정 파일(/etc/crontab)을 편집하거나, 사용자 크론(crontab -e)을 사용하여 스케줄을 등록합니다. 아래는 매일 새벽 5시에 백업을 수행하는 설정 예시입니다.

# vi /etc/crontab

# [분] [시] [일] [월] [요일] [사용자] [명령어]
   0    5    * * * root     /path/to/backup.sh

설정을 마친 후에는 크론 데몬을 재시작하여 변경 사항을 즉시 적용하는 것이 좋습니다.

# CentOS/RHEL 계열
systemctl restart crond

# Ubuntu/Debian 계열
systemctl restart cron

등록 전, 반드시 ./backup.sh 명령어로 수동 실행하여 에러 없이 파일이 생성되는지 검증하는 절차를 거쳐야 합니다.

3. 엔터프라이즈 운영을 위한 보안 및 최적화

실제 서비스 환경(Production)에서는 단순 백업 실행을 넘어 보안과 모니터링을 고려해야 합니다.

  • 비밀번호 노출 방지: mysqldump 명령줄에 비밀번호를 직접 입력하면 ps -ef 명령어로 프로세스 목록 확인 시 비밀번호가 노출될 수 있습니다. 대신 ~/.my.cnf 파일을 활용하여 인증 정보를 관리하는 것을 권장합니다.
    # ~/.my.cnf 예시
    [mysqldump]
    user=backup_user
    password=secret_password
  • 로그(Log) 기록: 백업이 실패했는지 성공했는지 이력을 남기기 위해 Crontab 설정을 다음과 같이 변경하여 로그를 적재해야 합니다.
    0 5 * * * root /path/to/backup.sh >> /var/log/backup.log 2>&1

💡 Tip: 2>&1은 표준 에러(stderr)를 표준 출력(stdout)으로 리다이렉션하여 로그 파일 하나에 모든 실행 결과와 에러 메시지를 함께 담겠다는 의미입니다. 이를 통해 백업 실패 원인을 파악하는 결정적인 단서를 확보할 수 있습니다.

댓글

이 블로그의 인기 게시물

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 (Request Parameter 전체보기)

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 Java Servlet Request Parameter 완전 정복 웹 애플리케이션에서 클라이언트로부터 전달되는 Request Parameter 를 확인하는 것은 필수입니다. 이 글에서는 Java Servlet 과 JSP 에서 GET/POST 요청 파라미터를 전체 출력하고 디버깅하는 방법을 다양한 예제와 함께 소개합니다. 1. 기본 예제: getParameterNames() 사용 Enumeration<String> params = request.getParameterNames(); System.out.println("----------------------------"); while (params.hasMoreElements()){ String name = params.nextElement(); System.out.println(name + " : " + request.getParameter(name)); } System.out.println("----------------------------"); 위 코드는 요청에 포함된 모든 파라미터 이름과 값을 출력하는 기본 방법입니다. 2. HTML Form과 연동 예제 <form action="CheckParamsServlet" method="post"> 이름: <input type="text" name="username"><br> 이메일: <input type="email" name="email"><b...

PostgreSQL 달력(일별,월별)

SQL 팁: GENERATE_SERIES로 일별, 월별 날짜 목록 만들기 SQL 팁: GENERATE_SERIES 로 일별, 월별 날짜 목록 만들기 데이터베이스에서 통계 리포트를 작성하거나 비어있는 날짜 데이터를 채워야 할 때, 특정 기간의 날짜 목록이 필요할 수 있습니다. PostgreSQL과 같은 데이터베이스에서는 GENERATE_SERIES 함수를 사용하여 이 작업을 매우 간단하게 처리할 수 있습니다. 1. 🗓️ 일별 날짜 목록 생성하기 2020년 1월 1일부터 12월 31일까지의 모든 날짜를 '1 day' 간격으로 생성하는 쿼리입니다. WITH date_series AS ( SELECT DATE(GENERATE_SERIES( TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2020-12-31', 'YYYY-MM-DD'), '1 day' )) AS DATE ) SELECT DATE FROM date_series 이 쿼리는 WITH 절(CTE)을 사용하여 date_series 라는 임시 테이블을 만들고, GENERATE_SERIES 함수로 날짜를 채웁니다. 결과 (일별 출력) 2. 📅 월별 날짜 목록 생성하기 동일한 원리로, 간격을 '1 MONTH' 로 변경하면 월별 목록을 생성할 수 있습니다. TO...

CSS로 레이어 팝업 화면 가운데 정렬하는 방법 (top·left·transform 완전 정리)

레이어 팝업 센터 정렬, 이 코드만 알면 끝 (CSS 예제 포함) 이벤트 배너나 공지사항을 띄울 때 레이어 팝업(center 정렬) 을 깔끔하게 잡는 게 생각보다 어렵습니다. 화면 크기가 변해도 가운데에 고정되고, 모바일에서도 자연스럽게 보이게 하려면 position , top , left , transform 을 정확하게 이해해야 합니다. 이 글에서는 아래 내용을 예제로 정리합니다. 레이어 팝업(center 정렬)의 기본 개념 자주 사용하는 position: absolute / fixed 정렬 방식 질문에서 주신 스타일 top: 3.25%; left: 50%; transform: translateX(-50%) 의 의미 실무에서 바로 쓰는 반응형 레이어 팝업 HTML/CSS 예제 1. 레이어 팝업(center 정렬)이란? 레이어 팝업(레이어 팝업창) 은 새 창을 띄우는 것이 아니라, 현재 페이지 위에 div 레이어를 띄워서 공지사항, 광고, 이벤트 등을 보여주는 방식을 말합니다. 검색엔진(SEO) 입장에서도 같은 페이지 안에 HTML이 존재 하기 때문에 팝업 안의 텍스트도 정상적으로 인덱싱될 수 있습니다. 즉, “레이어 팝업 센터 정렬”, “레이어 팝업 만드는 방법”과 같이 관련 키워드를 적절히 넣어주면 검색 노출에 도움이 됩니다. 2. 질문에서 주신 레이어 팝업 스타일 분석 질문에서 주신 스타일은 다음과 같습니다. <div class="layer-popup" style="width:1210px; z-index:9001; position:absolute; top:3.25%; left:50%; transform:translateX(-50%);"> 레이어 팝업 내용 <...