728x90
반응형
Django Migration Reset 완벽 가이드
📋 목차
1. Migration Reset이란? 2. 주의사항 및 백업 3. 개발 환경 Reset 방법 4. 운영 환경 Reset 방법 5. 특정 앱만 Reset하기 6. 문제 해결 및 복구 7. 완전 Reset 체크리스트1. Migration Reset이란?
🎯 Migration Reset의 정의
Django Migration Reset은 기존의 모든 마이그레이션 파일과 데이터베이스 스키마를 초기화하고, 새로운 마이그레이션을 처음부터 다시 생성하는 과정입니다.
🔄 언제 Migration Reset이 필요한가?
- 복잡한 마이그레이션 충돌: 해결하기 어려운 마이그레이션 충돌이 발생했을 때
- 모델 구조 대대적 변경: 기존 모델을 완전히 새로 설계할 때
- 개발 초기 단계: 프로덕션 배포 전 개발 단계에서
- 테스트 데이터 정리: 개발용 테스트 데이터를 완전히 초기화할 때
- DB 스키마 최적화: 불필요한 마이그레이션 히스토리 정리
🚨 중요한 경고
Migration Reset은 모든 데이터를 삭제합니다. 운영 환경에서는 절대 함부로 실행하지 마세요!
2. 주의사항 및 백업
⚠️ Reset 전 필수 체크사항
- 현재 환경이 개발용인지 다시 한번 확인
- 중요한 데이터가 있는지 검토
- 팀원들에게 Reset 계획 공유
- 백업 계획 수립
💾 데이터 백업 방법
1 전체 데이터베이스 백업
# 전체 DB 덤프 python manage.py dumpdata > full_backup.json # 특정 앱만 백업 python manage.py dumpdata myapp > myapp_backup.json # 사용자 데이터만 백업 python manage.py dumpdata auth.user > users_backup.json # 날짜 포함 백업 파일명 python manage.py dumpdata > backup_$(date +%Y%m%d_%H%M%S).json
2 데이터베이스 파일 백업 (SQLite)
# SQLite 파일 복사 cp db.sqlite3 db_backup_$(date +%Y%m%d).sqlite3 # 압축해서 백업 tar -czf db_backup_$(date +%Y%m%d).tar.gz db.sqlite3
3 마이그레이션 파일 백업
# 모든 마이그레이션 파일 백업 find . -path "*/migrations/*.py" -not -name "__init__.py" | xargs tar -czf migrations_backup_$(date +%Y%m%d).tar.gz # 특정 앱의 마이그레이션만 백업 tar -czf myapp_migrations_backup.tar.gz myapp/migrations/
3. 개발 환경 Reset 방법
개발 환경에서 안전하게 Reset하는 방법들을 소개합니다.
🔄 방법 1: 완전 Reset (권장)
1 모든 마이그레이션 파일 삭제
# 모든 앱의 마이그레이션 파일 삭제 (__init__.py 제외) find . -path "*/migrations/*.py" -not -name "__init__.py" -delete find . -path "*/migrations/*.pyc" -delete # 또는 수동으로 각 앱별 삭제 rm myapp/migrations/0*.py rm anotherapp/migrations/0*.py
2 데이터베이스 삭제
# SQLite 사용시 rm db.sqlite3 # PostgreSQL 사용시 dropdb myproject_db createdb myproject_db # MySQL 사용시 mysql -u root -p -e "DROP DATABASE myproject_db; CREATE DATABASE myproject_db;"
3 새로운 마이그레이션 생성
# 새로운 초기 마이그레이션 생성 python manage.py makemigrations # 마이그레이션 적용 python manage.py migrate # 슈퍼유저 생성 python manage.py createsuperuser
⚡ 방법 2: 스크립트를 이용한 자동 Reset
1 Reset 스크립트 생성
#!/bin/bash # reset_migrations.sh echo "🚨 Django Migration Reset 시작..." # 백업 생성 echo "📦 백업 생성 중..." python manage.py dumpdata > backup_$(date +%Y%m%d_%H%M%S).json # 마이그레이션 파일 삭제 echo "🗑️ 마이그레이션 파일 삭제 중..." find . -path "*/migrations/*.py" -not -name "__init__.py" -delete find . -path "*/migrations/*.pyc" -delete # 데이터베이스 삭제 echo "🗄️ 데이터베이스 삭제 중..." rm -f db.sqlite3 # 새로운 마이그레이션 생성 echo "🔄 새로운 마이그레이션 생성 중..." python manage.py makemigrations python manage.py migrate echo "✅ Reset 완료!"
2 스크립트 실행
# 실행 권한 부여 chmod +x reset_migrations.sh # 스크립트 실행 ./reset_migrations.sh
4. 운영 환경 Reset 방법
🚨 운영 환경 주의사항
운영 환경에서는 절대 함부로 Reset하지 마세요. 다음 절차를 반드시 따르세요.
🔐 운영 환경 안전 Reset 절차
1 서비스 중단 및 백업
# 1. 웹서버 중단 sudo systemctl stop nginx sudo systemctl stop gunicorn # 2. 완전한 데이터베이스 백업 pg_dump myproject_db > production_backup_$(date +%Y%m%d_%H%M%S).sql # 3. Django 데이터 백업 python manage.py dumpdata > production_data_backup.json # 4. 미디어 파일 백업 tar -czf media_backup_$(date +%Y%m%d).tar.gz media/
2 점진적 마이그레이션 Reset
# 1. 현재 마이그레이션 상태 확인 python manage.py showmigrations # 2. 마이그레이션 기록만 초기화 (데이터 보존) python manage.py migrate --fake-initial # 3. 새로운 마이그레이션 생성 python manage.py makemigrations --empty --name reset_migration # 4. 신중하게 마이그레이션 적용 python manage.py migrate --dry-run # 먼저 시뮬레이션 python manage.py migrate
3 데이터 검증 및 서비스 재시작
# 1. 데이터 무결성 검증 python manage.py check python manage.py validate # 2. 테스트 실행 python manage.py test # 3. 서비스 재시작 sudo systemctl start gunicorn sudo systemctl start nginx # 4. 상태 확인 sudo systemctl status gunicorn sudo systemctl status nginx
⚠️ 운영 환경 대안 방법
- Blue-Green 배포: 새로운 환경을 구축하여 전환
- 스테이징 환경 테스트: 운영과 동일한 환경에서 먼저 테스트
- 점진적 마이그레이션: 한 번에 모든 것을 변경하지 않기
- 롤백 계획: 문제 발생 시 즉시 되돌릴 수 있는 계획
5. 특정 앱만 Reset하기
🎯 단일 앱 마이그레이션 Reset
전체 프로젝트가 아닌 특정 앱의 마이그레이션만 초기화하는 방법입니다.
📱 특정 앱 Reset 방법
1 해당 앱 데이터 백업
# 특정 앱 데이터만 백업 python manage.py dumpdata myapp > myapp_backup.json # 관련 테이블 확인 python manage.py dbshell .tables # SQLite \dt # PostgreSQL
2 앱을 초기 상태로 되돌리기
# 특정 앱을 초기 마이그레이션으로 되돌리기 python manage.py migrate myapp zero # 마이그레이션 파일 삭제 rm myapp/migrations/0*.py # 새로운 초기 마이그레이션 생성 python manage.py makemigrations myapp # 마이그레이션 적용 python manage.py migrate myapp
3 데이터 복원 (선택사항)
# 백업된 데이터 복원 (스키마가 호환될 경우) python manage.py loaddata myapp_backup.json # 또는 수동으로 필요한 데이터만 입력
💡 외래키 관계가 있는 앱 Reset 시 주의사항
- 다른 앱과의 관계를 먼저 확인하세요
- 참조하는 앱들도 함께 고려해야 합니다
- 의존성 순서에 따라 Reset 순서를 정하세요
6. 문제 해결 및 복구
🚨 일반적인 문제들과 해결방법
❌ 문제 1: 마이그레이션 충돌
# 마이그레이션 충돌 해결 python manage.py makemigrations --merge # 충돌 파일 수동 편집 후 python manage.py migrate
❌ 문제 2: 외래키 제약조건 오류
# 외래키 체크 비활성화 (MySQL) python manage.py dbshell SET foreign_key_checks = 0; -- 작업 수행 SET foreign_key_checks = 1;
❌ 문제 3: 마이그레이션 파일 손상
# 손상된 마이그레이션 파일 건너뛰기 python manage.py migrate --fake myapp 0005 # 또는 완전히 새로 시작 python manage.py migrate myapp zero rm myapp/migrations/0*.py python manage.py makemigrations myapp
🔄 데이터 복구 방법
1 JSON 백업에서 복구
# 전체 데이터 복구 python manage.py loaddata backup_file.json # 특정 모델만 복구 python manage.py loaddata --app myapp backup_file.json
2 SQL 백업에서 복구
# PostgreSQL 복구 psql myproject_db < backup_file.sql # MySQL 복구 mysql -u username -p myproject_db < backup_file.sql
3 부분 데이터 복구
# 특정 테이블만 복구 python manage.py shell
# Django shell에서 import json from myapp.models import MyModel # JSON 파일에서 특정 데이터만 로드 with open('backup_file.json', 'r') as f: data = json.load(f) # 특정 모델 데이터만 필터링 및 복구 for item in data: if item['model'] == 'myapp.mymodel': obj, created = MyModel.objects.get_or_create( id=item['pk'], defaults=item['fields'] ) if created: print(f"복구됨: {obj}")
7. 완전 Reset 체크리스트
✅ Reset 전 체크리스트
- □ 현재 환경이 개발/테스트 환경인지 확인
- □ 중요한 데이터 백업 완료
- □ 팀원들에게 Reset 계획 공유
- □ 마이그레이션 파일 백업
- □ 미디어 파일 백업 (필요시)
- □ 환경 변수 및 설정 파일 백업
🔄 완전 Reset 스크립트
#!/bin/bash # complete_reset.sh - 완전한 Django 프로젝트 Reset set -e # 오류 발생시 스크립트 중단 echo "🚨 Django 프로젝트 완전 Reset 시작..." # 1. 백업 디렉토리 생성 BACKUP_DIR="backups/$(date +%Y%m%d_%H%M%S)" mkdir -p $BACKUP_DIR echo "📦 백업 생성 중..." # 2. 전체 데이터 백업 python manage.py dumpdata > $BACKUP_DIR/full_backup.json # 3. 마이그레이션 파일 백업 find . -path "*/migrations/*.py" -not -name "__init__.py" | xargs tar -czf $BACKUP_DIR/migrations_backup.tar.gz # 4. 데이터베이스 파일 백업 (SQLite인 경우) if [ -f "db.sqlite3" ]; then cp db.sqlite3 $BACKUP_DIR/ fi echo "🗑️ 기존 데이터 삭제 중..." # 5. 마이그레이션 파일 삭제 find . -path "*/migrations/*.py" -not -name "__init__.py" -delete find . -path "*/migrations/*.pyc" -delete # 6. 데이터베이스 삭제 rm -f db.sqlite3 # 7. __pycache__ 정리 find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true echo "🔄 새로운 환경 구성 중..." # 8. 새로운 마이그레이션 생성 python manage.py makemigrations # 9. 마이그레이션 적용 python manage.py migrate # 10. 슈퍼유저 생성 (자동) echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'admin@example.com', 'admin123') if not User.objects.filter(username='admin').exists() else None" | python manage.py shell echo "✅ Reset 완료!" echo "📁 백업 위치: $BACKUP_DIR" echo "👤 관리자 계정: admin / admin123" echo "🚀 서버 시작: python manage.py runserver"
✅ Reset 후 확인사항
- □ 마이그레이션 상태 확인:
python manage.py showmigrations - □ 모델 검증:
python manage.py check - □ 테스트 실행:
python manage.py test - □ Admin 페이지 접속 확인
- □ 기본 기능 동작 확인
- □ 필요한 초기 데이터 입력
💡 Reset 후 권장사항
- 초기 데이터 설정: fixtures나 management commands로 기본 데이터 생성
- 테스트 데이터 생성: 개발용 더미 데이터 준비
- 문서 업데이트: 변경된 모델 구조 문서화
- 팀 공유: 새로운 모델 구조를 팀원들과 공유
⚠️ 최종 주의사항
- Reset은 되돌릴 수 없는 작업입니다
- 운영 환경에서는 절대 함부로 실행하지 마세요
- 항상 백업을 먼저 생성하세요
- 팀원들과 충분히 상의 후 진행하세요
- 스테이징 환경에서 먼저 테스트하세요
728x90
반응형
'코딩' 카테고리의 다른 글
| 데이터 전처리 및 파이프라인 (0) | 2025.08.22 |
|---|---|
| endless project timeline & flow (0) | 2025.08.06 |
| django Data Migration Guide (0) | 2025.08.03 |
| Authentication System Prompt - Endless-Login (0) | 2025.07.28 |
| 방법이 필요한 게 아니다. 필요한 것은 '무한한 아이디어; Ideas' 이다. (0) | 2025.07.28 |