NextGen Global IT ParkNextGen Global IT Park
← All posts

Zero-downtime MySQL 8.0 → 8.4 upgrades on RDS with Blue/Green deployments

Published 21 October 2026 · AWS RDS · MySQL · Zero downtime

Amazon RDS ended standard support for MySQL 8.0 on 31 July 2026. From 1 August, every instance still on 8.0 started paying RDS Extended Support charges on top of its normal bill, for a version that only gets critical fixes. For a US healthcare platform we operate, that meant moving three production RDS MySQL instances to 8.4 LTS before the deadline, with no downtime beyond the switchover itself.

This is the runbook we used. It is written for the engineer who has to do the same thing, so it includes the parts that went sideways on paper before they could go sideways in production.

The starting point

Step 1: Inventory before anything else

For each instance we wrote down: engine version, instance class, parameter group and option group, replicas (and their Regions), automated-backup retention, and every client that connects — the app, queue workers, scheduled jobs and the GUI tools engineers use. The inventory is what turns a scary migration into a checklist, and it is the first page of the runbook.

Step 2: Compatibility prechecks

We ran the MySQL Shell upgrade checker (util.checkForServerUpgrade()) against each instance with 8.4 as the target, and fixed every error before creating anything. RDS also runs its own prechecks when it upgrades and refuses to proceed if they fail, but finding problems in the checker output on a Tuesday afternoon beats finding them mid-upgrade.

Two things to look at closely:

Step 3: Build the 8.4 parameter group deliberately

Create a new custom parameter group in the mysql8.4 family and port settings on purpose, not by copying everything across. Our group had a single override — the max_connections formula — so we carried that one value and left everything else at the 8.4 defaults. That override got its own review step: a formula tuned for one instance class silently changes meaning if the green instance ever runs on a different class.

Step 4: Create the Blue/Green deployment

An RDS Blue/Green deployment creates a "green" copy of your production ("blue") instance that stays in sync through replication. You upgrade green to 8.4, test it, and switch over when you're ready.

Things that bit, or nearly bit:

Step 5: The full bake

This is the step teams skip, and the one that matters most. We let green run on 8.4 with replication active and checked it against production-shaped reads before anyone talked about switching:

For the most critical instance the full bake was mandatory. We staggered the work — test instance first, then production instances one at a time — so every switchover used a runbook that had already been run, and finished with a buffer before the 31 July deadline.

Step 6: Switchover go/no-go

Switchover was a scheduled event with a written go/no-go list, not a button press:

  1. Replica lag is effectively zero.
  2. No long-running transactions or DDL on blue.
  3. Application error rates are at baseline, and someone who knows the app is watching.
  4. A fresh snapshot exists and backups are healthy on both sides.
  5. The rollback decision (below) has been made in advance.

During switchover RDS swaps the endpoints, so applications keep their connection strings. AWS says switchover typically completes in under a minute. The old blue instance is renamed (for example with an -old1 suffix) and kept.

Step 7: Be honest about rollback

Before switchover, rollback is trivial: delete the Blue/Green deployment and nothing in production has changed. After switchover, there is no automatic replication back to the old 8.0 instance. Going back means restoring from the retained old instance or a snapshot and reconciling anything written since — which is why the go/no-go list exists. Keep the -old1 instance for at least your required recovery window (it keeps its own backups and point-in-time recovery), and note that you restore it by its resource ID, not its old name.

After the switchover

Lessons learned

Still on MySQL 8.0 and paying Extended Support? We do this as a fixed-price engagement: a Zero-Downtime Database Upgrade is $3,000 per database, with a written runbook, a full bake and a rehearsed rollback plan.

Book a 20-minute call