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.
- Upgrade one replica; let it run for a few days with read traffic.
- Upgrade remaining replicas.
- Switch over: promote an upgraded replica to source (planned switchover), or upgrade the source in a maintenance window.
- 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 datedmysql_native_password=ONexception); 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