You are here
Upgrade MySQL 5.7 to MySQL 8.0
Early adopters of our customers are considering to upgrade to MySQL 8.0. To be prepared we have created a check-list:
- RTFM: Upgrading MySQL. Really! This time is different than all the years before...
- Upgrade Path:
    - Only Upgrade from 5.7 to 8.0 is supported (skipping 5.7 is NOT supported!). So Upgrade to 5.7 first!
- Only Upgrade between GA releases (5.7.9+, 8.0.11+) is supported.
- Recommended: Upgrade to newest 5.7 first (5.7.25).
 
- Check for Incompatibility Changes, Deprecated and Removed Features:
    - Incompatibility Changes in MySQL 8.0
- Removals:
        - Query Cache was removed.
- No support for non-native partitioning (MyISAM, Archive, etc.)
- Reserved keywords (application changes)
- No own tables in MySQL schema
- No Foreign Key Constraint names longer than 64 characters
- No obsolete sql_modedefinitions (requires application changes)
- Check ENUMandSETlength (< 255 characters/1020 bytes)
- No tables in System Tablespace (ibdata1) or General Tablespaces!
- GROUP BYwith- ASCor- DESCis deprecated (application change)
- log_errors/- log_warnings
- PASSWORD()
 
- Reserved Keywords
- Server Variables
- Default Changes
        - Character Set (utf8mb4)
- Default authentication plugin → Application impact.
- log_bin = ON
 
- Some database (admin) tools and applications might not work any more after upgrade!
 
- Upgrade MySQL language Interfaces as well!
 PHP: mysqli/mysqlnd, Perl: DBD::mysql, Python: MySQLdb, Java: Connector/J,...
- Test Upgrade AND Application first on a testing system created with a Physical Backup!
- Read Release Notes: New policy: Changes WITHIN Major Release Series are possible (= New Features)!
- Prepare Upgrade
    - Check for Upgrade
      shell> mysqlcheck --user=root --all-databases --check-upgrade 
- MySQL Upgrade from MySQL 8.0 Shell is recommended!
- Install MySQL Shell 8.0
      shell> ./mysqlsh root: @localhost:3306 mysql-js> util.help("checkForServerUpgrade"); mysql-js> util.checkForServerUpgrade() or shell> ./mysqlsh root:@localhost:3306 -e "util.checkForServerUpgrade();" 
 
- Check for Upgrade
      
- Backup before Upgrade preparation!
- Fix findings from MySQL Upgrade Check first!
- Backup!
 Downgrade is NOT supported!!!
- Upgrade types:
    - physical (inplace) Upgrade
- logical Upgrade
 
- Physical (inplace) Upgrade
    - mysql> XA RECOVER; 
- Rotate Keyring Master Key:
      mysql> ALTER INSTANCE ROTATE INNODB MASTER KEY; 
- mysql> SET GLOBAL innodb_fast_shutdown = 0; 
- Shutdown old MySQL 5.7 Server.
- Exchange binaries.
- Adjust MySQL Configuration (my.cnf).
- Start new MySQL 8.0 Server
 
- Logical (dump/restore) Upgrade
    - mysql> mysqldump --user=root --all-databases --events > full_dump.sql 
- Shutdown old MySQL 5.7 Server.
- Exchange binaries.
- Remove old Instance (shell> rm -rf /var/lib/mysql/*)
- Adjust MySQL Configuration (my.cnf).
- Create a new, empty MySQL 8.0 Instance:
- mysql> mysqld --initialize-insecure --datadir=/var/lib/mysql 
- Start new MySQL 8.0 Server
- Restore dump: shell> mysql --user=root --force < full_dump.sql(Might take some very long time)ERROR 3554 (HY000) at line 6400: Access to system table 'mysql.innodb_index_stats' is rejected. ERROR 1062 (23000) at line 6402: Duplicate entry 'Journal-Events-PRIMARY-n_diff_pfx01' for key 'PRIMARY' ERROR 3554 (HY000) at line 6410: Access to system table 'mysql.innodb_table_stats' is rejected. ERROR 1062 (23000) at line 6430: Duplicate entry 'Journal-Events' for key 'PRIMARY' 
 
- Post Upgrade work
    - shell> mysql_upgrade --user=root(might take some very long time).
- shell> mysql --user=root mysql < share/fill_help_tables.sql(seems to not exist any more in 8.0.15... Bug?)
- Restart Server
- Check Error Log
- Do a backup again.
 
 
      


