/

Data Integration

MariaDB to Snowflake: The Complete Replication Guide

Intergalactic Data Labs

โ€”

โ€”

11 min read

Table of contents

Summarize

If you run MariaDB and need its tables in Snowflake, pick a change data capture tool that names MariaDB as a supported source. MariaDB's binary log has drifted from MySQL's, so a MySQL connector is not a safe stand-in. As of October 2026, nine tools document MariaDB as a source with a path to Snowflake, and version support and delete handling decide between them.

Approach

Tools

Change capture

Pricing unit

Native in Snowflake

Snowflake Openflow

Binlog, position only

Snowflake credits

Hosted ELT

Fivetran, Estuary, Hevo, Stitch

Binlog

Rows, GB, or events

Self-hosted streaming

Debezium plus the Kafka connector

Binlog to Kafka

Your Kafka bill

Code-first CLI or library

Sling, ingestr, dlt

Binlog, or queries for dlt

Free or flat token

How is MariaDB binlog replication different from MySQL?

MariaDB started as a copy of MySQL, but its binary log defaults, its GTID format, and its newer event layout now differ from MySQL's. Fivetran's MariaDB docs put the shared history plainly, "MariaDB is a fork of the MySQL code base (up to version 5.5)."

The binary log, or binlog, is the ordered record of every committed change, and every log-based tool reads it as if it were a replica. The defaults below are where a MySQL-shaped setup goes wrong.

Setting

MariaDB default

MySQL 8.4 default

What CDC needs

Binary log

Off until log_bin is set

On

On

binlog_format

MIXED

ROW

ROW

binlog_row_image

FULL

FULL

FULL

binlog_row_metadata

NO_LOG

MINIMAL

FULL for Openflow

Log expiry

0, never purged

30 days

Covers snapshot and outages

GTID format

0-1-100

UUID plus sequence

A parser for MariaDB GTIDs

Sources for the table are the MariaDB binary log formats page, the MariaDB system variables, the activation guide, and the MySQL 8.4 binary log options.

GTIDs do not cross over. A GTID, or global transaction ID, tags each transaction so a reader can resume after a failover. The two formats cannot be mixed. "MariaDB and MySQL have different GTID implementations, and they are not compatible with each other," per the MariaDB GTID page. MariaDB writes a domain, server, and sequence number such as 0-1-100, per the Debezium MariaDB connector.

MariaDB 11.4 changed the event format. Debezium notes that "A new binary log format was introduced in MariaDB 11.4." It asks you to set binlog_legacy_event_pos to ON, or the connector may lose its resume point after a restart, and Openflow and Hevo ask for the same flag. The same release added a FULL_NODUP row image, which logs only changed columns in the after image.

Versions matter for tool choice. The MariaDB Foundation now maintains four long-term series, and the oldest supported one is 10.11, since 10.6 reached end of life this July, per its Q3 release post. Openflow starts at 11.4, so a team on 10.11 is outside its support range.

Which tools replicate MariaDB to Snowflake?

Nine tools document MariaDB as a source with a documented path into Snowflake, and eight of them read the binlog. Airbyte is the notable gap.

Tool

MariaDB support

Change capture

Runs where

Pricing unit

Filament

Accepts a mariadb URL, docs list MySQL 8.0 and later only

Binlog, beta source, alpha Snowflake sink

Your network

Apache 2.0, self-run

Snowflake Openflow

11.4 or later, RDS

Binlog position

Snowflake or AWS BYOC

Snowflake credits

Fivetran

10.1.2 to 11.7, RDS

Binlog, GTID, or Teleport

Hosted, Hybrid

Monthly active rows

Estuary

10.3 and later

Binlog

Hosted, private, BYOC

GB plus per connector

Hevo

10.2 and later

Binlog, no GTID

Hosted

Events per month

Stitch

Integration version 2

Log-based incremental

Hosted

Rows per month

Debezium

Dedicated MariaDB connector

Binlog to Kafka

Kafka Connect

Your Kafka bill

Sling

mariadb connection

Binlog on paid tiers

CLI

Pro Max token or Advanced plan

ingestr

mariadb+cdc scheme

Binlog

CLI

Free, FSL-1.1

dlt

Listed SQL source

Queries only

Python library

Free, Apache 2.0

Airbyte

No MariaDB source in its registry

None

Not applicable

Credits on Cloud

Filament is built by Galaxy, which also publishes this site. Every cell comes from the vendor docs linked in the table or below.

Snowflake Openflow is generally available and loads through Snowpipe Streaming into journal tables, then merges on a schedule, per the Openflow MySQL and MariaDB docs. Deletes set _SNOWFLAKE_DELETED to true, and the journal tables "are retained indefinitely."

Openflow "supports only username and password authentication with MySQL or MariaDB," and its GTID page says MariaDB sources "always use binary log position tracking." Runtimes on a Snowflake deployment bill per second with a 5-minute minimum, per the cost page.

