Skip to main content

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples in this guide work on VillageSQL. Install Now →
MySQL replication copies changes from one server (the source) to one or more servers (replicas). The source writes every change to the binary log; each replica reads that log and replays the changes. Replication is the foundation for read scaling, high availability, and geographic distribution.

How Replication Works

  1. The source commits a transaction and writes it to the binary log.
  2. The replica’s I/O thread connects to the source, reads new binlog events, and writes them to a local relay log.
  3. The replica’s SQL thread reads from the relay log and executes each event.
This is asynchronous by default — the source doesn’t wait for replicas to confirm receipt. The replica can lag behind the source.

Setting Up a Replica

On the source — enable binary logging and set a unique server ID in my.cnf:
Create a replication user:
Take a consistent snapshot using mysqldump with --source-data:
On the replica — set a different server ID:
Restore the snapshot and start replication:
SOURCE_AUTO_POSITION = 1 enables GTID-based replication. If you’re not using GTIDs, specify SOURCE_LOG_FILE and SOURCE_LOG_POS instead (values from the snapshot file header).

GTID Replication

Global Transaction Identifiers (GTIDs) assign a unique ID to every committed transaction. They make failover and replica setup simpler — instead of tracking binlog filenames and positions, MySQL tracks which transactions each server has applied. Enable GTIDs on both source and replica:
With GTIDs enabled, SOURCE_AUTO_POSITION = 1 is all you need — MySQL figures out which transactions the replica is missing and replays them automatically.

Monitoring Replication

Key fields to watch: Both Replica_IO_Running and Replica_SQL_Running must be Yes for replication to be working.

Replication Lag

Replication lag happens when the replica’s SQL thread can’t keep up with the source’s write rate. Common causes:
  • Single-threaded SQL thread: by default, replicas apply events serially. Enable parallel replication with replica_parallel_workers:
  • Long-running queries on the replica: queries that lock rows block the SQL thread.
  • Network latency: slow I/O thread causes the SQL thread to run out of work.
  • Disk I/O on replica: syncing relay log or data files is the bottleneck.

Replication Architectures

The default setup — one source, one or more async replicas — isn’t the only option. MySQL offers several replication architectures with different consistency and availability trade-offs. When to use each:
  • Async replication — the right default for read scaling and disaster-recovery replicas where some lag is acceptable.
  • Semi-sync — when you need durability insurance against source failure but can’t tolerate the operational complexity of Group Replication. Adds ~1 network round trip per write commit.
  • Group Replication / InnoDB Cluster — when you need automatic failover and can afford the write latency increase. InnoDB Cluster wraps Group Replication with MySQL Router and MySQL Shell for easier management.
Note: Group Replication requires all tables to use InnoDB and have a primary key. Enable it with the group_replication plugin; configuration is beyond the scope of this guide.

Read Scaling with Replicas

Direct read-heavy queries to replicas to reduce load on the source:
The application must tolerate replication lag. A replica may not have the row inserted a few milliseconds ago on the source. For reads that must reflect the latest write, connect to the source.

Replication vs. Alternatives

Replication solves specific problems well and is the wrong tool for others. Before reaching for it, check whether it actually fits. The short version: replication is the right call when one server handles all your writes and you need read scale, HA, or a warm standby. If your write throughput is the bottleneck, replication copies the problem to every replica — sharding or a distributed database addresses it at the source.

Stopping and Starting Replication

To skip a single failing event (use carefully — skipping events causes the replica to diverge):

Frequently Asked Questions

Does replication work across MySQL major versions?

MySQL supports replicating from an older source to a newer replica, but not the reverse. Always upgrade replicas before upgrading the source.

What’s the difference between semi-synchronous and asynchronous replication?

In asynchronous replication (the default), the source commits without waiting for any replica to acknowledge receipt. In semi-synchronous replication, the source waits for at least one replica to confirm it received the event before returning to the client. Semi-sync reduces the risk of data loss on source failure, at the cost of slightly higher write latency.

Troubleshooting

See also