MySQL 백업 및 복구 완벽 가이드: 데이터 손실 제로 달성하기

MySQL 데이터베이스 백업과 복구 실전 가이드. mysqldump, binlog를 활용한 완벽한 백업 전략을 배웁니다.

럿지 AI 팀
4분 읽기

MySQL 백업 및 복구 가이드



백업 전략



3-2-1 규칙



- **3**개의 복사본
- **2**개의 다른 미디어
- **1**개는 오프사이트

1. 전체 백업 (mysqldump)



기본 백업



``bash
mysqldump -u root -p --all-databases > backup_full.sql
`

특정 DB만



`bash
mysqldump -u root -p mydatabase > backup_mydatabase.sql
`

특정 테이블만



`bash
mysqldump -u root -p mydatabase orders > backup_orders.sql
`

옵션 추가 (권장)



`bash
mysqldump -u root -p \
--single-transaction \ # InnoDB 일관성
--routines \ # 프로시저 포함
--triggers \ # 트리거 포함
--events \ # 이벤트 포함
--all-databases > backup.sql
`

2. 증분 백업 (Binary Log)



binlog 활성화



`sql
-- my.cnf 설정
[mysqld]
log-bin=mysql-bin
expire_logs_days=7
`

binlog 확인



`sql
SHOW BINARY LOGS;

-- 결과:
-- mysql-bin.000001
-- mysql-bin.000002
-- mysql-bin.000003
`

binlog 백업



`bash
cp /var/lib/mysql/mysql-bin.* /backup/binlog/
`

3. 자동화 스크립트



`bash
#!/bin/bash

backup.sh



DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/mysql"

1. 전체 백업 (주 1회 - 일요일)


if [ $(date +%u) -eq 7 ]; then
mysqldump -u root -p$DB_PASSWORD \
--single-transaction \
--all-databases > $BACKUP_DIR/full_$DATE.sql

gzip $BACKUP_DIR/full_$DATE.sql
fi

2. binlog 백업 (매일)


cp /var/lib/mysql/mysql-bin.* $BACKUP_DIR/binlog/

3. 오래된 백업 삭제 (30일 이상)


find $BACKUP_DIR -mtime +30 -delete
`

cron 등록



`bash

매일 새벽 2시 실행


0 2 * * * /path/to/backup.sh
`

4. 복구 시나리오



Case 1: 전체 복구



`bash

백업 파일 압축 해제


gunzip backup_full.sql.gz

복구


mysql -u root -p < backup_full.sql
`

Case 2: 특정 DB만



`bash
mysql -u root -p mydatabase < backup_mydatabase.sql
`

Case 3: 특정 시점 복구 (PITR)



`bash

1. 전체 백업 복구 (12:00)


mysql -u root -p < backup_full_20240128_120000.sql

2. binlog 적용 (12:00 ~ 14:30)


mysqlbinlog mysql-bin.000001 \
--start-datetime="2024-01-28 12:00:00" \
--stop-datetime="2024-01-28 14:30:00" \
| mysql -u root -p

결과: 14:30 시점으로 복구!


`

Case 4: 잘못된 쿼리 복구



`bash

예: 14:25에 실수로 DELETE 실행



1. 14:25 직전까지 복구


mysqlbinlog mysql-bin.000001 \
--stop-datetime="2024-01-28 14:24:59" \
| mysql -u root -p

2. DELETE 쿼리 건너뛰고 이후 복구


mysqlbinlog mysql-bin.000001 \
--start-position=12345 \ # DELETE 이후 position
| mysql -u root -p
`

5. 테스트 복구



정기적 테스트 (월 1회)



`bash
#!/bin/bash

test_recovery.sh



1. 테스트 서버에 복구


mysql -h test-server -u root -p < backup_full.sql

2. 데이터 검증


mysql -h test-server -u root -p -e "
SELECT COUNT(*) FROM mydatabase.orders;
SELECT COUNT(*) FROM mydatabase.members;
"

3. 결과 로그 저장


`

6. 클라우드 백업



AWS S3로 백업



`bash

백업 후 S3 업로드


mysqldump -u root -p --all-databases | gzip | \
aws s3 cp - s3://my-bucket/backup_$(date +%Y%m%d).sql.gz
`

자동 암호화



`bash

백업 + 암호화 + S3


mysqldump -u root -p --all-databases | \
gzip | \
openssl enc -aes-256-cbc -salt -out backup.sql.gz.enc

aws s3 cp backup.sql.gz.enc s3://my-bucket/
`

7. 모니터링



백업 성공 확인



`bash
#!/bin/bash

check_backup.sh



최신 백업 파일 확인


LATEST_BACKUP=$(ls -t /backup/mysql/full_*.sql.gz | head -1)

24시간 이내 백업 확인


if [ $(find $LATEST_BACKUP -mtime -1 | wc -l) -eq 0 ]; then
echo "ERROR: 최근 백업 없음!" | mail -s "Backup Alert" admin@example.com
fi
``

핵심 체크리스트



백업



- [ ] 전체 백업 (주 1회)
- [ ] binlog 백업 (매일)
- [ ] 오프사이트 백업
- [ ] 암호화
- [ ] 자동화

복구



- [ ] 복구 절차 문서화
- [ ] 정기 복구 테스트
- [ ] 복구 시간 측정
- [ ] 담당자 교육

더 배우기



김영한의 실전 데이터베이스
- DB 관리 심화
- 재해 복구
- 고가용성

---

**태그**: #MySQL백업 #데이터복구 #mysqldump #binlog #재해복구

L

럿지 AI 팀

AI 기술과 비즈니스 혁신을 선도하는 럿지 AI의 콘텐츠 팀입니다.