Home / Databases / MySQL

DatabasesRunbookIntermediate

Transformation: upgrading MySQL 8.0 to 8.4 LTS before 8.0 support ends

MySQL 8.0 reached end of life in April 2026, and 8.4 is the current long-term support release. Run the MySQL Shell upgrade checker, fix the changes that bite (authentication plugin defaults, removed replication syntax, changed defaults), and upgrade replicas first, then the source.

Deepak Bhardwaj5 min read

Applies toMySQL Community/Enterprise 8.0.x to 8.4 LTS (self-managed); managed services (RDS, Azure Flexible) follow their own upgrade tooling and timelines

Why now

MySQL 8.0 reached end of life in April 2026, so Oracle no longer releases fixes for it. Check Oracle's lifecycle page for exact dates. 8.4 is the LTS release for the 8.x line, with a longer support window, and later LTS releases upgrade from 8.4.

If you can't upgrade straight away, vendors such as Percona sell post-EOL support for 8.0, and managed services (RDS, Azure Database for MySQL, HeatWave) publish their own deadlines and upgrade tooling. Either way, 8.0 to 8.4 is a supported direct upgrade, but plan it as a real change, not a patch: several defaults and old syntaxes changed.

1. Run the upgrade checker

mysqlsh -- util check-for-server-upgrade root@db01:3306 --target-version=8.4.0 --output-format=TEXT

(Use the MySQL Shell version that matches or is newer than the target.) Fix every error; review every warning.

2. Changes that cause most trouble

Change in 8.4 Impact Action
mysql_native_password plugin disabled by default Accounts using it can't log in Move accounts to caching_sha2_password before upgrading (update old client libraries), or enable the plugin temporarily with mysql_native_password=ON
MASTER/SLAVE replication syntax removed (e.g. CHANGE MASTER TO, SHOW SLAVE STATUS, START SLAVE) Scripts, monitoring and failover tools break Use CHANGE REPLICATION SOURCE TO, SHOW REPLICA STATUS, START REPLICA
Changed server defaults (several InnoDB settings) Different performance behaviour Compare SHOW VARIABLES before/after; pin values you rely on
Removed deprecated variables/options Server won't start with them in my.cnf Remove from config first (checker lists them)

Find accounts with the old plugin:

SELECT user, host, plugin FROM mysql.user WHERE plugin = 'mysql_native_password';
ALTER USER 'app'@'%' IDENTIFIED WITH caching_sha2_password BY '<password>';

Test the application with the new authentication before the server upgrade: old JDBC/ODBC/PHP drivers may not support caching_sha2_password without TLS or RSA key exchange. Modern Connector/J, Connector/Python, mysqlclient, PHP mysqlnd and Go drivers do. Clients connecting without TLS need RSA key exchange enabled in the driver (for example allowPublicKeyRetrieval=true in Connector/J), or better, use TLS.

Temporary fallback for an account you can't change in time:

[mysqld]
mysql_native_password=ON

Treat it as a dated exception. Also, default_authentication_plugin was removed in 8.4; use authentication_policy if you set the default plugin in configuration.

Replication syntax replacements

Removed Use
SHOW MASTER STATUS SHOW BINARY LOG STATUS
SHOW SLAVE STATUS SHOW REPLICA STATUS
CHANGE MASTER TO ... CHANGE REPLICATION SOURCE TO ...
START SLAVE / STOP SLAVE START REPLICA / STOP REPLICA
SHOW SLAVE HOSTS SHOW REPLICAS

Search runbooks, Ansible roles, backup scripts and monitoring checks for the old forms:

grep -rniE "show (master|slave) status|change master to|(start|stop) slave|show slave hosts" ./scripts ./ansible ./monitoring

3. Upgrade order for replication

Replicas can run a newer version than the source, not the other way round.

  1. Upgrade one replica; let it run for a few days with read traffic.
  2. Upgrade remaining replicas.
  3. Switch over: promote an upgraded replica to source (planned switchover), or upgrade the source in a maintenance window.
  4. Upgrade the old source and reattach it as a replica.

InnoDB Cluster / Group Replication: upgrade MySQL Shell and MySQL Router first, then secondaries one by one, then switch primary and upgrade the last member.

4. In-place upgrade of one server

mysqlsh root@localhost -e "util.checkForServerUpgrade()"     # final check
mysql -e "SET GLOBAL innodb_fast_shutdown = 0;"               # clean shutdown, recommended for upgrades
systemctl stop mysqld
# back up the data directory or take a snapshot
dnf install mysql-community-server-8.4.*       # or apt; use the 8.4 repo
systemctl start mysqld                          # server upgrades the data dictionary automatically
tail -100 /var/log/mysqld.log
mysql -e "SELECT VERSION();"

Since 8.0.16 there's no separate mysql_upgrade step: the server upgrades system tables at start-up.

5. Validate

  • Error log free of upgrade errors and deprecated warnings you haven't handled.
  • Replication running everywhere (SHOW REPLICA STATUS).
  • Application logins, especially older services.
  • Top queries' plans and timings (optimizer changes).
  • Monitoring and backup tools work with 8.4 (XtraBackup version must match the server's major version).

Rollback

Downgrading from 8.4 to 8.0 in place is not supported. Your rollback options are the pre-upgrade snapshot/backup or a not-yet-upgraded replica. Keep one 8.0 replica (fed from the 8.4 source) only if replication from newer to older works for your workload. Generally plan on restore-based rollback.

Warning

Upgrade XtraBackup (8.4 series) alongside the server. Backups taken with an older XtraBackup won't work against 8.4 data files.

Checklist

  • Upgrade checker clean
  • Accounts on caching_sha2_password (or a dated mysql_native_password=ON exception); drivers tested
  • Scripts and tools use REPLICA/SOURCE syntax
  • Config cleaned of removed options
  • Replicas first; switchover rehearsed
  • Backup tooling upgraded; rollback by restore tested

Sources