Ubuntu에서 DB DUMP 하기 (+ NCP Storage)

JJinu·2025년 7월 29일

나비 프로젝트에서 개발하면서 데이터베이스 백업을 해두지 않아 난감한 경우가 생겨 최신의 데이터로 복구하기 위해서 매일 DB 데이터를 DUMP해야할 필요가 있다고 생각했습니다. (아직은 출시전이라서 크게 타격은 없었지만 실제 운영서버였으면 큰일이났을텐데.. 참 다행입니다 ㅠ)

그리하여 매일 오전 0시 0분에 Ubuntu cron을 통해 DB를 Dump 하고 NCP Storage에 업로드를 시키는 스크립트를 작성하게 되었습니다.

AWS - 스크립트

# DB
DATE=$(date +%Y.%m.%d)
BACKUP_DIR="/home/ubuntu/dump/"
DUMP_COMMAND="/usr/bin/mysqldump"

# nCloud Storage
S3_BUCKET_NAME="codenear-storage"
NCLOUD_ENDPOINT="https://kr.object.ncloudstorage.com"
S3_KEY="db_backups/"

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

# DB DUMP
echo "데이터베이스 백업 시작..."
docker exec mysql $DUMP_COMMAND codenear > "${BACKUP_DIR}${DATE}.sql"

if [ $? -eq 0 ]; then
    echo "데이터베이스 백업이 성공적으로 완료되었습니다: ${BACKUP_DIR}${DATE}.sql"

    # 백업 파일이 실제로 생성되었는지 확인
    if [ ! -f "${BACKUP_DIR}${DATE}.sql" ] || [ ! -s "${BACKUP_DIR}${DATE}.sql" ]; then
        echo "오류: 백업 파일이 제대로 생성되지 않았습니다."
        exit 1
    fi

    echo "NCloud Object Storage에 백업 파일 업로드 중..."

    # NCloud Storage에 업로드
    aws --endpoint-url="$NCLOUD_ENDPOINT" s3 cp "${BACKUP_DIR}${DATE}.sql" "s3://$S3_BUCKET_NAME/$S3_KEY" --acl public-read

    if [ $? -eq 0 ]; then
        echo "NCloud Object Storage 업로드가 성공적으로 완료되었습니다: s3://$S3_BUCKET_NAME/$S3_KEY"

        # 로컬 백업 파일 삭제
        rm "${BACKUP_DIR}${DATE}.sql"
        echo "로컬 백업 파일 삭제 완료: ${BACKUP_DIR}${DATE}.sql"
  else
    echo "오류: NCloud Object Storage 업로드에 실패했습니다."
    exit 1
  fi
else
  echo "데이터베이스 백업에 실패했습니다."
fi

주의할점

현재 이상태로 스크립트를 실행시키면 PutObject Access Denied가 발생할 것이다. 이 문제에 대하여 문의를 보냈고 네이버측에서 아래와 같은 답변을 받을 수 있었다.

“AWS CLI 및 SDK 특정 버전(예: AWS CLI v2.23.0, boto3 1.36) 이후 버전에서는 Object Storage에서 지원하지 않는 새로운 체크섬 알고리즘이 기본적으로 활성화되기 때문에 요청에 실패할 수 있습니다.”

즉, CheckSum 알고리즘을 비활성화 하는 설정이 필요하다.

CheckSum 비활성화

~/.aws/config

[default]
request_checksum_calculation = WHEN_REQUIRED
response_checksum_validation = WHEN_REQUIRED

AWS - 스케줄링 (Cron)

cron

$ crontab -e

0 0 * * * /home/ubuntu/db_dump.sh >> /var/log/db_backup.log 2>&1

매일 00분에 해당 스크립트를 실행시키고 /var/log/db_backup.log 파일에 로그를 남긴다

** 스케줄링이 실행이 안된다고 생각되면 TimeZone 확인하기 
sudo timedatectl set-timezone Asia/Seoul # 타임존 변경 (Asia/Seoul)

logrotate

$ sudo nano /etc/logrotate.d/db_backup

/var/log/db_backup.log {  # 이 로그 파일에 대한 설정 시작
    daily                 # 매일 로테이트
    missingok             # 파일 없어도 오류 아님
    rotate 7              # 7개 보관
    compress              # 압축
    delaycompress         # 지연 압축
    notifempty            # 비어있으면 로테이트 안 함
    create 0640 root adm  # 새 파일 생성 권한
    sharedscripts         # 스크립트 공유
    postrotate            # 로테이트 후 실행
    endscript
}                         # 이 로그 파일에 대한 설정 끝

결과

정상적으로 업로드 완료!
++ 이제는 오전 0시0분 부터 하루 사이에 이슈가 발생했을 때 유실 되는 데이터를 복구할 수 있는 방법을 고민하기!!

profile
하루하루 의미있고 행복하게! (Yesterday is History, Tomorrow is a mystery, But today is a gift)

0개의 댓글