# 컴퓨터 간 SQLite 데이터베이스를 더 빠르게 복사하는 방법

> Clean Markdown view of GeekNews topic #20659. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=20659](https://news.hada.io/topic?id=20659)
- GeekNews Markdown: [https://news.hada.io/topic/20659.md](https://news.hada.io/topic/20659.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2025-05-02T15:32:46+09:00
- Updated: 2025-05-02T15:32:46+09:00
- Original source: [alexwlchan.net](https://alexwlchan.net/2025/copying-sqlite-databases/)
- Points: 1
- Comments: 1

## Topic Body

- SQLite 데이터베이스를 컴퓨터 간에 복사하는 더 빠른 방법에 대한 설명임
- 데이터베이스의 인덱스가 복사 속도를 느리게 하는 주요 원인임
- SQLite의 `.dump` 명령어를 사용하여 데이터베이스를 텍스트 파일로 덤프할 수 있음
- 텍스트 파일은 원본 데이터베이스보다 작으며, 압축하면 더욱 작아짐
- 이 방법은 대용량 데이터베이스를 더 빠르고 안정적으로 복사할 수 있게 해줌

---

### SQLite 데이터베이스를 컴퓨터 간에 더 빠르게 복사하는 방법

- 원격 서버에 저장된 **SQLite 데이터베이스**를 로컬 컴퓨터로 복사하는 방법에 대한 설명임
- 초기 프로젝트에서는 `rsync` 명령어를 사용하여 간단히 복사할 수 있음
- 데이터베이스가 커지면 복사 속도가 느려지고 신뢰성이 떨어짐

### 데이터베이스 덤프를 텍스트 파일로 만들기

- SQLite는 `.dump` 명령어를 사용하여 데이터베이스를 텍스트 파일로 덤프할 수 있음
- 이 텍스트 파일은 SQL 문으로 구성되어 있으며, 원본 데이터베이스보다 작을 수 있음
- 인덱스는 텍스트 파일에서 단일 라인으로 줄어들어 저장 공간을 절약할 수 있음

### 압축을 통한 저장 공간 절약

- 텍스트 파일은 압축하면 더 작아짐
- 예를 들어, 원본 SQLite 데이터베이스가 3.4GB인 경우, gzip으로 압축한 텍스트 파일은 240MB로 줄어듦
- 압축된 텍스트 파일을 다운로드하면 데이터베이스 복사가 훨씬 빨라짐

### 새로운 ssh+rsync 명령어

- 서버에서 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`
- 압축 해제 및 데이터베이스 재구성 후 로컬 파일 삭제

### 데이터베이스 덤프는 안정적인 복사 소스임

- 데이터베이스 복사 중 업데이트가 발생하면 `rsync`가 잘못된 데이터베이스 파일을 생성할 수 있음
- 텍스트 덤프를 생성하여 안정적인 복사 소스를 제공함으로써 이러한 문제를 해결할 수 있음
- 이 방법은 대용량 데이터베이스 작업 시 시간을 절약하고 다운로드를 더 빠르고 신뢰성 있게 만들어 줌

## Comments



### Comment 38112

- Author: neo
- Created: 2025-05-02T15:32:47+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=43856186) 
* SQLite는 공식 도구를 제공함. 페이지 수준에서 작동하며, 복제본이 각 페이지의 암호화 해시를 원본 측에 보내고, 해시가 일치하지 않는 페이지의 전체 내용을 원본이 다시 보냄
* 실행 중인 데이터베이스 파일을 복사하면 손상될 수 있음. 안전한 복제를 위해 Litestream을 사용할 수 있음
* 데이터베이스를 컴퓨터 간에 복사하는 방법으로는 원을 보내고 나머지 부분은 무시하는 방법이 있음
  - 증분 rsync가 더 빠르지만, SQL 문을 보내는 것이 데이터베이스를 보내는 것보다 빠르다는 주장에 동의하지 않음. SQL 문을 실행하고 최적화 및 진공 작업을 수행해야 함
  - CSV 파일에서 데이터베이스를 "증분적으로 재구축"해야 하는 시나리오가 있음. 데이터베이스를 처음부터 다시 만드는 것이 더 최적이지만, 메모리 내 빈 데이터베이스에 배치 삽입을 실행하는 데만 30분이 걸림
* 최근에 출시된 sqlite_rsync 유틸리티는 SQLite 데이터베이스의 내부 구조에 최적화된 rsync 알고리즘 버전을 사용함. 내부 데이터 페이지를 효율적으로 비교하고 변경되거나 누락된 페이지만 동기화함
* 텍스트 파일로 저장하는 것은 비효율적임. VACUUM INTO를 사용하여 sqlite 데이터베이스를 저장함
  - VACUUM 명령어는 백업 API의 대안으로, 결과 백업 데이터베이스가 최소 크기여서 파일 시스템 I/O가 줄어듦
* rsync가 제공하는 압축 기능을 사용하지 않은 것이 놀라움. gzip으로 압축한 후 전송하는 것이 더 빠를 수 있음
* DuckDB에서는 Parquet로 내보내어 데이터 크기를 줄일 수 있음. 전송 및 로드 속도가 더 빠름
* SQLite는 세션 확장을 제공하여 테이블의 변경 사항을 추적하고 이전 버전의 SQLite 데이터베이스를 패치할 수 있는 변경 집합/패치 집합을 생성함
* gzip의 "--rsyncable" 옵션을 사용하여 최적화할 수 있음. 압축을 약간 줄이지만 차이점을 국지화하여 전체 압축 출력에 영향을 주지 않음
  - 덤프 출력의 압축을 건너뛰고 rsync가 이전 비압축 덤프와 현재 덤프의 차이점을 계산하도록 한 후, rsync가 네트워크를 통해 전송하는 변경 집합을 압축하도록 할 수 있음
* 2008년에 Postgres를 사용하여 여러 기계에 백업을 전송해야 했던 경험이 있음. 네트워크가 포화 상태가 되어 udpcast를 사용하여 백업을 한 번에 모든 목적지로 전송함
