장고 데이터베이스 백업 및 복원 방법
Django 프로젝트의 데이터베이스 백업과 복원에 대해 정리해 봤다. 평소엔 잘 돌아가니 신경 쓰지 않고 넘어가기 쉬운 일이지만, 데이터가 손상되거나 문제가 생겼을 때 미리 백업해 두지 않으면 얼마나 큰 후회를 하게 될지 생각하면 소름이 돋는다. 이번 기회에 여러 방법을 제대로 정리하고 기록해두기로 했다.
1. Django 기본 명령어로 데이터베이스 백업하기
가장 기본적이고 손쉬운 방법으로 Django의 dumpdata 명령어가 떠올랐다. 이 명령어는 Django에서 데이터를 JSON 파일로 백업할 수 있어서 꽤 편리하다. 예를 들어, 터미널에서 다음과 같이 명령어를 실행하면 된다.
python manage.py dumpdata > db.json
이 명령어를 실행하자 내 프로젝트의 모든 데이터가 db.json 파일에 저장됐다. 이 방식의 장점은 특정 앱의 데이터만 백업할 수도 있다는 점이다. 특정 앱 데이터만 백업하고 싶을 때는 이렇게 명령어를 사용하면 된다.
python manage.py dumpdata myapp > myapp.json
이 방식은 간단해서 종종 유용하게 사용할 수 있겠다는 생각이 들었다. 다만, 대규모 프로젝트나 데이터가 복잡해지면 한계가 있을 수도 있겠다는 점도 염두에 두기로 했다.
PostgreSQL 백업
먼저, 내가 사용하는 데이터베이스 중 하나인 PostgreSQL에 대해 생각해봤다. PostgreSQL은 명령어를 통해 쉽게 백업과 복원을 할 수 있다. pg_dump라는 명령어가 백업을 해주는데, 생각보다 간단하다. 이렇게 하면 된다.
pg_dump dbname > backup.sql
여기서 dbname은 내 데이터베이스 이름을 적으면 되고, 백업 파일 이름을 backup.sql로 지정할 수 있다.
psql dbname < backup.sql
복원할 때도 위와 같이 명령어만 입력하면 된다. 역시 단순하면서도 확실한 방법이다.
MySQL 백업
다음은 MySQL. PostgreSQL과 비슷하게 mysqldump라는 명령어를 사용하면 된다. 이런 식이다:
mysqldump -u username -p dbname > backup.sql
username과 dbname만 적절하게 변경하면 된다. 그러면 MySQL 데이터베이스를 backup.sql 파일로 쉽게 백업할 수 있다.
mysql -u username -p dbname < backup.sql
여기서 중요한 점은 비밀번호를 묻는다는 것이다. 백업을 완료하면 복원도 똑같이 간편하게 할 수 있다.
SQLite 백업
그리고 내가 장고를 처음 시작했을 때 많이 사용했던 SQLite는 파일 자체가 데이터베이스라서 백업이 더 쉽다. 단순히 파일을 복사하면 그게 백업이 된다.
cp db.sqlite3 backup.sqlite3
이렇게 .sqlite3 파일을 복사해 두기만 하면 된다. SQLite는 이런 면에서 정말 가볍고 관리가 쉽다.
장고 Management Command로 백업 자동화
마지막으로 좀 더 자동화된 방식도 고민해봤다. 장고에서 management command를 사용해 백업을 처리하면 명령어 한 줄로 여러 가지 데이터베이스를 손쉽게 백업할 수 있지 않을까 싶었다. 그래서 간단하게 커스텀 명령어를 만들어봤다.
먼저 management/commands 디렉토리를 생성한 후, backup_db.py 파일을 작성했다.
your_app/
management/
__init__.py
commands/
__init__.py
backup_db.py
그리고 다음과 같이 코드를 작성했다:
import os
from django.core.management.base import BaseCommand
from django.conf import settings
class Command(BaseCommand):
help = 'Backup the database'
def handle(self, *args, **options):
db = settings.DATABASES['default']
if db['ENGINE'] == 'django.db.backends.postgresql':
os.system(f"pg_dump {db['NAME']} > backup.sql")
elif db['ENGINE'] == 'django.db.backends.mysql':
os.system(f"mysqldump -u {db['USER']} -p{db['PASSWORD']} {db['NAME']} > backup.sql")
elif db['ENGINE'] == 'django.db.backends.sqlite3':
os.system(f"cp {db['NAME']} backup.sqlite3")
else:
self.stdout.write(self.style.ERROR('Unsupported database backend'))
self.stdout.write(self.style.SUCCESS('Database backup completed successfully'))
이렇게 작성한 후, python manage.py backup_db 명령어만 입력하면 내가 사용 중인 데이터베이스 종류에 상관없이 백업이 진행된다. PostgreSQL, MySQL, SQLite 등 여러 데이터베이스를 자동으로 처리할 수 있으니 무척 편리하다.
오늘 이렇게 장고 데이터베이스 백업에 대해 정리하면서 다시 한 번 느낀 건, 데이터의 안전성은 아무리 강조해도 지나치지 않다는 점이다. 평소에 잘 돌아가는 것 같아서 신경 쓰지 않았던 데이터베이스 백업. 이제는 나도, 그리고 이 글을 읽는 사람들도 주기적으로 백업을 실행할 수 있길 바란다.