Fivetran covers the widest version range, on both Generic MariaDB and RDS. It turns on GTID mode by itself when it finds gtid_binlog_state, and its Teleport Sync fallback skips tables over 20 million rows. Deletes arrive as a _fivetran_deleted flag. Billing is monthly active rows, with 500,000 MAR on the free plan.

Estuary captures MariaDB 10.3 and later and asks for at least a week of binlog, per its MariaDB capture docs. Its Snowflake materialization has a Hard Delete option that removes deleted rows instead of flagging them.

Estuary charges $0.50 per GB plus $100 per month for each of the first six connectors, per its pricing docs.

Hevo and Stitch are the smaller hosted options. Hevo's MariaDB source needs 10.2 or higher, "does not support transaction-based replication using Global Transaction Identifiers," and starts at $299 a month for up to 1M events.

Stitch runs MariaDB integration version 2 on its Standard plan, which starts at $100 a month and bills by rows.

Debezium ships a dedicated MariaDB connector that writes to Kafka and does not support binlog compression, so log_bin_compress must be 0. Snowflake is reached through the Kafka connector, which warns that deleted or updated messages "might not be reflected in the Snowflake table." You own the MERGE.

Sling, ingestr, and dlt are code-first. Sling lists MariaDB as a change capture source, and that mode "requires a CLI Pro Max token or an Advanced Platform Plan." ingestr streams the binlog with the mariadb+cdc:// scheme and writes _cdc_deleted flags, per its MySQL page. dlt's sql_database source reads MariaDB by query, so it never sees a hard delete.

What is the best tool to continuously sync MariaDB to Snowflake?

For MariaDB 11.4 or later, Openflow is the most direct continuous path because it never leaves Snowflake. For older versions, Fivetran covers the range back to 10.1.2, and Estuary is the hosted choice when hard deletes matter.

Tool

Delivery

Fastest cadence

Source

Openflow

Snowpipe Streaming plus scheduled MERGE

Continuous ingest

Openflow setup

Estuary

Continuous capture

Continuous

MariaDB capture

Fivetran

Micro-batch

1 minute on Enterprise

Sync overview

ingestr

Catch-up runs or a stream flag

Continuous with stream

ingestr MySQL docs

Debezium

Kafka topics into Snowflake

Continuous

Debezium MariaDB

Faster is not always cheaper. Snowpipe Streaming makes rows queryable in "as low as 5 seconds," per the Snowpipe Streaming overview. Every MERGE still wakes a warehouse that bills "per-second billing (with a 60-second minimum each time the warehouse starts)," per the warehouse docs. A merge every few minutes is enough for most dashboards.

What are the best practices for loading MariaDB data into Snowflake?

Set the binlog for row-level capture before the first snapshot, keep enough of it to survive a pause, and give the pipeline a key-pair Snowflake user. The block below is a starting my.cnf that meets the documented needs of Openflow, Fivetran, Debezium, and Hevo.

[mariadb]
server_id                  = 1
log_bin                    = mariadb-bin
binlog_format              = ROW
binlog_row_image           = FULL
binlog_row_metadata        = FULL
binlog_legacy_event_pos    = ON
log_bin_compress           = 0
binlog_expire_logs_seconds = 604800
[mariadb]
server_id                  = 1
log_bin                    = mariadb-bin
binlog_format              = ROW
binlog_row_image           = FULL
binlog_row_metadata        = FULL
binlog_legacy_event_pos    = ON
log_bin_compress           = 0
binlog_expire_logs_seconds = 604800
[mariadb]
server_id                  = 1
log_bin                    = mariadb-bin
binlog_format              = ROW
binlog_row_image           = FULL
binlog_row_metadata        = FULL
binlog_legacy_event_pos    = ON
log_bin_compress           = 0
binlog_expire_logs_seconds = 604800
  • Set binlog_format to ROW by hand, since MariaDB defaults to MIXED and statement events break log-based capture.

  • Keep binlog_row_image at FULL, which Fivetran, Stitch, and Openflow require, rather than MINIMAL or FULL_NODUP.

  • Turn on binlog_legacy_event_pos on 11.4 and later, as Debezium, Openflow, and Hevo instruct.

  • Keep at least 7 days of binlog, which matches Fivetran's recommendation and Estuary's minimum.

  • Set the server time_zone to a named zone when tables hold DATETIME columns, as Estuary requires.

  • Use a Snowflake key pair of at least 2048 bits, per the key-pair docs, because the MFA rollout will "disallow passwords for all service users."

MariaDB types that need care in Snowflake

MariaDB has a few types MySQL lacks and a JSON type that is really text. Decide each mapping before the first load, since changing it later means a re-snapshot.

MariaDB type

What happens

What to do

JSON

An alias for LONGTEXT, so it arrives as text

PARSE_JSON into a VARIANT column

UUID, from 10.7

Not in Openflow's map, so TEXT

Keep as text or cast after load

INET4 and INET6

Not in Openflow's map, so TEXT

Keep as text

DECIMAL over 38 digits

MariaDB allows 65

Round on purpose or store as text

Zero dates

Allowed unless NO_ZERO_DATE is set

Choose NULL or the epoch per column

