기본 콘텐츠로 건너뛰기

리눅스에서 MySQL DB 백업 자동화하기 (Bash 스크립트 + 크론 설정)

리눅스에서 MySQL DB 백업 자동화하기 (Bash 스크립트 + 크론 설정)

AI 생성 이미지: 리눅스에서 MySQL DB 백업 자동화하기 (Bash 스크립트 + 크론 설정)
AI 생성 이미지: 리눅스에서 MySQL DB 백업 자동화하기 (Bash 스크립트 + 크론 설정)

데이터는 서비스 운영에서 가장 중요한 자산 중 하나입니다. 이 글, 리눅스에서 MySQL DB 백업 자동화하기 (Bash 스크립트 + 크론 설정)에서는 실무에서 바로 쓸 수 있도록 MySQL 백업 스크립트를 작성하는 방법과 cron으로 예약해 완전 자동화하는 절차를 단계별로 설명합니다.

수동 백업에 의존하면 실수나 휴가로 인해 백업이 빠질 수 있습니다. 따라서 스크립트와 스케줄러를 결합해 “사람이 잊어도 백업은 돌아가게” 구성하는 것이 실무의 표준입니다.

1. 서론: 왜 지금 DB 백업 자동화인가?

서비스가 성장할수록 데이터 손실의 비용은 기하급수적으로 늘어납니다. 이 문서, 리눅스에서 MySQL DB 백업 자동화하기 (Bash 스크립트 + 크론 설정)에서는 실무에서 바로 적용 가능한 방법을 중심으로 설명합니다.

많은 조직이 여전히 수작업으로 백업을 수행하거나 임시 조치에 의존합니다. 그 결과 복구 시점(RPO)을 신뢰하기 어렵고, 실수로 복구 불가 상태가 되는 사례가 자주 발생합니다. 자동화는 이런 리스크를 체계적으로 줄여 줍니다.

2. 문제 정의: 수동 백업의 한계

수동으로 백업을 관리할 때 흔히 발생하는 문제는 다음과 같습니다.

  • 백업 누락 – 담당자 부재 또는 일정 문제로 백업이 빠지는 경우가 생깁니다.
  • 불규칙한 백업 주기 – 임의 주기로 백업하면 특정 시점으로의 복구가 불가능할 수 있습니다.
  • 인적 실수 – 잘못된 데이터베이스를 덤프하거나 파일명을 틀려서 복구할 수 없는 상황이 발생합니다.
  • 백업 파일 관리 부재 – 오래된 백업이 쌓여 디스크를 소모하거나 보안 상태가 악화됩니다.

이런 문제들을 해결하려면 백업 절차를 스크립트화하고 스케줄러로 실행해야 합니다. 자동화는 반복 오류를 제거하고, 로그로 상태를 확인할 수 있게 해줍니다.

3. DB 백업 자동화 절차

백업 자동화를 설계할 때는 아래와 같은 흐름으로 접근하면 실패 확률을 줄일 수 있습니다.

  1. 백업 대상 정의 – 어떤 DB나 스키마를, 어떤 빈도로 백업할지 명확히 정합니다.
  2. 스크립트 언어 선택 – 리눅스 환경에서는 보통 Bash가 간단하고 환경 의존성이 적습니다.
  3. 백업 디렉터리 설계 – 로컬 경로와 외부 스토리지를 함께 고려해 보관 정책을 만듭니다.
  4. 백업 스크립트 작성 및 테스트 – 수동 실행으로 정상 동작을 확인한 뒤 자동화합니다.
  5. 스케줄러(cron 등) 연동 – 예약 후 실제 실행 로그를 주기적으로 검토합니다.
💡 TIP: 운영 환경에서는 여러 DB를 백업해야 할 때가 많습니다. 이 경우 DB_NAME을 배열로 두고 반복문으로 처리하면 관리가 편합니다.

4. MySQL DB 백업 자동화 Bash 스크립트 예제

이 절에서는 리눅스에서 MySQL DB 백업 자동화하기 (Bash 스크립트 + 크론 설정) 관점으로, 실무에 적용 가능한 기본 스크립트를 제공합니다. 파일명에는 DB 이름과 날짜·시간을 포함시켜 어떤 시점의 덤프인지 명확히 하도록 합니다.

4-1. 기본 백업 스크립트


#!/bin/bash

# ===== 설정 영역 =====
DB_NAME="your_database"          # 백업할 DB 이름
DB_USER="your_username"          # DB 접속 계정
DB_PASS="your_password"          # DB 접속 비밀번호
BACKUP_DIR="/path/to/backup"     # 백업 파일 저장 경로
DATE=$(date +"%Y%m%d%H%M")       # 백업 시점(YYYYMMDDHHMM)

# 디렉터리가 없으면 생성
mkdir -p "$BACKUP_DIR"

# ===== 백업 수행 =====
mysqldump -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" > "$BACKUP_DIR/${DB_NAME}_${DATE}.sql"

# ===== 오래된 백업 정리 (7일 지난 .sql 파일 삭제) =====
find "$BACKUP_DIR" -type f -name "*.sql" -mtime +7 -exec rm {} \;

# ===== 로그 출력 =====
echo "[INFO] $DATE - ${DB_NAME} 백업 완료: $BACKUP_DIR/${DB_NAME}_${DATE}.sql"
        
