MySQL sources are read from the binary log: Fabric snapshots the selected tables, then tails binlog row events for every insert, update, and delete. Resume is by binlog file and position— GTID is not required.
Supported deployments
The same connector serves self-hosted MySQL, Amazon RDS for MySQL, Amazon Aurora MySQL, Google Cloud SQL for MySQL, and Azure Database for MySQL. The server settings below are the same everywhere; on a managed service they are parameter-group or flag changes rather than my.cnf edits.
Prerequisites
Server settings
- MySQL 8.0+ —
binlog_row_metadatadoes not exist on 5.7, and Fabric refuses a server without it. log-bin=mysql-binand a standard basename, so a position can be resumed across log rotation.binlog_format=ROW— statement or mixed logging yields no row events.binlog_row_image=FULL— partial images arrive with missing columns.binlog_row_metadata=FULL— row events must carry column names and enum/set values.- A non-zero
server_idon the server, and a distinct server ID for Fabric (set in the connection form). - Binlog retention longer than 72 hours. Apply and persist:
SET PERSIST binlog_expire_logs_seconds = 259201; -- > 72h
SET PERSIST expire_logs_days = 0; -- legacy knob must be 0A session time zone that can be pinned to UTC is also required (SET SESSION time_zone = '+00:00' must succeed); --default-time-zone=+00:00 is recommended.
A replication login
CREATE USER 'replicator'@'%'
IDENTIFIED WITH mysql_native_password BY '<password>';
GRANT REPLICATION SLAVE, REPLICATION CLIENT, SELECT ON *.*
TO 'replicator'@'%';
FLUSH PRIVILEGES;On MySQL 8 use mysql_native_password: the bundled client cannot authenticate with caching_sha2_password.
Other requirements
- Every table you select must have a primary key — a keyless table is refused by name.
- If you read from a replica,
log_replica_updatesmust beON, or upstream changes never reach its binlog. - The runner must reach
host:port.utf8mb4is the recommended server charset.
Connection fields
| Field | Required | Default | Notes |
|---|---|---|---|
| Connector name | Yes | — | Unique across sources. |
| Host | Yes | — | TCP host of the server. |
| Port | Yes | 3306 | |
| Username | Yes | — | The replication/SELECT user. |
| Password | Yes on create | — | Leave blank on edit to keep the stored password. |
| Database | Yes | — | Test connection lists the visible databases (system schemas are hidden). Read-only after creation. |
| Server ID | Yes | — | Fabric's reader identity. Must differ from the server's own server_id and from every replica's, and be unique across MySQL sources. A collision makes MySQL kill the older connection. |
How it replicates
- The snapshot runs inside one consistent-snapshot transaction and is always serial; parallel snapshot workers above 1 are ignored.
- The binlog position is captured before the scan, and each table's progress is checkpointed after every chunk.
- On resume the stored position is validated against the live server — a position ahead of the current file, or older than the oldest retained file, is a loud error rather than silent data loss.
Gotchas
Watch out
- Each failed prerequisite is named explicitly: binlog format, row image, row metadata, retention, missing grant, server ID, replica updates, time zone, or a keyless table.
- A schema change while the runner is down is refused on resume with a column diff — recover with a pipeline reset, not a cursor clear. A live
ALTER TABLEwhile the runner is up lands additively. tinyint(1)is boolean only by convention: Fabric scans for out-of-range values and widens the column toSMALLINTwhen needed.