TINYINT(1) and BIT

Openflow writes INT and a hex string

Cast to BOOLEAN or binary in a view

MariaDB's JSON page says "JSON is an alias for LONGTEXT," so a tool that maps MySQL JSON to VARIANT sees a text column instead. Run PARSE_JSON in a view or a dbt model. The UUID and INET6 types fall back to TEXT because Openflow's data mapping maps "Any MySQL data types not listed in this table" to TEXT.

Precision and dates are the quiet failures. MariaDB DECIMAL holds up to 65 digits while Snowflake NUMBER stops at 38. MariaDB accepts the zero date unless the SQL mode forbids it, and Fivetran loads invalid dates as NULL while Openflow maps a zero TIMESTAMP to the Unix epoch.

Matching the tool to your MariaDB version and team

Your MariaDB version narrows the list before price does. Start there, then pick by who runs the pipeline.

MariaDB setup

Pick

Why

11.4 or later, Snowflake-first team

Openflow

Native, generally available, billed as Snowflake credits

10.11 or older, no ops time

Fivetran

Supports 10.1.2 to 11.7, GTID detected automatically

Hosted, hard deletes required

Estuary

Hard Delete option, billed per GB

Kafka already in production

Debezium

Dedicated connector, change stream reused

Small team, scripted pipelines

ingestr or Sling

One CLI, binlog capture, merge by key

Snapshot only, deletes not needed

dlt

Query-based loads with no binlog setup

Related guides

Frequently asked questions

How do I load MariaDB data into Snowflake?

Snapshot each table, load it into Snowflake, then read the MariaDB binary log and apply inserts, updates, and deletes with a MERGE by primary key. Turn on the binlog first, set binlog_format to ROW and binlog_row_image to FULL, and keep at least seven days of logs. Openflow, Fivetran, Estuary, Hevo, Stitch, Debezium, Sling, and ingestr all follow this pattern.

What is the best tool to continuously sync MariaDB to Snowflake?

On MariaDB 11.4 or later, Snowflake Openflow is the most direct option because it streams changes inside Snowflake and bills as Snowflake credits. On older versions, Fivetran supports 10.1.2 through 11.7 and syncs as often as every minute on Enterprise. Estuary streams continuously and can hard delete rows in Snowflake, billed per GB plus per connector.

Can I use a MySQL connector to replicate MariaDB?

Sometimes, but test it first. MariaDB's GTIDs are not compatible with MySQL's, MariaDB defaults to MIXED binlog format instead of ROW, and MariaDB 11.4 introduced a new binlog event format that needs binlog_legacy_event_pos turned on. A connector that documents MariaDB by name has been tested against those differences, and a MySQL connector may not have been.

Does Snowflake Openflow support MariaDB?

Yes. The Openflow Connector for MySQL also accepts MariaDB 11.4 or later, on standard MariaDB and Amazon RDS. It connects through the MariaDB JDBC driver with a username and password only, tracks MariaDB by binlog position rather than GTID, needs binlog_legacy_event_pos set to ON, and soft deletes rows with a _SNOWFLAKE_DELETED flag.

Does Airbyte support MariaDB to Snowflake?

Not as a documented connector. Airbyte's connector registry lists no MariaDB source as of October 2026, and its MySQL source documents MySQL settings only. Teams that want a self-hosted path can use the Debezium MariaDB connector with the Snowflake Kafka connector, or the ingestr and Sling command line tools, which both name MariaDB as a binlog source.

What binlog settings does MariaDB need for change data capture?

Binary logging must be on, binlog_format must be ROW, and binlog_row_image must be FULL. Openflow also needs binlog_row_metadata set to FULL, and on MariaDB 11.4 or later, Debezium, Openflow, and Hevo need binlog_legacy_event_pos set to ON. Debezium also needs log_bin_compress at 0. Keep at least seven days of logs so a paused pipeline can resume.

How are MariaDB deletes handled in Snowflake?

It depends on the tool. Openflow sets _SNOWFLAKE_DELETED to true and keeps the row, Fivetran sets _fivetran_deleted, and ingestr writes a _cdc_deleted flag. Estuary can remove the row with its Hard Delete option. A query-based load such as dlt never sees a hard delete, because the deleted row is no longer there to read.

How does MariaDB JSON load into Snowflake?

As text. MariaDB stores JSON as an alias for LONGTEXT, so replication tools see a string column rather than a native JSON type. Load it as text, then convert it with PARSE_JSON into a VARIANT column in a view or a transformation model. MariaDB adds a JSON_VALID check to columns declared as JSON, so documents should parse cleanly.

More articles

Stay up to date with what weโ€™re building

Stay up to date with what weโ€™re building

Stay up to date with what weโ€™re building

Questions

Answered

FAQ

What does Galaxy do?

What is Filament?

What is enterprise context management?

What does working with Galaxy look like?

How do you handle security and compliance?

Why does Galaxy build in the open?

Own your knowledge stack

Own your knowledge stack

Copyright ยฉ 2026 Galaxy. All rights reserved.