⚠️ 주의: 운영 환경에서는 비밀번호를 스크립트에 평문으로 두지 마세요. .my.cnf, 환경 변수, 또는 Vault/Secrets Manager를 사용해 자격 증명을 안전하게 관리해야 합니다.

4-2. 스크립트 동작 요약

  • mysqldump로 지정한 DB를 덤프하여 파일로 저장합니다.
  • 파일명에 DB_NAME_날짜시간.sql 형태를 사용해 검색과 관리가 쉽도록 합니다.
  • find로 오래된 백업을 자동 삭제해 디스크를 관리합니다.
  • echo로 로그를 남겨 크론 로그에서 실행 여부를 확인할 수 있습니다.

5. 크론(cron)에 등록해서 완전 자동화하기

스크립트가 수동으로 정상 동작하는 것을 확인했다면, 다음 단계는 예약입니다. 여기서는 리눅스에서 MySQL DB 백업 자동화하기 (Bash 스크립트 + 크론 설정)을 목표로 크론 등록 예시와 확인 방법을 설명합니다.

5-1. 크론탭 설정 예시

예를 들어 매일 새벽 3시에 자동으로 백업하려면 아래처럼 크론에 추가합니다.


# 크론탭 편집
crontab -e

# 아래 한 줄 추가 (예: /usr/local/bin/db_backup.sh 위치에 스크립트가 있을 때)
0 3 * * * /usr/local/bin/db_backup.sh >> /var/log/db_backup.log 2>&1
        
  • 0 3 * * * → 매일 새벽 3시 0분에 실행
  • >> /var/log/db_backup.log 2>&1 → 표준 출력과 에러를 지정한 로그 파일에 저장
💡 TIP: 크론이 실제로 수행됐는지 확인할 때는 시스템 로그(/var/log/cron 등)와 스크립트에서 남긴 로그 파일을 함께 검토하세요.

6. 운영 시 체크리스트 및 주의사항

자동화한 백업이 의미 있으려면 다음 항목을 지속적으로 관리해야 합니다.

  • 디스크 용량 모니터링 – 백업이 쌓여 디스크 부족으로 서비스 장애가 발생하지 않도록 경고 체계를 만드세요.
  • 주기적인 복구 테스트 – 백업 파일로 실제 복구를 해보지 않으면 문제가 있음을 알기 어렵습니다.
  • 백업 파일 암호화/권한 관리 – 백업은 민감 정보를 포함하므로 접근 제어와 암호화를 적용하세요.
  • 오프사이트/클라우드 백업 – 동일 서버에만 보관하면 물리적 손상 시 모두 소실될 수 있습니다.
  • DB 계정 최소 권한 – 백업 전용 계정에 필요한 권한만 부여해 보안을 강화하세요.

7. FAQ: 자주 묻는 질문

Q1. 백업 주기는 어떻게 설정하는 것이 좋을까요?

데이터 변경 빈도와 비즈니스 요구에 따라 달라집니다. 예를 들어 트래픽이 많은 서비스는 하루 여러 번 또는 매시간 백업이 필요할 수 있고, 내부 시스템은 하루 1회 수준으로 충분한 경우가 많습니다.

  • 중요 서비스: 하루 1회 이상, 필요 시 매시간
  • 내부 업무 시스템: 하루 1회 또는 평일 기준 1회
  • 변경이 거의 없는 DB: 주간 또는 월간

Q2. 어떤 스크립트 언어를 쓰는 게 좋나요?

리눅스 기반 운영 환경에서는 Bash가 간단하고 배포가 쉬워 널리 쓰입니다. 다만 복잡한 처리나 외부 API 연동이 많다면 Python을 고려하세요.

Q3. 백업 파일은 어디에 저장해야 안전한가요?

로컬 디스크만으로는 위험합니다. 별도의 백업 서버, NAS, 또는 클라우드 스토리지를 병행해 온사이트와 오프사이트를 모두 확보하는 것이 바람직합니다.

Q4. 자동화 후에도 사람이 할 일은 무엇인가요?

자동화는 반복 작업을 줄이지만, 모니터링과 주기적 점검은 필수입니다. 로그 확인, 백업 크기와 복구 테스트를 꾸준히 수행해야 합니다.

💬 한 줄 정리: 리눅스에서 MySQL DB 백업 자동화하기 (Bash 스크립트 + 크론 설정)은 복구 가능성을 확보하고 운영 리스크를 줄이는 가장 실용적인 투자입니다.

© 2025 칼퇴하는 개발자. 안전한 백업으로 불필요한 야근을 줄이세요.

🚀 이 주제, 우리 서비스에 어떻게 적용할까요?

리눅스에서 MySQL DB 백업 자동화하기 (Bash 스크립트 + 크론 설정)를 실제 서비스와 조직에 녹여보고 싶다면, 현재 아키텍처와 운영 방식을 한 번 점검해 보는 것부터 시작해 보세요. 팀 위키나 기술 블로그, 사내 스터디 주제로도 아주 좋습니다.

이 글이 도움이 됐다면, 비슷한 엔터프라이즈 사례 글들도 함께 살펴보면서 우리 조직에 맞는 운영 상용구를 정의해 보세요.

AI 생성 이미지: 리눅스에서 MySQL DB 백업 자동화하기 (Bash 스크립트 + 크론 설정)
AI 생성 이미지: 리눅스에서 MySQL DB 백업 자동화하기 (Bash 스크립트 + 크론 설정)

댓글

이 블로그의 인기 게시물

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%);"> 레이어 팝업 내용 <...