[연구 자동화 #37] 소중한 실험 데이터를 지키는 최후의 보루: 파이썬 DB 백업 및 복구 자동화


연구실에서 가장 등골이 오싹해지는 순간이 언제일까요? 아마 어제까지 멀쩡히 돌아가던 분석 프로그램이 "Database file is corrupted"라는 에러를 내뱉거나, 실수로 DROP TABLE 명령어를 날려 지난 몇 달간의 실험 기록이 증발했다는 사실을 깨달았을 때일 것입니다. 저 역시 석사 과정 시절, 외장 하드 전원을 잘못 뽑아 수천 장의 분석 이미지가 담긴 DB를 통째로 날리고 꼬박 사흘을 밤새워 복구했던 아픈 기억이 있습니다.

자동화의 핵심은 단순히 일을 빨리 처리하는 것에 그치지 않습니다. 예상치 못한 재난 상황에서도 내 연구 성과를 안전하게 지켜내는 '복원력'을 갖추는 것이 진정한 자동화의 완성입니다. 오늘은 파이썬의 표준 라이브러리만을 활용해, 매일 정해진 시간에 DB를 백업하고 필요할 때 즉시 복구하는 시스템을 구축해 보겠습니다.


1. 왜 연구용 DB는 '자동' 백업이 필수인가?

우리는 흔히 "중요한 파일이니까 수동으로 자주 복사해둬야지"라고 생각합니다. 하지만 연구에 몰입하다 보면 백업은 늘 우선순위에서 밀리기 마련입니다. 특히 데이터가 실시간으로 쌓이는 자동화 시스템에서는 백업 시점을 놓치면 수 시간 분량의 귀한 실험 수치를 잃게 됩니다.

SQLite는 파일 하나로 구성되어 있어 백업이 매우 쉽지만, 반대로 그 파일 하나가 손상되면 모든 데이터를 잃는다는 위험도 큽니다. 따라서 사람이 직접 복사하는 것이 아니라, 파이썬 스크립트가 알아서 날짜와 시간을 붙여 복사본을 만들어두는 시스템이 반드시 필요합니다.


2. 파이썬 shutil을 활용한 초간단 백업 스크립트

파이썬에는 파일을 복사하는 데 최적화된 shutil 라이브러리가 있습니다. 이를 활용하면 단 몇 줄의 코드로 완벽한 백업 파일을 생성할 수 있습니다. 단순히 복사만 하는 것이 아니라, 파일명에 현재 날짜와 시간을 포함해 언제 만든 백업인지 한눈에 알 수 있게 하는 것이 핵심입니다.

Python
import shutil
import os
from datetime import datetime

def backup_research_db(db_file, backup_dir):
    # 백업 폴더가 없으면 생성
    if not os.path.exists(backup_dir):
        os.makedirs(backup_dir)
    
    # 현재 시간을 포맷팅하여 파일명 생성 (예: research_data_20260508_1200.db)
    timestamp = datetime.now().strftime('%Y%m%d_%H%M')
    backup_file = f"backup_{timestamp}_{os.path.basename(db_file)}"
    dest_path = os.path.join(backup_dir, backup_file)
    
    try:
        shutil.copy2(db_file, dest_path)
        print(f"백업 성공: {dest_path}")
    except Exception as e:
        print(f"백업 실패: {e}")

# 사용 예시
backup_research_db('research_data.db', './backups')

여기서 shutil.copy2를 사용한 이유는 파일의 메타데이터(생성 시간, 수정 시간 등)까지 그대로 보존하기 위해서입니다. 나중에 수많은 백업 파일 사이에서 특정 시점의 데이터를 찾을 때 큰 도움이 됩니다.


3. 복구 시나리오: 당황하지 않고 되돌리기

백업만큼 중요한 것이 복구 테스트입니다. 백업 파일은 수백 개인데 정작 복구하는 방법을 모른다면 아무 소용이 없겠죠. 복구는 기본적으로 현재 사용 중인 DB 파일을 안전한 곳으로 치우고, 백업 파일을 그 자리에 다시 가져다 놓는 과정입니다.

복구 시 주의할 점은 현재 프로그램이 DB를 사용 중(Locked)인 상태에서는 파일을 덮어쓸 수 없다는 것입니다. 반드시 파이썬의 DB 연결(conn.close())을 종료한 상태에서 복구 작업을 수행해야 합니다. 저는 아예 restore_db.py라는 별도의 복구 전용 스크립트를 만들어두고, 비상시에만 실행하도록 관리합니다.


4. 전문가의 팁: 3-2-1 백업 원칙 적용하기

진정으로 소중한 연구 데이터라면 '3-2-1 백업 원칙'을 권장합니다.

  1. 3개 이상의 복사본을 유지하고,

  2. 2가지 이상의 서로 다른 매체(내장 HDD, 외장 하드 등)에 저장하며,

  3. 1개는 반드시 물리적으로 떨어진 곳(클라우드 저장소 등)에 보관하는 것입니다.

파이썬 스크립트로 로컬 백업을 수행한 뒤, 구글 드라이브나 드롭박스의 동기화 폴더로 파일을 이동시키도록 코드를 조금만 수정하면, 여러분의 연구실에 불이 나거나 컴퓨터가 고장 나더라도 데이터만큼은 안전하게 지킬 수 있습니다.


5. 마치며: 평화로운 연구 생활을 위한 보험

보험은 사고가 나기 전에는 그 가치를 알기 어렵습니다. 백업 자동화 역시 마찬가지입니다. 매일 돌아가는 백업 스크립트가 귀찮게 느껴질 수도 있지만, 단 한 번의 위기 순간에서 여러분의 수개월 치 노력을 구해내는 순간 "이걸 해두길 정말 잘했다"라는 안도감을 느끼게 될 것입니다. 지금 당장 여러분의 연구용 DB를 위한 자동 백업 코드를 실행해 보세요.


## 핵심 요약

  • 파이썬의 shutildatetime 모듈을 조합하면 날짜별로 구분된 자동 백업 시스템을 손쉽게 구축할 수 있습니다.

  • 백업 시에는 파일 손상을 대비해 원본의 메타데이터까지 보존하는 copy2 함수를 사용하는 것이 유리합니다.

  • 물리적으로 떨어진 클라우드 저장소와 연동하여 백업본을 분산 보관하는 것이 데이터 안전의 핵심입니다.


## 다음 편 예고 38편에서는 여러 실험 장비에서 들어오는 데이터를 실시간으로 감시하고 이상 징후를 알려주는 [파이썬 실시간 모니터링 및 알림 시스템 구축]에 대해 다룹니다.


데이터 유실로 인해 곤란했던 경험이 있으신가요? 혹은 여러분만의 특별한 백업 노하우가 있다면 댓글로 들려주세요!

댓글

이 블로그의 인기 게시물

[연구 자동화 #23] 특별 부록: 일 잘하는 연구원의 파이썬 환경 설정과 데이터 관리 꿀팁

[연구 자동화 #6] 시각화의 시작: Matplotlib으로 논문용 고해상도 그래프 그리기

[연구 자동화 #31] 논문에 바로 쓰는 시각화의 정석: 출판용 고해상도 이미지 만들기