MySQL 8.0 to 8.4 LTS Upgrade Guide — 5-Part Series
- Part 1: Pre-Upgrade Preparation
- Part 2: Upgrade Testing
- Part 3: Upgrade Execution
- Part 4: Rollback and Post-Upgrade Validation
- Part 5: Change Management, Troubleshooting, and Checklist (You Are Here)
A major version upgrade is not just a technical task. Proper change management ensures organizational readiness and reduces risk. This final part covers the operational planning, common pitfalls you'll encounter, and the complete 41-item checklist to track your progress.
Change Ticket Requirements
Your change ticket (ServiceNow, Jira, or equivalent) should include:
- Change description: MySQL major version upgrade from 8.0.37 to 8.4 LTS
- Business justification: MySQL 8.0 EOL (April 6, 2026), security patching requirement
- Risk assessment: Major version upgrade with potential for application compatibility issues
- Impact assessment: Expected downtime window, affected applications, affected users
- Rollback plan: Detailed steps with estimated rollback duration
- Go/No-Go criteria: Checklist of conditions that must be met before proceeding
- Communication plan: Who to notify before, during, and after the upgrade
Go / No-Go Criteria
Define clear criteria before entering the maintenance window. If any criterion is not met, postpone the upgrade.
| Criterion | Required State | Checked By |
|---|---|---|
| Backups completed and verified | Logical + Physical backup, restore tested | DBA |
| Upgrade Checker errors resolved | Zero errors, warnings reviewed | DBA |
| pt-upgrade testing completed | No critical query failures | DBA |
| Staging dry-run successful | Full procedure validated | DBA |
| Application team sign-off | App testing passed on staging | App Team Lead |
| Rollback procedure tested | Restore tested with time estimate | DBA |
| Monitoring dashboards ready | PMM/Grafana configured for 8.4 | DBA / SRE |
| Stakeholders notified | Change window communicated | Change Manager |
Maintenance Window Monitoring
During the cutover window, monitor these metrics in real-time:
- Replication lag (
Seconds_Behind_Source) on all replicas - Active connections count (
SHOW PROCESSLISTor performance_schema) - Error log (
tail -f /var/log/mysql/mysqld.log) - Application error rates from your APM tool
- Query latency (p50, p95, p99) from slow query log or PMM
- InnoDB buffer pool hit ratio and I/O metrics
Communication Template
Send notifications at these milestones:
- Pre-upgrade (1 week before): Scheduled maintenance notification with date, time, expected duration, and affected services
- Maintenance start: "Maintenance window has begun. [Service] may experience brief connectivity interruptions."
- Cutover complete: "Database upgrade complete. Services restored. Monitoring for stability."
- All-clear (24-48 hours later): "Upgrade verified stable. Maintenance window closed."
Full Upgrade Project Timeline
Actual times vary significantly based on data size, complexity, team experience, and hardware. The estimates below are based on real-world upgrade projects.
| Phase | Activity | Estimated Hours |
|---|---|---|
| 1. Test Env Setup | Restore 2 instances from production backup | 15-20 |
| 2. Upgrade Testing | Slow log collection, pt-upgrade RO/RW tests, analysis, upgrade checker | 20-25 |
| 3. Fix Issues | Remediate all errors and warnings | 5-15 |
| 4. Staging Dry-Run | Complete upgrade procedure on staging | 8-12 |
| 5. Architecture Setup | Restore 8.4 from fresh backup, setup replication, monitoring | 20-25 |
| 6. Cutover | Cutover planning and execution | 5-10 |
| 7. Post-Upgrade Monitoring | Monitor production for stability | 8-16 |
| TOTAL | 81-123 | |
Time Estimates by Data Size
The most variable component is backup/restore time, which is heavily dependent on data size:
| Database Size | Logical Backup | Logical Restore | XtraBackup | XtraBackup Restore |
|---|---|---|---|---|
| < 100 GB | 30-60 min | 1-2 hours | 15-30 min | 15-30 min |
| 100 GB - 1 TB | 1-4 hours | 4-12 hours | 30-90 min | 30-90 min |
| 1 TB - 5 TB | 4-12 hours | 12-36 hours | 1-4 hours | 1-4 hours |
| 5 TB - 10 TB+ | 12-24+ hours | 24-72+ hours | 4-12+ hours | 4-12+ hours |
WARNING: For datasets over 5TB, the rollback window using logical backup restore can exceed 24 hours. This makes the replication-based upgrade approach essential, not optional, for large production databases.
Simplified Timeline (Skipping pt-upgrade)
If hardware constraints prevent a full compatibility test, the project can be reduced to 40-60 hours. This carries significantly higher risk:
| Phase | Estimated Hours |
|---|---|
| Pre-upgrade checks and preparation | 8-12 |
| Staging dry-run | 5-8 |
| Upgrade execution | 5-15 |
| Application testing (customer-led) | 10-20 |
| Cutover | 5-10 |
| TOTAL | 33-65 |
CRITICAL: Skipping pt-upgrade testing means you're accepting the risk that queries may fail or return wrong results in production. For large datasets, this risk includes a rollback that could take 10-20+ hours. This decision must be explicitly acknowledged by stakeholders.
Common Pitfalls and Troubleshooting
Server Refuses to Start: Removed Parameters in my.cnf
Symptom: mysqld fails to start with "unknown variable" or "unknown option" errors.
Cause: Removed parameters (default_authentication_plugin, master_info_repository, etc.) still present in my.cnf.
Solution: Remove all parameters listed in Part 1, Removed Parameters. Check the error log for the specific parameter name causing the failure.
Redo Log Incompatibility
Symptom: "This redo log was created with MySQL 8.0.x and it appears logically non empty."
Cause: MySQL was shut down with innodb_fast_shutdown = 2 or crashed before upgrade.
CRITICAL: Do NOT delete redo log files. This causes data loss. You MUST restore from backup.
Prevention: Always set innodb_fast_shutdown = 0 and perform a clean shutdown before any upgrade.
Data Directory Deleted on Debian/Ubuntu
Symptom: /var/lib/mysql is empty or missing after removing MySQL 8.0 packages.
Cause: Used apt-get purge instead of apt-get remove. Purge removes data directories.
Solution: Restore from your pre-upgrade backup. Prevention: ALWAYS use apt-get remove, never apt-get purge.
Authentication Failures After Upgrade
Symptom: Applications or users cannot connect after upgrading to 8.4.
Cause: mysql_native_password plugin is removed in 8.4.
Immediate fix: Add mysql_native_password=ON to my.cnf and restart MySQL. Then migrate users per Part 1, Authentication Migration.
InnoDB Storage Engine Error for System Tables
Symptom: Error 1726 "Storage engine InnoDB Does Not Support System Tables."
Cause: my.cnf forces default_storage_engine = MyISAM. System tables require InnoDB.
Solution: Remove default_storage_engine = MyISAM from my.cnf, or set it to InnoDB.
Deprecated Plugin Errors
Symptom: Errors referencing missing shared libraries (e.g., query_response_time.so).
Cause: Percona-specific plugins from older versions registered in the data dictionary.
Solution:
DELETE FROM mysql.plugin WHERE name = 'QUERY_RESPONSE_TIME';
DELETE FROM mysql.plugin WHERE name = 'SCALABILITY_METRICS';
Query Failures from sql_mode Changes
Symptom: Queries that worked in 8.0 return errors like "Expression #N of SELECT list is not in GROUP BY clause."
Cause: ONLY_FULL_GROUP_BY is enforced in 8.4 default sql_mode.
Immediate fix: Set sql_mode explicitly in my.cnf to match your 8.0 mode. Long-term fix: Rewrite queries to comply with ONLY_FULL_GROUP_BY.
View and Routine Warnings
Symptom: "View is no more valid to use" warnings in the error log.
Cause: Views or stored routines reference deprecated syntax or changed objects.
Solution: Identify affected views with CHECK TABLE, then recreate them.
Want ReliaDB to handle the entire upgrade?
From pre-upgrade preparation through post-upgrade monitoring, our DBA team has executed MySQL major version upgrades for production databases up to 10TB+. Book a free assessment to discuss your upgrade.
Book Free Assessment →Complete Upgrade Checklist (41 Items)
Use this checklist to track progress through each phase of the upgrade.
Pre-Upgrade Preparation
| # | Task | Owner |
|---|---|---|
| 1 | Take full logical backup (mysqldump/mydumper) and verify restore | DBA |
| 2 | Take full physical backup (XtraBackup/LVM snapshot) and verify restore | DBA |
| 3 | Verify sufficient disk space (2.5x datadir free) | DBA |
| 4 | Run mysqlcheck --all-databases --check for corruption | DBA |
| 5 | Run MySQL Shell Upgrade Checker targeting 8.4.8 | DBA |
| 6 | Resolve all Upgrade Checker ERRORS | DBA |
| 7 | Address all Upgrade Checker WARNINGS | DBA |
| 8 | Identify and migrate mysql_native_password users (or plan transitional) | DBA |
| 9 | Identify and fix AUTO_INCREMENT on FLOAT/DOUBLE columns | DBA |
| 10 | Audit my.cnf: remove all deprecated/removed parameters | DBA |
| 11 | Set explicit values for parameters with changed defaults | DBA |
| 12 | Review and fix sql_mode-dependent queries (GROUP BY, zero dates) | DBA / Dev |
| 13 | Audit all scripts/code for MASTER/SLAVE syntax | DBA / Dev |
| 14 | Upgrade ProxySQL to 2.5.4+ (if applicable) | DBA |
| 15 | Test auth chain through ProxySQL in staging (if applicable) | DBA |
| 16 | Verify all tool versions are 8.4-compatible (PMM, XtraBackup, etc.) | DBA |
Testing
| # | Task | Owner |
|---|---|---|
| 17 | Set up test environment (8.0 baseline + 8.4 target) | DBA |
| 18 | Collect slow query log from production (1-3 hours peak) | DBA |
| 19 | Run pt-upgrade read-only test and analyze results | DBA |
| 20 | Run pt-upgrade read-write test and analyze results | DBA |
| 21 | Run application test suites against 8.4 test instance | App Team |
| 22 | Load test 8.4 instance and compare performance | DBA / QA |
| 23 | Complete full dry-run upgrade on staging | DBA |
| 24 | Canary test with partial traffic (optional) | DBA / SRE |
Change Management
| # | Task | Owner |
|---|---|---|
| 25 | Create and approve change ticket | DBA / Manager |
| 26 | Schedule maintenance window with stakeholders | Change Mgr |
| 27 | Send pre-upgrade notification (1 week prior) | DBA |
| 28 | Confirm Go/No-Go criteria met | All |
Execution
| # | Task | Owner |
|---|---|---|
| 29 | Take final pre-upgrade backup | DBA |
| 30 | Execute upgrade (replication-based, rolling, or in-place) | DBA |
| 31 | Verify MySQL 8.4 starts and runs without errors | DBA |
Post-Upgrade Validation
| # | Task | Owner |
|---|---|---|
| 32 | Verify version: SELECT VERSION() | DBA |
| 33 | Review error log for warnings | DBA |
| 34 | Run mysqlcheck on all databases | DBA |
| 35 | Run ANALYZE TABLE on key tables | DBA |
| 36 | Verify replication health (if applicable) | DBA |
| 37 | Run application smoke tests | App Team |
| 38 | Monitor performance for 24-48 hours | DBA / SRE |
| 39 | Update monitoring, scripts, and documentation | DBA |
| 40 | Archive pre-upgrade backups per retention policy | DBA |
| 41 | Close change ticket with post-implementation review | DBA |
References and Resources
- MySQL 8.4 Release Notes
- MySQL 8.4 What Is New
- MySQL Shell Upgrade Checker
- Percona Toolkit (pt-upgrade)
- Percona Server for MySQL 8.4 Documentation
- ProxySQL Documentation
- Percona Support Knowledge Base: MySQL Upgrades articles
Series Complete! You've reached the end of the MySQL 8.0 to 8.4 LTS Upgrade Guide. With thorough preparation, testing, and a solid rollback plan, your upgrade will go smoothly. If you need hands-on help at any stage, reach out to ReliaDB.
Complete Series
- Part 1: Pre-Upgrade Preparation
- Part 2: Upgrade Testing
- Part 3: Upgrade Execution
- Part 4: Rollback and Post-Upgrade Validation
- Part 5: Change Management, Troubleshooting, and Checklist (You Are Here)