Technical
9 min read

The Best Way to Replicate a Database into Snowflake (2026)

How to replicate Postgres, MySQL, SQL Server, or another database into Snowflake in 2026. Managed vs open-source options, a step-by-step with the ingestr CLI, incremental loading, and the Snowflake-specific gotchas (staging, warehouses, cost).

Kateryna Kozachenko

Marketing & Growth

TL;DR: The best way to replicate a database into Snowflake depends on your constraints. For a fully managed, zero-maintenance option, use Fivetran. For open-source and code-first with no server to run, use the ingestr CLI, which moves Postgres, MySQL, SQL Server, Oracle, and more into Snowflake with one command and native bulk-loading through Snowflake stages. For real-time streaming, use log-based CDC (Debezium or Estuary). Most analytics teams want a scheduled incremental load, not streaming, and ingestr or Fivetran cover that cleanly.

Replicating a database into Snowflake means keeping a Snowflake copy of your source tables in sync so your analytics, dashboards, and models read from Snowflake instead of hammering production. The mechanics that matter: how the data gets loaded (bulk staging vs row inserts), how you sync only what changed (incremental loading or CDC), and how you avoid the Snowflake-specific cost traps. Here is how to do it without over-buying.

Your options

OptionTypeOpen sourceRuns asBest for
ingestrIncremental / replicationYesCLI (no server)Code-first, scheduled replication, no infra
FivetranManaged, log-based CDCNoManaged cloudZero maintenance, will pay for it
AirbyteEL + CDC (via Debezium)Yes (self-host)Server + UIConnector breadth, self-hosted
Debezium + streamLog-based CDCYesKafka ConnectReal-time streaming replication
Snowpipe / COPY (DIY)Bulk file loadN/AManualYou already export to S3/GCS

If you want managed and money is not the constraint, Fivetran is the least-effort answer. If you want open-source, code-first, and no server, keep reading, because ingestr is the shortest path.

Replicate into Snowflake with ingestr, step by step

ingestr is an open-source CLI. You give it a source URI and a Snowflake destination URI and it handles the rest, including loading through Snowflake's bulk-load path rather than slow row-by-row inserts.

1. Install it.

pip install ingestr

2. Run a full load from Postgres into Snowflake:

ingestr ingest \
  --source-uri 'postgresql://user:pass@host:5432/appdb' \
  --source-table 'public.orders' \
  --dest-uri 'snowflake://user:pass@account/db/schema?warehouse=WH&role=ROLE' \
  --dest-table 'raw.orders'

3. Switch to incremental so subsequent runs move only changed rows:

ingestr ingest \
  --source-uri 'postgresql://user:pass@host:5432/appdb' \
  --source-table 'public.orders' \
  --dest-uri 'snowflake://user:pass@account/db/schema?warehouse=WH&role=ROLE' \
  --dest-table 'raw.orders' \
  --incremental-strategy merge \
  --incremental-key updated_at \
  --primary-key id

merge upserts on the primary key using the updated_at watermark, so re-runs are idempotent. Put this command on a scheduler (cron, your orchestrator, or Bruin) and you have continuous replication without running a server. The same pattern works for MySQL, SQL Server, and Oracle sources by swapping the source URI.

Incremental vs CDC for Snowflake

  • Incremental (query-based), as above, is simplest and covers most analytics needs. It syncs at your schedule's interval and relies on an updated_at or incrementing id. Caveat: it does not catch hard deletes unless you soft-delete.
  • Log-based CDC (Debezium, Estuary, Fivetran) reads the transaction log for true low-latency replication and exact delete capture. Use it only if you genuinely need sub-second freshness or must capture every hard delete. See our CDC tools guide for the tradeoffs.

Snowflake-specific gotchas

  • Load through a stage, not row inserts. Row-by-row inserts into Snowflake are slow and burn warehouse credits. ingestr uses the bulk-load path automatically; if you build this yourself, stage files to internal/external storage and COPY INTO.
  • Size the loading warehouse sensibly. A giant warehouse does not speed up a small incremental load; it just costs more. Use a small warehouse with auto-suspend for ingestion.
  • Keep raw and modeled data separate. Land replicated tables in a raw schema and transform from there, so a re-load never clobbers your models.
  • Watch region and egress. If your source database and Snowflake account are in different clouds/regions, egress and latency can dominate. Co-locate where you can.
  • Match types deliberately. Let the tool infer types on the first load, then pin the schema so a surprise column does not silently change a downstream model.

After replication: model and monitor

Landing raw tables in Snowflake is step one. You still need to transform them into clean models, check quality, and schedule everything. ingestr is the ingestion layer of Bruin, an open-source platform that also runs your SQL/Python transformations, data quality checks, and scheduling against Snowflake, so replication and the rest of the pipeline live in one project instead of a replication tool plus a transformation tool plus a scheduler.

Related: replicate into BigQuery or Databricks, the best data ingestion tools in 2026, and CDC tools for databases.

I work at Bruin, which makes ingestr and Bruin. Corrections welcome at [email protected].

Sign up to our newsletter

Practical updates on open-source data pipelines, AI analysts, governance, and what we are shipping at Bruin.

The signup form is hosted by Brevo. Accept cookies to load it.