MySQL 8.0 è già con noi da un po' di tempo e molti utenti MySQL hanno già aggiornato a questa versione. Per coloro che stanno ancora utilizzando versioni precedenti di MySQL, vorremmo presentare questo blog in cui condivideremo alcuni suggerimenti e informazioni che aiutano nel processo di aggiornamento per MySQL 8.0.
Attento alla tua versione
Le versioni del software sono piuttosto importanti nel processo di aggiornamento. Per cominciare, è supportata solo una differenza di versione principale. È necessario eseguire MySQL 5.7 prima di poter eseguire l'aggiornamento a MySQL 8.0. Questo è abbastanza importante da tenere a mente dato che MySQL 5.6 si sta avvicinando alla fine del suo ciclo di vita e non sarà più supportato. Per tutti voi che usate MySQL 5.6 dovete assicurarvi di aggiornarlo prima a MySQL 5.7 e poi, eventualmente, a MySQL 8.0.
Quello che è fortemente raccomandato è di aggiornare all'ultima versione disponibile per MySQL 5.7. Al momento della stesura di questo blog era 5.7.31 ma questo alla fine cambierà, puoi sempre cercarlo sul sito Web di MySQL.
Si noti inoltre che gli aggiornamenti da versioni non GA (e non GA) non sono supportati. Non che abbia senso eseguire versioni non GA in produzione, ma volevamo chiarire anche questo.
È un biglietto di sola andata
Ogni volta che decidi di eseguire l'aggiornamento, tieni presente che, una volta completato l'aggiornamento, non è possibile tornare indietro. Le modifiche non sono compatibili e semplicemente non puoi utilizzare la directory dei dati da MySQL 8.0 su MySQL 5.7. Assicurati di eseguire un backup dei dati di MySQL 5.7 direttamente prima dell'aggiornamento:sarai in grado di ripristinarlo sull'istanza di MySQL 5.7 se dovessi ripristinare la modifica. Tieni inoltre presente, poiché potrebbe sorprendere, che l'aggiornamento da MySQL 8.0.x a MySQL 8.0.x+1 potrebbe anche non essere compatibile e, anche se si tratta di un aggiornamento di versione minore, non dovresti aspettarti quel downgrade sarebbe possibile. Questo è il risultato del ciclo di distribuzione di Oracle:invece di eseguire il blocco delle funzionalità per l'ultimo ramo GA, come avveniva con le versioni precedenti, le nuove funzionalità, a volte incompatibili, vengono inviate come nuove versioni del ramo 8.0.
L'aggiornamento sul posto è a portata di mano
In passato non era sempre possibile eseguire un aggiornamento sul posto di MySQL. In alcuni casi sei stato costretto a scaricare i dati in formato SQL e quindi caricarli di nuovo nella nuova versione. Fortunatamente, MySQL 8.0 è più intuitivo e l'aggiornamento sul posto è supportato. Tutto quello che devi fare è eseguire apt upgrade o yum update e sei pronto. L'aggiornamento è ancora più conveniente:in passato si doveva tenere a mente di eseguire mysql_upgrade per assicurarsi che tutte le tabelle di sistema fossero aggiornate correttamente al formato richiesto dalla nuova versione di MySQL. In MySQL 8.0, a partire da MySQL 8.0.16, questo non è più necessario:tutto ciò che devi fare è avviare il processo MySQL, mysqld e, per impostazione predefinita, l'aggiornamento verrà eseguito sul dizionario dei dati e su altri schemi di sistema ogni volta che è determinato ad essere richiesto. È possibile modificare questo comportamento passando diversi parametri all'opzione --upgrade server, ma nella maggior parte dei casi vorresti beneficiare di questo miglioramento.
Sono sicuro di eseguire l'upgrade?
Certo, ci sono i prerequisiti per l'aggiornamento sicuro. Diamo un'occhiata ad alcuni metodi che dovrebbero aiutarti ad assicurarti di poter aggiornare in sicurezza a MySQL 8.0.
Controlli di integrità
Prima di tentare qualsiasi cosa, dovresti ricontrollare che la tua configurazione MySQL 5.7 esistente selezioni tutte le caselle dell'elenco di controllo della sanità mentale prima di eseguire l'aggiornamento a MySQL 8.0. La documentazione di MySQL presenta un ampio elenco di cose da testare. Non ha senso esaminare l'elenco qui poiché è trattato nella documentazione di MySQL, ma qui ci sono un paio di punti che potresti voler tenere a mente.
In primo luogo, il partizionamento è ora supportato solo nei motori che lo implementano, che sono solo NDB e InnoDB. Assicurati che tutte le tabelle partizionate utilizzino uno di questi motori di archiviazione o di rimuovere il partizionamento prima dell'aggiornamento.
Potresti voler correre
mysqlcheck -u root -p --all-databases --check-upgrade
per ricontrollare che le tabelle siano nel formato corretto.
Ci sono anche altri controlli che dovresti eseguire:quasi ogni nuova versione di MySQL viene fornita con un elenco aggiornato di parole riservate e dovresti controllare di non usarle nel tuo database. È necessario controllare i nomi dei vincoli di chiave esterna, non possono essere più lunghi di 64 caratteri. Alcune opzioni per sql_mode sono state rimosse, quindi dovresti assicurarti di non usarle. Come accennato, c'è un ampio elenco di cose da testare.
Shell MySQL in soccorso
Testare tutte queste condizioni richiede molto tempo, quindi Oracle ha creato un'opzione nella shell MySQL che ha lo scopo di eseguire una serie di test per verificare se l'installazione esistente è sicura per l'aggiornamento a MySQL 8.0. Per cominciare, se non hai installato MySQL Shell, dovresti farlo. Puoi trovare i download sul sito Web di Oracle. Una volta configurato, puoi connetterti a MySQL 5.7 ed eseguire il test. Vediamo come può essere:
[email protected]:~# mysqlsh
MySQL Shell 8.0.21
Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.
Type '\help' or '\?' for help; '\quit' to exit.
MySQL JS > \c [email protected]
Creating a session to '[email protected]'
Please provide the password for '[email protected]': ****
Save password for '[email protected]'? [Y]es/[N]o/Ne[v]er (default No):
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 71 (X protocol)
Server version: 5.7.31-log MySQL Community Server (GPL)
No default schema selected; type \use <schema> to set one.
Ci siamo connessi all'istanza MySQL sull'host locale utilizzando MySQL Shell. Ora possiamo eseguire il controllo. Passeremo il percorso al file di configurazione per test più estesi:
MySQL localhost:33060+ ssl JS > util.checkForServerUpgrade({"configPath":"/etc/mysql/my.cnf"})
Allora abbiamo un output lungo.
The MySQL server at localhost:33060, version 5.7.31-log - MySQL Community
Server (GPL), will now be checked for compatibility issues for upgrade to MySQL
8.0.21...
1) Usage of old temporal type
No issues found
2) Usage of db objects with names conflicting with new reserved keywords
No issues found
3) Usage of utf8mb3 charset
No issues found
4) Table names in the mysql schema conflicting with new tables in 8.0
No issues found
5) Partitioned tables using engines with non native partitioning
No issues found
6) Foreign key constraint names longer than 64 characters
No issues found
7) Usage of obsolete MAXDB sql_mode flag
No issues found
8) Usage of obsolete sql_mode flags
No issues found
9) ENUM/SET column definitions containing elements longer than 255 characters
No issues found
10) Usage of partitioned tables in shared tablespaces
No issues found
11) Circular directory references in tablespace data file paths
No issues found
12) Usage of removed functions
No issues found
13) Usage of removed GROUP BY ASC/DESC syntax
No issues found
14) Removed system variables for error logging to the system log configuration
No issues found
15) Removed system variables
Error: Following system variables that were detected as being used will be
removed. Please update your system to not rely on them before the upgrade.
More information:
https://dev.mysql.com/doc/refman/8.0/en/added-deprecated-removed.html#optvars-removed
log_warnings - is set and will be removed, consider using log_error_verbosity
instead
query_cache_size - is set and will be removed
query_cache_type - is set and will be removed
16) System variables with new default values
Warning: Following system variables that are not defined in your
configuration file will have new default values. Please review if you rely on
their current values and if so define them before performing upgrade.
More information:
https://mysqlserverteam.com/new-defaults-in-mysql-8-0/
back_log - default value will change
character_set_server - default value will change from latin1 to utf8mb4
collation_server - default value will change from latin1_swedish_ci to
utf8mb4_0900_ai_ci
event_scheduler - default value will change from OFF to ON
explicit_defaults_for_timestamp - default value will change from OFF to ON
innodb_flush_neighbors - default value will change from 1 (enable) to 0
(disable)
innodb_max_dirty_pages_pct - default value will change from 75 (%) 90 (%)
innodb_max_dirty_pages_pct_lwm - default value will change from_0 (%) to 10
(%)
innodb_undo_log_truncate - default value will change from OFF to ON
innodb_undo_tablespaces - default value will change from 0 to 2
log_error_verbosity - default value will change from 3 (Notes) to 2 (Warning)
max_error_count - default value will change from 64 to 1024
optimizer_trace_max_mem_size - default value will change from 16KB to 1MB
performance_schema_consumer_events_transactions_current - default value will
change from OFF to ON
performance_schema_consumer_events_transactions_history - default value will
change from OFF to ON
slave_rows_search_algorithms - default value will change from 'INDEX_SCAN,
TABLE_SCAN' to 'INDEX_SCAN, HASH_SCAN'
transaction_write_set_extraction - default value will change from OFF to
XXHASH64
17) Zero Date, Datetime, and Timestamp values
No issues found
18) Schema inconsistencies resulting from file removal or corruption
No issues found
19) Tables recognized by InnoDB that belong to a different engine
No issues found
20) Issues reported by 'check table x for upgrade' command
No issues found
21) New default authentication plugin considerations
Warning: The new default authentication plugin 'caching_sha2_password' offers
more secure password hashing than previously used 'mysql_native_password'
(and consequent improved client connection authentication). However, it also
has compatibility implications that may affect existing MySQL installations.
If your MySQL installation must serve pre-8.0 clients and you encounter
compatibility issues after upgrading, the simplest way to address those
issues is to reconfigure the server to revert to the previous default
authentication plugin (mysql_native_password). For example, use these lines
in the server option file:
[mysqld]
default_authentication_plugin=mysql_native_password
However, the setting should be viewed as temporary, not as a long term or
permanent solution, because it causes new accounts created with the setting
in effect to forego the improved authentication security.
If you are using replication please take time to understand how the
authentication plugin changes may impact you.
More information:
https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-compatibility-issues
https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-replication
Errors: 3
Warnings: 18
Notices: 0
3 errors were found. Please correct these issues before upgrading to avoid compatibility issues.
Come puoi vedere, sono stati eseguiti 21 test in totale, il controllo ha rilevato 3 errori relativi alle opzioni di configurazione che non esisteranno in MySQL 8.0.21. I test sono abbastanza dettagliati. Tra le altre cose imparerai le modifiche ai valori predefiniti per le variabili che non hai configurato nella configurazione di MySQL (quindi, tali impostazioni cambieranno una volta installato MySQL 8.0).
Ripristino di un aggiornamento non riuscito
Come accennato in precedenza, non è possibile eseguire il downgrade da MySQL 8.0 una volta completato l'aggiornamento. Fortunatamente, ciò non significa che non puoi ripristinare l'aggiornamento se non riesce nel mezzo. In realtà, accade in modo semiautomatico se viene rilevato uno dei problemi discussi nella sezione precedente. L'unica azione manuale necessaria sarebbe rimuovere i registri di ripristino e avviare MySQL 5.7 per risolvere i problemi rilevati durante l'aggiornamento. Quindi dovresti eseguire uno spegnimento lento (innodb_fast_shutdown=0) per assicurarti che tutto sia scritto nei tablespace e quindi sei a posto per tentare l'aggiornamento ancora una volta.
Suggerimenti finali
Ci sono due modifiche piuttosto importanti nel comportamento predefinito di MySQL 8.0 che vorremmo evidenziare.
Caching_sha2_password come predefinito
Assicurati di ricontrollare se le tue applicazioni e proxy funzioneranno correttamente con il plug-in di autenticazione caching_sha2_password poiché diventa quello predefinito in MySQL 8.0. Le applicazioni meno recenti potrebbero essere interessate e non essere in grado di connettersi al database. Ovviamente, puoi cambiarlo in qualsiasi plug-in di autenticazione desideri (come mysql_native_password, ad esempio, poiché era l'impostazione predefinita nelle precedenti versioni di MySQL), quindi non è un blocco in alcun modo. È solo qualcosa da ricordare di testare prima dell'aggiornamento in modo da non ritrovarsi con MySQL 8.0 e app che non possono connettersi ad esso a meno che non si riconfiguri il database per utilizzare un meccanismo di autenticazione precedente.
UTF8mb4 come set di caratteri predefinito
Questa non dovrebbe essere una sorpresa dato il modo in cui è stato ampiamente discusso nella community di UTF8, ma questo è il fatto:MySQL 8.0 viene fornito con il set di caratteri UTF8mb4 come predefinito. Questo ha un impatto aggiuntivo di cui dovresti essere a conoscenza. Innanzitutto, la dimensione del tuo set di dati potrebbe aumentare se utilizzerai il set di caratteri UTF8mb4. Ciò fa sì che i buffer di memoria siano in grado di memorizzare quantità di dati inferiori rispetto ai dati con set di caratteri latin1. In secondo luogo, le prestazioni di MySQL dovrebbero essere ridotte. Certo, Oracle ha fatto un ottimo lavoro nel ridurre al minimo l'impatto di questo cambiamento, ma non puoi aspettarti che non ci sarà alcun impatto sulle prestazioni:sarà un po'.
Ci auguriamo che questo post sul blog ti aiuti a completare il processo di aggiornamento da MySQL 5.7 a MySQL 8.0. Se hai i tuoi pensieri sul processo, ti invitiamo a condividerli nei commenti sotto questo post.