본문 바로가기
데이터베이스2026년 10월 21일14분 읽기

DuckDB 2.0 LTS "시나몬 틸" 출시 — 서버 프로토콜 Quack·트리거 탑재, 새 DB 파일은 1.x에서 못 연다

YS
김영삼
조회 20
DuckDB 2.0 LTS "시나몬 틸" 출시 — 서버 프로토콜 Quack·트리거 탑재, 새 DB 파일은 1.x에서 못 연다

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 이전 버전에서 열리지 않으니, 여러 프로세스가 파일을 공유하는 환경이라면 업그레이드 순서를 따져야 한다.

3줄 요약
  • 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 이상이 필요하다.
약 2만
DuckDB 1.5 이후 2.0까지 들어간 커밋 수
2027.10
DuckDB 2.0 LTS 최소 지원 기한 (릴리스 캘린더상 2027-10-22)
59%
에이전트 모드가 TPC-H 실험에서 줄인 모델 판독용 출력량
약 45kB
ICU를 걷어 내고 IANA 데이터로 직접 만든 시간대 데이터 크기

무슨 일이"안정성의 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가 추가됐다.

DuckDB 2.0.0 발표문·마이그레이션 가이드 기준
영역2.0.0에서 바뀐 것
서버Quack 프로토콜 정식화, CONNECT 문, CLI -serve/-connect, PostgreSQL·MySQL 원격 푸시다운
파서PostgreSQL 파생 YACC/Bison(LALR(1)) 파서 대신 자체 PEG 파서가 기본. 확장이 문법에 직접 훅을 걸 수 있고 오류에 정확한 위치 표시
CLI에이전트 모드: 코딩 에이전트가 CLI를 돌리면 자동 감지해 간결한 마크다운 표, 잘림 표시, JSON 오류, 실행 전 비용 추정. -agent/-no-agent
확장C API v2(아직 안정판 아님), 서명 검증을 갖춘 자체 확장 저장소 CREATE EXTENSION REPOSITORY
코어 확장DuckLake 1.1, Iceberg REST 카탈로그 ATTACH 옵션 확장, Delta CREATE TABLE·시간 여행
빌드C++17 필요(기존 C++11), 릴리스 빌드 기본 컴파일러 Clang, ICU 라이브러리 제거

왜 중요한가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" 오류를 낸다.

마이그레이션 가이드에서 결과가 조용히 바뀔 수 있는 항목 위주로 추림
변경무엇이 달라지나되돌리는 법
정규식 ~, !~PostgreSQL처럼 부분 일치. 'abc' ~ 'b'가 true(이전 false)SET regex_match_operator_semantics = 'full'
팩토리얼 !결합이 강해져 2 * 3! = 12(이전 720)괄호 사용
정수 //·% 0으로 나누기NULL 대신 오류TRY(...) 또는 error_on_division_by_zero=false
화살표 람다 x -> x + 1기본 비활성, lambda x: x + 1 사용SET lambda_syntax = 'enable_single_arrow' (2.1에서 삭제)
MERGE INTO 다중 일치같은 대상 행을 두 번 이상 고치면 오류소스 중복 제거

이 가운데 정규식 연산자와 팩토리얼 우선순위는 쿼리가 에러 없이 다른 값을 돌려준다는 점에서 위험하다. 새 PEG 파서는 기존 파서와 호환되도록 설계됐다지만, 의도적으로 바꾼 이런 표현식 몇 개는 테스트 없이 지나가기 쉽다. 정 불안하면 legacy_parser 확장으로 옛 파서를 되살릴 수 있다. 타입 없는 NULL 컬럼이 INTEGER 대신 "NULL" 타입이 되는 것, S3 자격 증명을 URL 파라미터로 넘기는 방식이 기본 비활성화된 것도 확인할 항목이다. 파이썬 클라이언트는 3.11 이상을 요구하고 별도 API 변경이 있다.

영삼
영삼의 한마디
나는 사이트 로그나 통계를 Parquet로 떨궈 두고 DuckDB로 훑어보는 용도로 쓰는데, 지금까지는 "서버가 없다"는 게 장점이자 한계였다. 원격에서 보려면 결국 파일을 옮기거나 MotherDuck 같은 서비스를 써야 했다. Quack이 기본 탑재되면서 작은 서버 하나에 DuckDB를 띄워 두고 노트북에서 붙는 구성이 공식 경로가 됐다. 다만 서버를 직접 외부에 열지 말라는 공식 경고는 그대로 받아들이는 게 좋겠다. 저장 형식이 한 방향이라는 점도 있어서, 나라면 첫 패치(2.0.1)가 나올 때까지 운영 DB 파일은 건드리지 않고 새 파일로만 시험해 볼 것 같다.

개발자가 할 일섀도 환경에서 먼저, 공유 파일은 버전을 고정

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

아직 댓글이 없습니다.
Ctrl+Enter로 등록