나비 프로젝트에서 개발하면서 데이터베이스 백업을 해두지 않아 난감한 경우가 생겨 최신의 데이터로 복구하기 위해서 매일 DB 데이터를 DUMP해야할 필요가 있다고 생각했습니다. (아직은 출시전이라서 크게 타격은 없었지만 실제 운영서버였으면 큰일이났을텐데.. 참 다행입니다 ㅠ)
그리하여 매일 오전 0시 0분에 Ubuntu cron을 통해 DB를 Dump 하고 NCP Storage에 업로드를 시키는 스크립트를 작성하게 되었습니다.
# 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
$ crontab -e
0 0 * * * /home/ubuntu/db_dump.sh >> /var/log/db_backup.log 2>&1
매일 0시 0분에 해당 스크립트를 실행시키고 /var/log/db_backup.log 파일에 로그를 남긴다
** 스케줄링이 실행이 안된다고 생각되면 TimeZone 확인하기
sudo timedatectl set-timezone Asia/Seoul # 타임존 변경 (Asia/Seoul)
$ 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분 부터 하루 사이에 이슈가 발생했을 때 유실 되는 데이터를 복구할 수 있는 방법을 고민하기!!