Databend is an open-source alternative to Snowflake that runs elastic SQL analytics and vector search directly on your own cloud object storage.
Databend is an analytical data warehouse written in Rust that separates compute processing from object storage. Its vectorized engine executes SQL queries directly against datasets stored in Amazon S3, Google Cloud Storage, or Azure Blob without proprietary micro-partitions. For engineering teams maintaining analytics pipelines, it provides an elastic query layer that mirrors Snowflake SQL dialect patterns while running in local containers or across Kubernetes clusters.
Snowflake decouples storage and compute, but it confines data to proprietary micro-partitions and bills queries through hosted virtual warehouses. That architecture locks data into a commercial platform and makes local development awkward. Databend keeps data ownership with the user by writing standard Parquet files into your own object storage buckets. Rather than consuming cloud credits for routine pipeline checks, developers can run Databend inside a container or through Python bindings to validate transformations locally before deploying them.
The workflow difference centers on maintenance and dialect familiarity. Databend implements close syntax parity with Snowflake, supporting staging constructs, COPY INTO ingestion pipelines, and semi-structured variant queries. This alignment eases the transition for existing dbt models. The tradeoff is operational responsibility: Snowflake manages tuning, cluster sizing, and metadata automatically, whereas self-hosting Databend requires platform engineers to oversee query nodes, monitor Raft metadata quorum, and schedule background compaction.
Can Databend query existing files in Amazon S3? Yes. Databend can read external stages directly or load Parquet, CSV, and JSON files from S3 buckets using standard SQL statements.
Databend vs Snowflake — what is the migration effort? Most standard analytical queries and COPY INTO pipelines migrate with minimal adjustments due to syntax parity, though custom stored procedures require reconfiguration.
Can Databend run in CI pipelines for unit testing? Yes. Developers can spin up lightweight containers or use local Python driver bindings to run tests entirely on temporary runners without network dependencies.
Databend is a practical choice for teams seeking elastic, Snowflake-compatible analytics on their own object storage without commercial platform lock-in; it is less suited for organizations unwilling to manage metadata nodes and file compaction. Active maintenance with frequent releases alongside an open-source foundation makes it a dependable lakehouse engine for teams ready to run their own compute.
We started this exact setup from scratch in a clean Linux machine on Nov 2, 2026 and checked it through Databend's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p databend && cd databend
curl -fsSL https://open-source.store/tools/databend/compose.yml -o compose.ymlcat > .env <<EOF
QUERY_DEFAULT_USER=databend
QUERY_DEFAULT_PASSWORD=$(openssl rand -hex 12)
EOFQUERY_DEFAULT_USER — Default username for Databend database authentication.QUERY_DEFAULT_PASSWORD — Password for the Databend default user. Generated above; keep it secret.docker compose up -dservices:
databend:
image: datafuselabs/databend:v1.2.881
ports:
- "8000:8000"
environment:
QUERY_DEFAULT_USER: ${QUERY_DEFAULT_USER}
QUERY_DEFAULT_PASSWORD: ${QUERY_DEFAULT_PASSWORD}
QUERY_STORAGE_TYPE: fs
volumes:
- databend-data:/var/lib/databend
- databend-logs:/var/log/databend
restart: always
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:8000/health || exit 1"]
interval: 5s
timeout: 5s
retries: 10
volumes:
databend-data:
databend-logs:
Go, gRPC and Protobuf done right, LLM agents in production, and the hard parts of shipping a first product.
Show that Databend is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 163 s: datafuselabs/databend:v1.2.881.
Based on the upstream setup. Official all-in-one Databend Docker image. Image pinned to v1.2.881; user credentials configured via .env; local filesystem storage used; HTTP query handler port 8000 exposed.
databend-1 | 2026-11-02T07:15:42.254461211Z ==> QUERY_CONFIG_FILE is not set, using default: /etc/databend/query.toml
databend-1 | 2026-11-02T07:15:43.265276919Z ==> /tmp/std-meta.log <==
databend-1 | 2026-11-02T07:15:43.265298336Z Databend Metasrv
databend-1 | 2026-11-02T07:15:43.265301503Z
databend-1 | 2026-11-02T07:15:43.265303211Z Version: v1.2.881-ca29960f5c-simd(1.94.0-nightly-2026-04-17T02:30:29.281093406Z)
databend-1 | 2026-11-02T07:15:43.265304836Z Working DataVersion: V004(2024-11-11: WAL based raft-log)
databend-1 | 2026-11-02T07:15:43.265306253Z
databend-1 | 2026-11-02T07:15:43.265307461Z Raft Feature set:
databend-1 | 2026-11-02T07:15:43.265308711Z Server Provide: { append:v0, install_snapshot:v3, install_snapshot:v4, vote:v0, vote:v1 }
databend-1 | 2026-11-02T07:15:43.265310086Z Client Require: { append:v0, install_snapshot:v3, vote:v0 }
databend-1 | 2026-11-02T07:15:43.265311419Z
databend-1 | 2026-11-02T07:15:43.265312628Z Disk Data: V003(2024-06-27: Store snapshot in rotbl); Upgrading: None
databend-1 | 2026-11-02T07:15:43.265314003Z Dir: /var/lib/databend/meta
databend-1 | 2026-11-02T07:15:43.265315253Z
databend-1 | 2026-11-02T07:15:43.265316503Z Log File: enabled=true, level='Warn,databend_=Info,openraft=Info', dir=/var/log/databend, format=json, limit=48, max_file_size=4294967296
databend-1 | 2026-11-02T07:15:43.265318086Z Stderr: enabled=false, level=WARN, format=text
databend-1 | 2026-11-02T07:15:43.265319586Z Raft Id: 0; Cluster: foo_cluster
databend-1 | 2026-11-02T07:15:43.265320919Z Dir: /var/lib/databend/meta
databend-1 | 2026-11-02T07:15:43.265322128Z Status: single
databend-1 | 2026-11-02T07:15:43.265323378Z
databend-1 | 2026-11-02T07:15:43.265324503Z HTTP API listen at: 127.0.0.1:28002
databend-1 | 2026-11-02T07:15:43.265325753Z gRPC API listen at: 127.0.0.1:9191 advertise: -
databend-1 | 2026-11-02T07:15:43.265327044Z Raft API listen at: 127.0.0.1:28004 advertise: 417f6fb7d53e:28004
databend-1 | 2026-11-02T07:15:43.265328336Z Raft API max message: 32MB
databend-1 | 2026-11-02T07:15:43.265329586Z
databend-1 | 2026-11-02T07:15:43.265330711Z Upgrade ondisk data if out of date: V003
databend-1 | 2026-11-02T07:15:43.265331961Z Find and clean previous unfinished upgrading
databend-1 | 2026-11-02T07:15:43.265333253Z Upgrade on-disk data
databend-1 | 2026-11-02T07:15:43.265334461Z From: V003(2024-06-27: Store snapshot in rotbl)
databend-1 | 2026-11-02T07:15:43.265335669Z To: V004(2024-11-11: WAL based raft-log)
databend-1 | 2026-11-02T07:15:43.265336919Z Upgrade V003 raft log in sled db to V004
databend-1 | 2026-11-02T07:15:43.265338128Z Clean upgrading: V003 -> V004 (cleaning)
databend-1 | 2026-11-02T07:15:43.265339544Z Remove V003 log from sled db
databend-1 | 2026-11-02T07:15:43.265340753Z Removing sled tree: header
databend-1 | 2026-11-02T07:15:43.265342003Z Removing sled tree: raft_log
databend-1 | 2026-11-02T07:15:43.265343253Z Removing sled tree: raft_state
databend-1 | 2026-11-02T07:15:43.265344503Z Done: Remove V003 log from sled db
databend-1 | 2026-11-02T07:15:43.265363253Z Removing: /var/lib/databend/meta/heap
databend-1 | 2026-11-02T07:15:43.265365461Z Removing: /var/lib/databend/meta/db
databend-1 | 2026-11-02T07:15:43.265366628Z Removing: /var/lib/databend/meta/conf
databend-1 | 2026-11-02T07:15:43.265367711Z Removing: /var/lib/databend/meta/DO_NOT_USE_THIS_DIRECTORY_FOR_ANYTHING
databend-1 | 2026-11-02T07:15:43.265368878Z Finished upgrading: V004
databend-1 | 2026-11-02T07:15:43.265369919Z Upgrade ondisk data finished: V004
databend-1 | 2026-11-02T07:15:43.265371003Z Wait for 180s for active leader...
databend-1 | 2026-11-02T07:15:43.265372044Z Leader Id: 0
databend-1 | 2026-11-02T07:15:43.265373086Z Metrics: id=0, Leader, term=1, last_log=Some(3), last_applied=Some(T1-N0.3), membership={log_id:Some(T1-N0.3), {voters:[{0:EmptyNode}], learners:[]}}
databend-1 | 2026-11-02T07:15:43.265374378Z
databend-1 | 2026-11-02T07:15:43.265375336Z Register this node: {id=0 raft=417f6fb7d53e:28004 grpc=}
databend-1 | 2026-11-02T07:15:43.265376419Z
databend-1 | 2026-11-02T07:15:43.265377336Z Register-node: Ok
databend-1 | 2026-11-02T07:15:43.265378336Z
databend-1 | 2026-11-02T07:15:43.265379253Z Databend Metasrv started
databend-1 | 2026-11-02T07:15:43.265380253Z
databend-1 | 2026-11-02T07:15:43.265383419Z ==> /tmp/std-query.log <==
databend-1 | 2026-11-02T07:15:45.267249212Z Databend Query
databend-1 | 2026-11-02T07:15:45.267269379Z
databend-1 | 2026-11-02T07:15:45.267271920Z Version: v1.2.881-ca29960f5c(rust-1.94.0-nightly-2026-04-17T02:30:29.281093406Z)
databend-1 | 2026-11-02T07:15:45.267273712Z
databend-1 | 2026-11-02T07:15:45.267274962Z Logging:
databend-1 | 2026-11-02T07:15:45.267276254Z file: enabled=true, level='INFO', dir=/var/log/databend, format=json, limit=48, max_file_size=4294967296
databend-1 | 2026-11-02T07:15:45.267277754Z stderr: enabled=false, level=WARN, format=text
databend-1 | 2026-11-02T07:15:45.267279045Z
databend-1 | 2026-11-02T07:15:45.267280129Z Meta: connected to endpoints [
databend-1 | 2026-11-02T07:15:45.267281295Z "0.0.0.0:9191",
databend-1 | 2026-11-02T07:15:45.267282670Z ]
databend-1 | 2026-11-02T07:15:45.267283837Z
databend-1 | 2026-11-02T07:15:45.267284962Z Memory:
databend-1 | 2026-11-02T07:15:45.267286129Z limit: unlimited
databend-1 | 2026-11-02T07:15:45.267287337Z allocator: jemalloc
databend-1 | 2026-11-02T07:15:45.267288504Z config: percpu_arena:percpu,oversize_threshold:0,background_thread:true,dirty_decay_ms:5000,muzzy_decay_ms:5000
databend-1 | 2026-11-02T07:15:45.267290212Z
databend-1 | 2026-11-02T07:15:45.267306337Z Cluster: standalone
databend-1 | 2026-11-02T07:15:45.267308420Z
databend-1 | 2026-11-02T07:15:45.267309629Z Storage: fs | root=/var/lib/databend/query
databend-1 | 2026-11-02T07:15:45.267310962Z Disk cache:
databend-1 | 2026-11-02T07:15:45.267312129Z storage: None
databend-1 | 2026-11-02T07:15:45.267313337Z path: DiskCacheConfig { max_bytes: 21474836480, path: "./.databend/_cache", sync_data: true }
databend-1 | 2026-11-02T07:15:45.267329837Z reload policy: Reset
databend-1 | 2026-11-02T07:15:45.267331337Z
databend-1 | 2026-11-02T07:15:45.267332545Z Builtin users: databend
databend-1 | 2026-11-02T07:15:45.267333795Z
databend-1 | 2026-11-02T07:15:45.267334837Z Builtin UDFs:
databend-1 | 2026-11-02T07:15:45.267336087Z
databend-1 | 2026-11-02T07:15:45.267337212Z Admin
databend-1 | 2026-11-02T07:15:45.267338337Z listened at 0.0.0.0:8080
databend-1 | 2026-11-02T07:15:45.267339504Z MySQL
databend-1 | 2026-11-02T07:15:45.267340629Z listened at 0.0.0.0:3307
databend-1 | 2026-11-02T07:15:45.267341837Z connect via: mysql -u${USER} -p${PASSWORD} -h0.0.0.0 -P3307
databend-1 | 2026-11-02T07:15:45.267343087Z Databend
databend-1 | 2026-11-02T07:15:45.267344170Z listened at 0.0.0.0:8000
databend-1 | 2026-11-02T07:15:45.267345420Z usage with args: bendsql -u ${USER} -p ${PASSWORD} -h 0.0.0.0 -P 8000
databend-1 | 2026-11-02T07:15:45.267346712Z usage with dsn: bendsql --dsn "databend://${USER}:${PASSWORD}@0.0.0.0:8000?sslmode=disable"
databend-1 | 2026-11-02T07:15:45.267348254Z http: curl -u${USER} -p${PASSWORD}: --request POST '0.0.0.0:8000/v1/query/' --header 'Content-Type: application/json' --data-raw '{"sql": "SELECT avg(number) FROM numbers(100000000)"}'
databend-1 | 2026-11-02T07:15:45.267351337Z