dolthub/dolt
요약
Dolt는 Git의 버전 관리 기능(fork, clone, branch, merge 등)을 SQL 데이터베이스에 결합한 혁신적인 도구입니다. 테이블 단위의 버전 관리를 지원하며, 에이전트 메모리 및 멀티 에이전트 워크플로우 확장에 최적화되어 있습니다.
핵심 포인트
- Git과 동일한 명령어로 SQL 테이블 버전 관리 가능
- MySQL 호환 및 Postgres 기반의 Doltgres 베타 제공
- 에이전트 메모리 및 멀티 에이전트 워크플로우에 최적화
- DoltHub를 통한 데이터 공유 및 호스팅 서비스 지원
Dolt는 Git 저장소처럼 fork, clone, branch, merge, push, pull을 할 수 있는 SQL 데이터베이스입니다.
MySQL 데이터베이스와 마찬가지로 Dolt에 연결하여 스키마(schema)와 데이터를 읽거나 수정할 수 있습니다. 버전 관리(Version control) 기능은 시스템 테이블, 함수 및 프로시저를 통해 SQL로 제공됩니다.
또는, Git과 유사한 명령줄 인터페이스(CLI)를 사용하여 CSV 파일을 가져오고, 변경 사항을 커밋(commit)하고, 원격 저장소에 푸시(push)하거나, 팀원의 변경 사항을 병합(merge)할 수 있습니다. 여러분이 Git에서 알고 있는 모든 명령어가 Dolt에서도 정확히 동일하게 작동합니다.
Git은 파일을 버전 관리합니다. Dolt는 테이블을 버전 관리합니다. 마치 Git과 MySQL이 결합하여 탄생한 것과 같습니다.
또한 저희는 Dolt 데이터베이스를 공유할 수 있는 공간인 DoltHub를 구축했습니다. 저희는 공개 데이터를 무료로 호스팅합니다. 만약 본인만의 DoltHub를 호스팅하고 싶다면 DoltLab이 있습니다. 저희가 대신 Dolt 서버를 운영해주길 원하신다면 Hosted Dolt가 있습니다.
MySQL 대신 Postgres를 선호하시나요? 현재 베타(Beta) 버전으로 출시된 Doltgres를 사용해 보세요.
Discord에 참여하여 인사하거나 질문을 남겨주세요. 또는 로드맵(roadmap)을 확인하여 저희가 다음에 무엇을 만들고 있는지 살펴보세요.
정말 많은 것들이 있습니다! Dolt는 수많은 응용 분야를 가진 일반적으로 유용한 도구입니다. 아이디어가 필요하시다면, 사람들이 지금까지 어떻게 사용하고 있는지 알려드리겠습니다.
Dolt는 Beads와 Gas Town의 기반이 됩니다. 에이전트 메모리(agent memory)를 위한 최고의 데이터베이스이며, 특히 멀티 에이전트(multi-agent) 및 멀티 머신(multi-machine) 워크플로우로 확장할 때 더욱 빛을 발합니다.
dolt CLI는 몇 가지 추가 기능을 제외하면 git과 동일한 명령어를 가집니다.
$ dolt
Valid commands for dolt are
init - Create an empty Dolt data repository.
...
Dolt는 약 103MB 크기의 단일 프로그램입니다.
dolt $ du -h /Users/timsehn/go/bin/dolt
103M /Users/timsehn/go/bin/dolt
설치하기가 매우 쉽습니다. 다운로드하여 PATH에 넣기만 하면 됩니다.
대부분의 플랫폼에서 이를 더욱 쉽게 만들 수 있는 여러 가지 방법을 제공합니다.
Linux 또는 Mac 기반 시스템에 설치하려면 터미널에서 다음 명령어를 실행하세요:
sudo bash -c 'curl -L https://github.com/dolthub/dolt/releases/latest/download/install.sh | bash'
이렇게 하면 최신 dolt 릴리스를 다운로드하여 /usr/local/bin/에 저장하며, 이 경로는 아마도 여러분의 $PATH에 포함되어 있을 것입니다.
설치 스크립트는 dolt를 /usr/local/bin에 넣기 위해 sudo 권한이 필요합니다. 만약 루트 (root) 권한이 없거나 해당 권한으로 스크립트를 실행하는 것이 불편하다면, 최신 릴리스 (release)에서 사용 중인 플랫폼에 맞는 dolt 바이너리 (binary)를 다운로드하여 압축을 풀고, $PATH 내의 적절한 위치에 바이너리를 배치할 수 있습니다.
Dolt는 Arch Linux의 공식 저장소 (official repositories)에 패키징되어 있습니다.
pacman -S dolt
Dolt는 Homebrew에 등록되어 있으며, 매 릴리스마다 업데이트됩니다.
brew install dolt
macOS의 경우, MacPorts를 통해 커뮤니티에서 관리하는 포트 (port)로 Dolt를 설치할 수도 있습니다:
sudo port install dolt
releases에서 최신 Microsoft Installer (.msi 파일)를 다운로드하여 실행하세요.
Windows에서 실행하는 방법에 대한 정보는 여기를 참조하세요.
Chocolatey를 사용하여 dolt를 설치할 수 있습니다:
choco install dolt
Dolt를 위한 다음과 같은 공식 Docker 이미지 (Docker images)들이 있습니다:
dolthub/dolt: Dolt를 CLI 도구로 실행할 때 사용합니다.
dolthub/dolt-sql-server: Dolt를 서버 모드 (server mode)로 실행할 때 사용합니다.
Go가 설치되어 있는지, 그리고 go가 여러분의 path에 포함되어 있는지 확인하세요. Dolt는 cgo에 의존성이 있으므로, 작동 가능한 C 컴파일러 (C compiler)와 툴체인 (toolchain)도 필요합니다.
이 저장소 (repository)를 클론 (clone)하고 go 디렉토리로 이동하세요. 그런 다음 다음 명령어를 실행합니다:
go install ./cmd/dolt
출력물은 $GOPATH/bin에 저장되며, 기본값은 ~/go/bin입니다. 빌드 결과를 테스트하려면 다음을 시도해 보세요:
~/go/bin/dolt version
터미널에서 dolt를 실행하여 설치가 성공했는지 확인하세요.
$ dolt
Valid commands for dolt are
[...]
커밋 (commit)을 생성하는 데 필요한 사용자 이름과 이메일로 dolt를 설정하세요. 명령어는 git과 완전히 동일하게 작동합니다.
$ dolt config --global --add user.email YOU@DOMAIN.COM
$ dolt config --global --add user.name "YOUR NAME"
Dolt는 데이터베이스를 저장할 공간이 필요합니다. 저는 데이터베이스를 ~/dolt에 두겠습니다.
% cd ~
% mkdir dolt
% cd dolt
생성하는 모든 데이터베이스는 이 디렉토리에 저장됩니다. 따라서 이 예제에서는 create database getting_started를 실행하면 여기에 getting_started라는 이름의 디렉토리가 생성될 것입니다.
~/dolt/getting_started로 이동하면 Dolt 명령줄 인터페이스 (CLI)를 사용하여 이 데이터베이스에 접속할 수 있습니다.
참고: 이 예제에서 getting_started 디렉토리는 '스키마 생성 (Create a schema)' 섹션의 SQL 셸에서 create database getting_started;를 실행한 후에 생성됩니다. 아직은 디렉토리를 만들고 그곳으로 이동하는 것 외에 다른 작업은 하지 마세요.
Dolt에는 MySQL 호환 데이터베이스 서버가 내장되어 있습니다. 이를 시작하려면 dolt sql-server 명령어를 사용합니다. 이 명령을 실행하면 3306 포트에서 서버가 시작됩니다.
dolt sql-server
Starting server with Config HP="localhost:3306"|T="28800000"|R="false"|L="info"
터미널이 그대로 멈춰 있는 것처럼 보일 것입니다. 이는 서버가 실행 중임을 의미합니다. 모든 오류는 이 터미널에 출력됩니다. 이 터미널은 그대로 두고 새 터미널을 여세요.
새 터미널에서 이제 클라이언트를 사용하여 실행 중인 데이터베이스 서버에 연결하겠습니다. Dolt에는 MySQL 호환 클라이언트도 포함되어 있습니다.
% dolt -u root -p "" sql
# Welcome to the Dolt MySQL client.
# Statements must be terminated with ';'.
...
dolt sql-server를 실행했던 다른 터미널을 보면 다음과 같은 로그 라인이 나타납니다.
2022-06-06T13:14:32-07:00 INFO [conn 1] NewConnection {DisableClientMultiStatements=false}
연결되었습니다!
이 기회에 MySQL 복사본을 가져와서 해당 클라이언트로 연결해 보겠습니다. MySQL 시작하기 (Getting Started) 문서를 참조하여 기기에 MySQL을 설치하세요. 저는 Mac에 MySQL을 설치하기 위해 Homebrew를 사용했습니다: brew install mysql@8.4. 또는 brew install mysql-client@8.4를 실행하여 클라이언트 구성 요소만 설치할 수도 있습니다.
참고: 반드시 MySQL 8.4 릴리스를 설치해야 합니다. MySQL 8.4는 현재 장기 지원 (LTS, Long Term Support) 릴리스로, 이는 안정적이고 지원되는 버전임을 의미합니다. MySQL 9.0도 사용할 수 있지만, 이는 "혁신 (innovation)" 릴리스로, 더 최신의 변경 사항과 기능들을 포함하고 있으나 LTS 릴리스만큼 안정적이지 않을 수 있습니다. 9.0 릴리스는 인증 지원 방식을 변경하며, 기본적으로 Dolt SQL 서버에 연결할 수 없습니다. Homebrew를 통해 brew install mysql@8.4를 실행하여 MySQL 8.4를 설치할 수 있습니다. 만약 MySQL 9.0을 사용하고자 한다면, caching_sha2_password 인증을 위해 Dolt를 구성하는 방법에 관한 당사의 포스트를 읽어보시기 바랍니다.
MySQL은 mysqld라고 불리는 MySQL 서버와 mysql이라고 불리는 MySQL 클라이언트를 함께 제공합니다. 여러분에게 필요한 것은 클라이언트뿐입니다. MySQL 문서의 지침을 따른 후, 여러분의 경로(path)에 mysql 클라이언트가 있는지 확인하십시오:
% mysql --version
mysql Ver 8.0.29 for macos12.2 on x86_64 (Homebrew)
이제 mysql 클라이언트를 Dolt에 연결하기 위해, 호스트(host)와 포트(port)를 전달하여 MySQL 클라이언트가 TCP 인터페이스를 통하도록 강제할 것입니다. 기본값은 Dolt가 지원하는 소켓(socket) 인터페이스이지만, 이는 localhost에서만 사용할 수 있습니다. 따라서 TCP 인터페이스를 사용하는 방법을 보여주는 것이 더 좋습니다. 또한 MySQL 클라이언트는 사용자를 지정해야 하며, 이 경우에는 root를 사용합니다.
% mysql --host 127.0.0.1 --port 3306 -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
...
다시 한번, 클라이언트가 실제로 연결되었는지 확인하려면 dolt sql-server 터미널에서 다음 내용을 확인해야 합니다:
2022-06-06T13:26:55-07:00 INFO [conn 2] NewConnection {DisableClientMultiStatements=false}
보시다시피, Dolt는 모든 MySQL 호환 클라이언트를 지원합니다. Dolt에는 클라이언트가 포함되어 있지만, MySQL과 함께 제공되는 것과 같은 어떤 MySQL 클라이언트든 사용할 수 있습니다.
이제 실제로 흥미로운 작업을 할 준비가 되었습니다. 저는 mysql 클라이언트에 머무르며 getting_started라는 이름의 데이터베이스를 생성하기 위해 다음 SQL 문들을 실행하겠습니다.
getting_started 데이터베이스에는 employees, teams, employees_teams 세 개의 테이블이 생성됩니다.
mysql> create database getting_started;
Query OK, 1 row affected (0.04 sec)
mysql> use getting_started;
...
Dolt는 외래 키 (Foreign Keys), 보조 인덱스 (Secondary Indexes), 트리거 (Triggers), 체크 제약 조건 (Check Constraints), 그리고 저장 프로시저 (Stored Procedures)를 지원합니다. 이는 현대적이고 기능이 풍부한 SQL 데이터베이스입니다.
이제 첫 번째 Dolt 기능을 사용할 차례입니다. Dolt 커밋 (Dolt commit)을 생성해 보겠습니다. Dolt 커밋을 사용하면 타임 트래블 (Time travel)을 통해 계보 (Lineage)를 확인할 수 있습니다. 이 시점으로 복구하거나 비교하고 싶을 때마다 언제든지 Dolt 커밋을 만드세요.
Dolt는 Git 스타일의 인터페이스를 통해 버전 관리 (Version Control) 기능을 제공합니다. 커맨드 라인 (Command Line)에서 Dolt 명령어는 대상이 파일 대신 테이블이라는 점을 제외하면 Git의 대응 명령어와 정확히 일치합니다. SQL에서는 Dolt가 버전 관리 읽기 작업을 시스템 테이블 (System Tables)로, 버전 관리 쓰기 작업을 저장 프로시저 (Stored Procedures)로 노출합니다.
시스템 테이블과 저장 프로시저의 명명 규칙은 dolt_<command> 패턴을 따릅니다. 따라서 CLI에서의 dolt add는 저장 프로시저로서 dolt_add가 됩니다. 옵션을 전달하는 방식 또한 커맨드 라인 모델을 따릅니다. 예를 들어, 추가할 테이블을 지정하려면 dolt_add 프로시저의 옵션으로 테이블 이름을 전달하면 됩니다. dolt_commit 명령어에 메시지를 보내는 것과 같은 명명된 인자 (Named arguments)의 경우, ('-m', 'This is a message')와 같이 두 개의 인자를 순차적으로 사용합니다. Git을 알고 있다면, 버전 관리 프로시저와 시스템 테이블이 익숙하게 느껴질 것입니다.
이제 다음과 같이 새로운 스키마 (Schema)를 추가하고 커밋합니다.
mysql> call dolt_add('teams', 'employees', 'employees_teams');
+--------+
| status |
...
완료되었습니다. 스키마가 생성되었으며, dolt_log 시스템 테이블에서 볼 수 있듯이 생성을 추적하는 Dolt 커밋이 생성되었습니다.
참고로, Dolt 커밋은 표준 SQL 트랜잭션 (Transaction)인 COMMIT과는 다릅니다. 이 경우, 저는 AUTOCOMMIT이 켜진 상태로 데이터베이스를 실행하고 있으므로, 각 SQL 문은 자동으로 트랜잭션 COMMIT을 생성합니다.
. 만약 모든 트랜잭션에 대해 시스템이 Dolt 커밋을 생성하기를 원한다면, 시스템 변수인 @@dolt_transaction_commit을 사용하세요.
.
이제, 이곳 DoltHub의 직원 몇 명을 데이터베이스에 채워 넣겠습니다. 그런 다음, 직원들을 엔지니어링(engineering) 팀과 영업(sales) 팀이라는 두 개의 팀에 배정할 것입니다. 스타트업의 CEO는 여러 역할을 수행하므로 여러 팀에 배정될 것입니다.
mysql> insert into employees values
(0, 'Sehn', 'Tim'),
(1, 'Hendriks', 'Brian'),
...
앗, 제약 조건(constraint)을 위반했습니다. 직원(employees) 테이블보다 팀(teams) 테이블을 먼저 생성한 것 같군요. 데이터를 삽입할 때는 자연스러운 순서에 의존하지 말고 항상 컬럼(column)을 명시해야 합니다. 제 잘못입니다! Dolt는 데이터 무결성(data integrity)을 보장하기 위해 현대적인 SQL 관계형 데이터베이스(relational database)의 모든 강력한 기능을 갖추고 있습니다.
mysql> insert into employees_teams(employee_id, team_id) values
(0,0),
(1,0),
...
모든 데이터가 올바르게 삽입된 것 같습니다. 세 개의 테이블을 JOIN하여 엔지니어링 팀의 멤버 목록을 확인할 수 있었습니다.
.
Dolt는 최대 12개의 테이블 JOIN을 지원합니다. 다시 한번 말씀드리지만, Dolt는 Git 스타일의 버전 관리(version control)와 결합된 현대적인 SQL 관계형 데이터베이스입니다.
그렇다면, 커밋(commit)을 하기 전에 작업 세트(working set)에서 무엇이 변경되었는지 확인하고 싶다면 어떻게 해야 할까요? dolt_status와 dolt_diff_<tablename> 시스템 테이블을 사용하면 됩니다.
mysql> select * from dolt_status;
+-----------------+--------+----------+
| table_name | staged | status |
...
차이점(diff)에서 볼 수 있듯이, employees 테이블에 올바른 값들을 추가했습니다. 이전 값들은 NULL이었으나 이제 데이터가 채워졌습니다.
이번에는 -am 옵션을 사용하여 영향을 받은 모든 테이블을 추가하는 또 다른 Dolt 커밋으로 마무리하겠습니다.
mysql> call dolt_commit('-am', 'Populated tables with data');
+----------------------------------+
| hash |
...
dolt_log를 사용하여 로그를 검사할 수 있으며, 범위가 지정되지 않은(unscoped) dolt_diff를 사용하여 각 커밋에서 어떤 테이블이 변경되었는지 확인할 수 있습니다. 범위가 지정되지 않은 dolt_diff는 해당 커밋에서 특정 테이블의 스키마(schema), 데이터(data), 또는 둘 다 변경되었는지 알려줍니다.
mysql> select * from dolt_log;
+----------------------------------+-----------+-----------------+-------------------------+----------------------------+
| commit_hash | committer | email | date | message |
...
Dolt는 call dolt_reset()을 통해 변경 사항을 되돌리는 것을 지원합니다.
제가 실수로 테이블을 삭제(drop)했다고 가정해 봅시다.
mysql> drop table employees_teams;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
...
전통적인 데이터베이스(traditional database)에서 이는 재앙이 될 수 있습니다. 하지만 Dolt에서는 명령어 하나만으로 테이블을 다시 복구할 수 있습니다.
mysql> call dolt_reset('--hard');
+--------+
| status |
...
Dolt는 데이터베이스 운영 시 오류가 발생할 가능성을 줄여줍니다. 진행 중인 변경 사항을 언제든지 취소하거나, 이미 알고 있는 안정적인 상태(known good state)로 되돌릴 수 있습니다. 또한 dolt_revert()를 사용하여 특정 커밋(commit)을 되돌리는 기능도 갖추고 있습니다. 심지어 잘못된 데이터베이스에서 실수로 drop database를 실행하더라도, Dolt는 dolt_undrop() 저장 프로시저(stored procedure)를 호출함으로써 이를 되돌릴 수 있게 해줍니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub Trending Go (weekly)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기