DuckDB 2.0.0은 DuckDB 재단이 10월 21일(현지시간) 공개한 장기 지원(LTS) 버전으로, 클라이언트-서버 프로토콜 Quack, 비동기 I/O, 정식 VARIANT 타입, 트리거, 새 PEG 파서를 담았고 최소 2027년 10월까지 지원된다.
코드명은 북·남미 서부에 사는 오리 "시나몬 틸(Cinnamon Teal, 학명 Spatula cyanoptera)"이다. DuckDB 팀은 1.5 이후 2만 건 가까운 커밋이 들어간 "지금까지 가장 큰 기능 릴리스"라고 소개했다. 다만 새로 만든 데이터베이스 파일은 2.0 이전 버전에서 열리지 않으니, 여러 프로세스가 파일을 공유하는 환경이라면 업그레이드 순서를 따져야 한다.
- DuckDB가 서버가 된다.
quack확장과 새CONNECT문으로 원격 DuckDB에 붙고, CLI에서는-serve/-connect한 줄로 서버·클라이언트를 띄운다. 같은 문법으로 PostgreSQL·MySQL에도 붙는다. - 비동기 I/O로 S3 같은 오브젝트 스토리지 읽기가 빨라지고, VARIANT 타입이 정식화됐다. 트리거, 데이터 변경 CTE,
NEAREST조인, 코딩 에이전트용 CLI "에이전트 모드"도 들어왔다. - 2.0이 새로 만든 DB 파일(storage version 69)은 1.x에서 못 연다. 정규식
~연산자 의미, 0으로 나누기, 화살표 람다 등 결과가 조용히 바뀌는 변경도 있다. 파이썬 클라이언트는 3.11 이상이 필요하다.
무슨 일이"안정성의 1.0, 기능의 2.0"
DuckDB 팀은 발표문에서 "1.0이 안정성과 하위 호환성에 관한 것이었다면 2.0은 무엇보다 기능 릴리스"라고 정리했다. 그동안 DuckDB는 프로세스 안에 들어가는 분석용 SQLite 같은 위치였다. 노트북이나 파이썬 스크립트 안에서 Parquet·CSV를 바로 쿼리하는 용도다. 2.0에서 가장 눈에 띄는 변화는 이 "임베디드" 정체성에 서버 모드를 공식으로 얹었다는 점이다.
1.5.3에서 처음 소개된 Quack 프로토콜이 성능·안정성을 다듬어 정식으로 실렸다. 서버 쪽에서 CALL quack_serve(token = ...)을 부르면 DuckDB 프로세스가 자기 데이터베이스를 내보내고, 클라이언트는 ATTACH 'quack:호스트' AS qk (TOKEN ...) 뒤에 새 CONNECT qk 문으로 원격 DB에 붙어 세션을 그쪽으로 전환한다. CLI에는 duckdb -serve와 duckdb -connect가 생겼다.
보안 기본값은 보수적이다. 서버는 기본적으로 localhost에서만 듣는다. 다른 머신의 접속을 받으려면 서버는 localhost에 둔 채 TLS를 종료하는 리버스 프록시를 앞에 세우라는 게 공식 권고다. 서버를 직접 외부에 여는 allow_other_hostname 옵션은 "테스트용"이라고 못 박았다. CONNECT는 Quack 전용이 아니어서 PostgreSQL·MySQL에도 쓸 수 있고, 새 원격 푸시다운 옵티마이저가 테이블을 끌어오는 대신 쿼리를 원격 서버로 보낸다.
성능과 타입: 비동기 I/O, VARIANT
비동기 I/O는 Parquet·CSV와 DuckDB 자체 저장 형식 읽기에 적용된다. I/O 계층이 쿼리 처리 계층과 따로 확장되면서 백그라운드에서 여러 읽기 요청을 동시에 띄워 둔다. 팀은 s3:// 같은 오브젝트 스토리지에서 쿼리가 "극적으로 빨라진다"고 했지만 발표문에는 구체 배속 수치 없이 네트워크 처리량 그래프만 실었다.
VARIANT는 1.5에서 처음 들어왔고 2.0에서 정식 타입이 됐다. 행마다 모양이 다른 반정형 데이터를 담되 JSON처럼 텍스트로 저장하지 않는다. DuckDB가 공통 구조를 찾아 "분해(shredding)"해 저장하기 때문에 압축과 실행이 빠르고, Parquet 읽기·쓰기까지 분해된 상태로 이어진다. variant_type(), variant_keys() 같은 variant_* 함수군이 함께 생겼다.
SQL: 트리거와 문법 추가
CREATE TRIGGER가 들어왔다. BEFORE/AFTER, FOR EACH ROW/FOR EACH STATEMENT, REFERENCING OLD/NEW TABLE 전이 테이블, 이벤트당 여러 트리거, DROP TRIGGER까지 지원한다. 감사(audit) 테이블이 대표 용도이고, 팀은 INSERT·DELETE 트리거 두 개로 집계 테이블을 증분 갱신하는 예제를 보여 주며 "구체화 뷰에 한 걸음 가까워졌다"고 했다. BEFORE ... FOR EACH ROW와 UPDATE ... FOR EACH ROW 조합은 아직 안 된다.
그 밖에 getvariable('x') 대신 쓰는 $x 축약, INSERT·UPDATE·DELETE·COPY를 파이프라인 단계로 쓰는 데이터 변경 CTE, 벡터·임베딩 top-k 검색을 조인 절로 쓰는 NEAREST 조인, CREATE SCHEMA finance.reports 같은 중첩 스키마, json_set·json_insert·json_replace·json_remove, SQL 표준 FETCH FIRST가 추가됐다.
왜 중요한가LTS 줄기가 세 개, 그리고 한 방향뿐인 저장 형식
DuckDB는 1.4부터 한 버전 걸러 LTS를 내고 있고, 커뮤니티 지원 기간은 출시 후 1년이다. 그래서 지금은 지원받는 줄기가 세 개다. 이전 LTS인 1.4는 2026년 11월 17일에 지원이 끝나고, 원래 LTS가 아니던 1.5는 이전을 돕기 위해 2027년 3월까지 연장돼 사실상 LTS가 됐다. 2.0은 릴리스 캘린더 기준 2027년 10월 22일까지다. 첫 패치인 2.0.1은 11월 18일로 잡혀 있다.
업그레이드에서 가장 신경 쓸 부분은 저장 형식이다. 마이그레이션 가이드에 따르면 2.0이 새로 만드는 DB 파일은 기본으로 storage version 69를 쓰고, 2.0 이전 버전은 이 파일을 읽지 못한다. 반대 방향은 괜찮다. 2.0은 기존 파일을 읽고 쓸 수 있고, 그 파일은 원래 storage version을 유지하므로 옛 버전에서도 계속 열린다. 문제는 버전이 섞인 환경이다. 2.0 프로세스 하나가 새 파일을 만들면 나머지 1.x 프로세스는 그 파일 앞에서 "version number 69" 오류를 낸다.
이 가운데 정규식 연산자와 팩토리얼 우선순위는 쿼리가 에러 없이 다른 값을 돌려준다는 점에서 위험하다. 새 PEG 파서는 기존 파서와 호환되도록 설계됐다지만, 의도적으로 바꾼 이런 표현식 몇 개는 테스트 없이 지나가기 쉽다. 정 불안하면 legacy_parser 확장으로 옛 파서를 되살릴 수 있다. 타입 없는 NULL 컬럼이 INTEGER 대신 "NULL" 타입이 되는 것, S3 자격 증명을 URL 파라미터로 넘기는 방식이 기본 비활성화된 것도 확인할 항목이다. 파이썬 클라이언트는 3.11 이상을 요구하고 별도 API 변경이 있다.
개발자가 할 일섀도 환경에서 먼저, 공유 파일은 버전을 고정
DuckDB 팀의 권고는 명확하다. 기존 워크로드를 따라가는 섀도 시스템을 만들어 2.0.0을 먼저 돌려 보고, 미션 크리티컬 워크로드라면 11월 첫 패치까지 기다리는 것도 방법이다. 출시 시점에 CLI와 파이썬 클라이언트는 바로 나왔고, R·러스트 등 다른 클라이언트와 일부 확장은 며칠 늦게 나올 수 있다고 했다.
# 파이썬 (3.11 이상)
pip install -U duckdb # 2.0.0
# 옛 버전도 읽어야 하는 파일은 저장 버전을 명시해서 생성
duckdb my.db -storage-version v1.5.6 -c "CREATE TABLE t (x INT);"
# SQL에서는 storage_compatibility_version 설정이나 ATTACH ... (STORAGE_VERSION ...) 사용
# 기존 DB를 2.0 형식으로 옮기기: 옛 버전으로 내보내고 새 버전으로 가져오기
/older/duckdb mydata.old.db -c "EXPORT DATABASE 'tmp'"
/newer/duckdb mydata.new.db -c "IMPORT DATABASE 'tmp'"
- DB 파일을 여러 프로세스·서비스가 공유한다면, 그 파일을 만지는 모든 프로세스를 같은 버전으로 올리기 전까지 2.0이 새 파일을 만들지 않게 하거나
-storage-version으로 옛 형식을 지정한다. - 쿼리에서
~정규식,!팩토리얼,//·%,x ->람다, 다중 일치MERGE를 찾아 결과를 비교한다. - macOS 인텔(
osx_amd64) 환경이면 커뮤니티 확장이 더는 빌드되지 않고, 2.1에서 지원이 끊긴다는 점을 감안한다.
앞으로2.0.1은 11월, 2.1에서 정리될 것들
릴리스 캘린더에는 2.0.1이 11월 18일로 잡혀 있다(일정은 잠정). 2.1에서는 화살표 람다 문법과 이를 되살리는 플래그가 완전히 사라지고, macOS x86_64 지원도 끝난다. 단일 헤더·단일 소스로 묶는 amalgamation 빌드는 "너무 커져 대부분의 경우 실용적이지 않다"는 이유로 이번에 폐기 예정이 됐다. C API v2와 확장 저장소 문법은 아직 바뀔 수 있다고 명시돼 있어, 확장을 직접 만드는 쪽은 다음 버전까지 지켜봐야 한다.
작은 차이 하나. 블로그 발표문의 코드명은 "Cinnamon Teal"인데, 같은 날 올라온 GitHub 릴리스 노트는 학명을 딴 "Cyanoptera"로 적었다. 같은 오리를 가리키는 이름이라 실무에 영향은 없다.
자주 묻는 질문
DuckDB 2.0이란?
DuckDB 2.0.0은 2026년 10월 21일 나온 DuckDB의 장기 지원(LTS) 버전이다. Quack 클라이언트-서버 프로토콜과 CONNECT 문, 비동기 I/O, 정식 VARIANT 타입, 트리거, PEG 파서가 핵심이며 최소 2027년 10월까지 지원된다.
DuckDB 2.0 데이터베이스 파일을 1.5에서 열 수 있나?
열 수 없다. 2.0이 새로 만든 파일은 storage version 69를 쓰고, 예컨대 1.5.6은 64~68 버전까지만 읽는다. 옛 버전과 공유해야 하면 -storage-version v1.5.6 같은 옵션이나 storage_compatibility_version 설정으로 옛 형식으로 만들면 된다.
DuckDB 2.0으로 업그레이드하려면?
파이썬은 3.11 이상에서 pip install -U duckdb로 올리고, CLI는 공식 설치 페이지에서 받는다. 공식 권고는 섀도 환경에서 먼저 시험하고, 중요한 워크로드라면 11월 첫 패치 릴리스를 기다리는 것이다.
DuckDB 1.4 LTS 지원은 언제 끝나나?
DuckDB 1.4 LTS는 2026년 11월 17일에 지원이 끝난다. 1.5는 원래 LTS가 아니었지만 2.0 이전을 돕기 위해 2027년 3월까지 연장됐다.
DuckDB Quack 서버를 외부에 열어도 되나?
직접 여는 건 권장되지 않는다. 서버는 기본으로 localhost에서만 듣고, 공식 문서는 TLS를 종료하는 리버스 프록시 뒤에 두라고 한다. 서버를 바로 노출하는 allow_other_hostname 옵션은 테스트용이다.

댓글 0