- 큰 SQLite 데이터베이스를 원격 서버에서 로컬로 옮길 때 원본
.db대신 gzip 압축 SQL 덤프를 복사하면 전송량이 크게 줄어듦 - 파일이 커지는 주요 원인은 인덱스이며, 쿼리를 빠르게 하려고 테이블 데이터를 중복 저장해 디스크 사용량을 늘림
- SQLite의
.dump는 데이터베이스를 SQL 문장 텍스트로 만들고, 인덱스는 실제 데이터가 아니라CREATE INDEX한 줄로 표현해 중복 전송을 피함 - 예시 데이터베이스는 원본 3.4GB, 덤프 텍스트 1.3GB, gzip 압축본 240MB였고 압축 덤프가 원본보다 14배 작았음
- 복사 전에 덤프 파일을 고정해 두면 전송 중 원본이 바뀌어
database disk image is malformed오류가 나는 상황을 줄일 수 있음
SQLite 덤프를 압축해 복사하기
- 작은 SQLite 데이터베이스는
rsync로 직접 복사해도 충분함- 예시:
rsync --progress username@server:my_remote_database.db my_local_database.db
- 예시:
- 데이터베이스가 커지면 직접 복사는 느리고 불안정해질 수 있음
- 250MB 데이터베이스를 가정용 인터넷으로 웹 서버에서 내려받는 데 약 1분이 걸림
- 여러 GB 크기의 데이터베이스에서는 대기 시간이 더 커짐
- 크기 증가의 병목은 인덱스에 있음
- 인덱스는 쿼리 속도를 크게 높이지만 데이터베이스 파일도 키움
- 한 데이터베이스에서는 특정 인덱스 하나가 디스크 크기의 절반을 차지함
- 인덱스는 고유 데이터를 담기보다 다른 테이블 데이터를 중복해 조회를 빠르게 함
- SQLite는 데이터베이스 전체를 텍스트 파일로 덤프할 수 있음
- 명령:
sqlite3 my_database.db .dump > my_database.db.txt - 결과 파일은
CREATE TABLE,INSERT INTO,CREATE INDEX같은 SQL 문장으로 구성됨 - 인덱스는 실제 인덱스 데이터가 아니라
CREATE INDEX [idx_photo_locations] ON [photos] ([longitude], [latitude]);같은 생성 명령으로 저장됨
- 명령:
- 덤프 파일은 다시 SQLite 데이터베이스로 복원 가능함
- 명령:
cat my_database.db.txt | sqlite3 my_reconstructed_database.db
- 명령:
- SQL 덤프는 반복이 많아 gzip 압축 효율이 높음
- 예시:
sqlite3 explorer.db .dump | gzip -c > explorer.db.txt.gz - 크기 비교:
- 원본 SQLite 데이터베이스: 3.4GB
- 텍스트 덤프: 1.3GB
- gzip 압축 텍스트: 240MB
- gzip 압축본은 원본 SQLite 데이터베이스보다 14배 작았음
- 예시:
실제 절차와 안정성 효과
- 새 방식은 원격 서버에서 압축 덤프를 만들고, 그 파일만 내려받은 뒤 로컬에서 데이터베이스를 재구성함
- 복사 절차는 다음과 같음
- 서버에서 gzip 압축 텍스트 파일 생성:
ssh username@server "sqlite3 my_remote_database.db .dump | gzip -c > my_remote_database.db.txt.gz" - 로컬로 복사:
rsync --progress username@server:my_remote_database.db.txt.gz my_local_database.db.txt.gz - 서버의 임시 압축 파일 삭제:
ssh username@server "rm my_remote_database.db.txt.gz" - 로컬 압축 해제:
gunzip my_local_database.db.txt.gz - 로컬 데이터베이스 재구성:
cat my_local_database.db.txt | sqlite3 my_local_database.db - 로컬 텍스트 파일 삭제:
rm my_local_database.db.txt
- 서버에서 gzip 압축 텍스트 파일 생성:
- 압축 덤프는 일관된 복사 원본 역할을 함
- 큰 데이터베이스를 오래 복사하는 동안 원본이 갱신되면, 결과 파일의 앞부분은 갱신 전이고 뒷부분은 갱신 후인 상태가 될 수 있음
- 이런 파일은 로컬에서 열 때
database disk image is malformed오류를 낼 수 있음
- 복사 전에 텍스트 덤프를 만들면
rsync가 전송하는 파일이 중간에 바뀌지 않음- 완전하고 일관된 텍스트 파일을 복사할 가능성이 높아짐
- 큰 SQLite 데이터베이스를 자주 옮긴다면 이 방식으로 다운로드 시간을 줄이고 복사 신뢰도를 높일 수 있음