Mysql
 sql >> Database >  >> RDS >> Mysql

Suggerimenti per l'aggiornamento da MySQL 5.7 a MySQL 8

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.