DuckDB 파일 잠금에 막혔다면: 두 프로그램을 Quack으로 연결하기
수집기가 DuckDB에 데이터를 넣는 동안 대시보드도 같은 파일을 읽어야 하는데, 열자마자 잠금 오류가 난다. 읽기 전용으로도 안 열린다면 두 프로그램은 어떻게 함께 써야 할까?

- 별도 프로그램들이 같은 DuckDB를 읽고 쓰려면 Quack 서버에 클라이언트로 연결한다.
- 2.0에서도 쓰기 가능한 DB 파일을 여러 프로세스가 직접 여는 방식은 지원 경로가 아니다.
- 서버 연결은 파일 접근을 한곳으로 모으지만, 같은 행을 동시에 수정할 때의 트랜잭션 충돌까지 없애지는 않는다.
파일을 여는 프로세스는 하나, 사용하는 프로그램은 여럿이다
수집 프로그램이 데이터를 넣는 동안 다른 프로그램에서 같은 DuckDB를 조회하려면, 한 서버가 DB 파일을 열고 양쪽 프로그램이 그 서버로 접속하는 구조를 쓴다. DuckDB의 Quack이 제공하는 방식이다. 10월 21일 나온 DuckDB 2.0은 1.5.3에서 도입한 Quack의 성능·안정성을 개선하고, 원격 DB로 세션을 전환하는 CONNECT를 추가했다.
파일을 직접 여는 동시성 규칙은 따로 남아 있다. 인프로세스 모드에서는 한 프로세스가 읽고 쓸 수 있다. 여러 프로세스가 같은 파일을 직접 읽으려면 모두 읽기 전용이어야 한다. 수집기가 쓰기 모드로 열어 둔 파일을 대시보드에서 읽기 전용으로 열면 해결된다고 생각해서는 안 된다.
Quack을 선택했다면 대시보드뿐 아니라 수집기도 서버 연결로 옮기는 것이 핵심이다. 클라이언트가 공유하는 대상은 파일 경로가 아니라 서버 주소다.
서버가 반환한 토큰으로 접속한 뒤 CONNECT를 실행한다
다음은 공식 연결 절차를 두 로컬 세션에 적용한 예다. 첫 번째 세션은 사용할 DB 파일을 열고 서버 역할을 맡는다. 이미 같은 파일을 사용하는 프로그램이 있다면 먼저 연결을 종료해야 한다.
- 첫 번째 터미널에서
duckdb shared.duckdb로 DB를 연다. - 서버 세션에서
INSTALL quack;,LOAD quack;,CALL quack_serve();를 실행한다. 반환된 접속 주소와auth_token을 사용한다. - 다른 터미널에서는 DB 파일 경로 없이
duckdb를 시작하고 Quack 확장을 설치·로드한다. - 클라이언트에서 아래처럼 서버를 붙이고 세션을 전환한다. 토큰 자리는 서버가 반환한 실제 값으로 바꾼다.
ATTACH 'quack:localhost' AS shared_server
(TOKEN 'SERVER_RETURNED_TOKEN');
CONNECT shared_server;
SELECT current_database(); CONNECT 이후의 쿼리는 원격에서 실행되고 결과가 돌아온다. DISCONNECT;를 실행하면 클라이언트의 로컬 DB로 돌아간다. 서버를 멈출 때는 서버 세션에서 CALL quack_stop('quack:localhost');를 사용한다.
두 번째 프로그램에 shared.duckdb 경로를 다시 넘기는 실수가 가장 먼저 점검할 부분이다. 같은 컴퓨터에서 실행해도 Quack 클라이언트는 서버 주소와 인증값으로 접속한다.
혼자 쓰는 분석까지 서버로 옮길 필요는 없다
서버 도입 여부는 파일 크기보다 서로 다른 프로그램이 데이터를 함께 수정·조회해야 하는지로 판단하는 편이 적절하다. DuckDB의 Quack FAQ도 공유 읽기·쓰기, 데이터가 있는 서버에서의 연산, 원격 고성능 장비 사용을 주요 사례로 든다. 기존 인프로세스 실행은 계속 지원한다.
| 작업 상황 | 맞는 연결 구조 |
|---|---|
| 한 Python 프로그램이 데이터를 읽고 집계한다 | 기존 인프로세스 연결을 유지한다. |
| 아무도 수정하지 않는 DB를 여러 프로그램이 읽는다 | 각 프로세스를 읽기 전용으로 연결할 수 있다. |
| 수집기가 쓰는 동안 분석 도구도 조회·수정한다 | 양쪽을 Quack 서버에 연결한다. |
서버가 생겨도 같은 행의 동시 수정은 충돌할 수 있다. DuckDB는 낙관적 동시성 제어를 사용하며, 같은 행을 동시에 수정하거나 삭제하려는 트랜잭션에는 충돌 오류가 날 수 있다. 파일 열기 문제와 데이터 수정 충돌을 같은 오류로 처리하지 않아야 한다.
외부에 연결할 때는 토큰과 SQL 권한을 함께 설계한다
Quack의 기본 설정은 localhost 바인딩과 토큰 인증이다. 원격 배포에서는 localhost의 서버 앞에 TLS를 처리하는 리버스 프록시를 두는 구성을 공식 문서가 권한다. 토큰을 전달했다고 네트워크·권한 구성이 모두 끝나는 것은 아니다.
Quack은 기본적으로 서버 세션이 볼 수 있는 테이블의 읽기·쓰기와 SQL 기능을 노출한다. 대시보드에 접속 토큰을 줬다고 자동으로 읽기 전용 사용자가 되는 것은 아니다. 조회 전용 서비스라면 서버가 여는 DB의 접근 모드나 별도 인가 정책까지 맞춰야 한다.
따라서 첫 전환 작업은 ‘각 프로그램이 어느 파일을 여는가’를 ‘어느 서버에 어떤 권한으로 접속하는가’로 바꾸는 일이다. 그 구조가 맞아야 DuckDB의 로컬 분석 경험을 여러 프로그램이 공유할 수 있다.