17P by baeba 1일전 | ★ favorite | 댓글 2개

서론

  • SQLite 데이터베이스를 rsync로 직접 복사할 경우, 인덱스 등으로 인해 파일 크기가 커져 느리고 불안정함.
  • 이에 따라 .dump를 활용해 텍스트 기반으로 압축·복원하는 방식이 제안됨.

본론

  • .dump 명령은 전체 DB를 SQL 텍스트로 출력하며, 인덱스는 명령어 한 줄로 대체되어 파일 크기가 작아짐.

    sqlite3 my_database.db .dump > my_database.db.txt  
    
  • 텍스트 파일은 gzip 압축 시 추가적인 용량 절감 가능:

    sqlite3 my_database.db .dump | gzip -c > my_database.db.txt.gz  
    
  • 서버에서 압축본을 생성하고, 로컬로 복사 후 복원하는 절차로 전환함:

    ssh username@server "sqlite3 db.db .dump | gzip -c > db.txt.gz"  
    rsync --progress username@server:db.txt.gz .  
    gunzip db.txt.gz  
    cat db.txt | sqlite3 restored.db  
    
  • 원본 DB 파일 3.4GB → 덤프 텍스트 1.3GB → gzip 압축본 240MB로 약 14배 감소.

  • 기존 rsync 방식은 전송 도중 DB가 변경되면 database disk image is malformed 오류 발생 가능.

  • 텍스트 덤프 방식은 복사 시작 후 내용 변경 위험이 없으므로 일관된 백업이 가능함.

결론

  • .dump + 압축 + 복원 방식은 대용량 SQLite 전송 시 속도와 안정성 모두 개선됨.
  • 특히 인덱스가 많은 DB에 효과적이며, 전송 실패나 손상 가능성을 줄일 수 있음.
  • 대용량 SQLite를 자주 다룬다면 적용할 만한 실용적인 최적화 방식임.

왜 이런 작업이 필요한지 백그라운드가 궁금하네요

원문에서는 백업 & 분석용이라곤하네요. 아마 로컬에서 duckdb 같은걸로 분석하고 싶은 것 아니었을까 싶어요.