SQLite 운영에서 배운 실전 교훈
원제: Learning a few things about running SQLite
왜 중요한가
소규모 웹 서비스에서 SQLite 도입이 늘어나는 가운데, 실제 운영 시 발생하는 구체적 문제와 해결책이 실용적 지침을 제공한다.
Julia Evans가 2026년 7월, Django 사이트에 SQLite를 사용하면서 경험한 운영 상의 주요 문제점과 해결책을 블로그에 공개했다. ANALYZE 명령 미실행으로 인한 쿼리 5초 지연, 대량 삭제 시 Writer 충돌, 백업 방법 등을 구체적인 수치와 함께 정리했다.
Julia Evans는 Django 기반 웹사이트에 SQLite를 도입하면서 여러 실전 문제를 겪었다고 밝혔다. 이번이 SQLite를 활용한 4번째 사이트이지만, Django ORM 사용으로 데이터베이스 부하가 이전보다 높아졌다고 설명했다.
**ANALYZE 명령의 중요성**: FTS5 전문 검색을 사용하는 약 4,000행 테이블에서 특정 쿼리가 5초 걸리는 문제가 발생했다. ANALYZE 명령을 실행하자 즉시 0.05초 수준으로 단축됐다. ANALYZE는 테이블의 행 수 등 통계 정보를 생성해 쿼리 플래너가 최적 실행 계획을 선택할 수 있게 한다.
**대량 삭제 시 Writer 충돌 문제**: 불필요한 행(예: django-tasks-db의 완료된 작업)을 대량 삭제할 때, 작업이 5초를 초과하면 다른 Worker가 DB 쓰기를 시도하다가 타임아웃으로 크래시되는 문제가 반복됐다. 현재는 삭제 작업을 소규모 배치로 나눠 5초 이내에 완료되도록 하는 방법으로 대응하고 있다. 이 경험을 통해 다중 Writer를 지원하는 PostgreSQL의 필요성을 체감했다고 덧붙였다.
**SQLite 백업 방법**: `VACUUM INTO`로 일관성 있는 스냅샷을 생성한 뒤 gzip 압축 후 S3에 업로드하는 방식과 restic을 활용하는 방식 두 가지를 소개했다. 백업 복구 테스트는 아직 실시하지 않았으며, Dead Man's Switch로 백업 모니터링을 하고 있다고 밝혔다.