Mysql
 sql >> Base de données >  >> RDS >> Mysql

Conseils pour la mise à niveau de MySQL 5.7 vers MySQL 8

MySQL 8.0 est déjà avec nous depuis un certain temps et de nombreux utilisateurs de MySQL ont déjà mis à niveau vers cette version. Pour ceux qui utilisent encore des versions plus anciennes de MySQL, nous aimerions présenter ce blog où nous partagerons quelques conseils et informations qui vous aideront dans le processus de mise à niveau vers MySQL 8.0.

Attention à votre version

Les versions logicielles sont très importantes dans le processus de mise à niveau. Pour commencer, une seule différence de version majeure est prise en charge. Vous devez exécuter MySQL 5.7 avant de pouvoir passer à MySQL 8.0. Ceci est très important à garder à l'esprit étant donné que MySQL 5.6 approche de sa fin de vie et qu'il ne sera plus pris en charge. Pour tous ceux d'entre vous qui utilisent MySQL 5.6, vous devez d'abord vous assurer de le mettre à niveau vers MySQL 5.7, puis, éventuellement, vers MySQL 8.0.

Il est fortement recommandé de mettre à niveau vers la dernière version disponible pour MySQL 5.7. Au moment de la rédaction de ce blog, c'était le 5.7.31, mais cela finira par changer, vous pouvez toujours le rechercher sur le site Web de MySQL.

Veuillez également noter que les mises à niveau à partir de versions non GA (et vers des versions non GA) ne sont pas prises en charge. Non pas qu'il soit logique d'exécuter des versions non GA en production, mais nous voulions également clarifier celle-ci.

C'est un aller simple

Chaque fois que vous décidez d'effectuer la mise à niveau, sachez qu'une fois la mise à niveau terminée, vous ne pourrez plus revenir en arrière. Les modifications ne sont pas compatibles et vous ne pouvez tout simplement pas utiliser le répertoire de données de MySQL 8.0 sur MySQL 5.7. Assurez-vous d'effectuer une sauvegarde de vos données MySQL 5.7 juste avant la mise à niveau - vous pourrez les restaurer sur l'instance MySQL 5.7 si vous devez annuler la modification. Veuillez également garder à l'esprit, car cela peut surprendre, que la mise à niveau de MySQL 8.0.x vers MySQL 8.0.x + 1 peut également ne pas être compatible et, même s'il s'agit d'une mise à niveau de version mineure, vous ne devez pas vous attendre à ce rétrogradation serait possible. C'est le résultat du cycle de déploiement d'Oracle - au lieu de geler les fonctionnalités pour la dernière branche GA, comme c'était le cas avec les versions précédentes, de nouvelles fonctionnalités, parfois incompatibles, sont poussées en tant que nouvelles versions de la branche 8.0.

La mise à niveau sur place est un Go

Dans le passé, il n'était pas toujours possible d'effectuer une mise à niveau sur place de MySQL. Dans certains cas, vous avez été obligé de vider les données au format SQL, puis de les recharger dans la nouvelle version. Heureusement, MySQL 8.0 est plus convivial pour les administrateurs et la mise à niveau sur place est prise en charge. Tout ce que vous avez à faire est d'exécuter apt upgrade ou yum update et vous êtes prêt. La mise à niveau est encore plus pratique - dans le passé, il fallait garder à l'esprit d'exécuter mysql_upgrade pour s'assurer que toutes les tables système sont correctement mises à niveau au format requis par la nouvelle version de MySQL. Dans MySQL 8.0, à partir de MySQL 8.0.16, cela n'est plus nécessaire - tout ce que vous avez à faire est de démarrer le processus MySQL, mysqld, et, par défaut, la mise à niveau sera effectuée sur le dictionnaire de données et d'autres schémas système chaque fois qu'il est jugée nécessaire. Il est possible de modifier ce comportement en passant différents paramètres à l'option serveur --upgrade mais dans la majorité des cas vous aimeriez bénéficier de cette amélioration.

Puis-je mettre à niveau en toute sécurité ?

Bien sûr, il y a des conditions préalables pour la mise à niveau en toute sécurité. Examinons quelques méthodes qui devraient vous aider à vous assurer que vous pouvez effectuer une mise à niveau vers MySQL 8.0 en toute sécurité.

Vérifications d'intégrité

Avant de tenter quoi que ce soit, vous devez vérifier que votre configuration MySQL 5.7 existante coche toutes les cases de la liste de vérification avant de passer à MySQL 8.0. La documentation MySQL présente une longue liste de choses à tester. Cela n'a pas de sens de parcourir la liste ici car elle est couverte dans la documentation MySQL, mais voici quelques points que vous voudrez peut-être garder à l'esprit.

Tout d'abord, le partitionnement n'est désormais pris en charge que dans les moteurs qui l'implémentent de leur côté, c'est-à-dire NDB et InnoDB uniquement. Assurez-vous que toutes les tables partitionnées utilisent l'un de ces moteurs de stockage ou que vous supprimez le partitionnement avant la mise à niveau.

Vous voudrez peut-être courir

mysqlcheck -u root -p --all-databases --check-upgrade

pour revérifier que les tableaux sont au bon format.

Il existe également d'autres vérifications que vous devez effectuer - presque chaque nouvelle version de MySQL est livrée avec une liste mise à jour de mots réservés et vous devez vérifier que vous ne les utilisez pas dans votre base de données. Vous devez vérifier les noms des contraintes de clé étrangère, ils ne peuvent pas dépasser 64 caractères. Certaines options pour sql_mode ont été supprimées, vous devez donc vous assurer de ne pas les utiliser. Comme nous l'avons mentionné, il existe une longue liste de choses à tester.

MySQL Shell à la rescousse

Tester toutes ces conditions prend beaucoup de temps, c'est pourquoi Oracle a créé une option dans MySQL Shell qui est destinée à exécuter une série de tests pour vérifier si votre installation existante peut être mise à niveau vers MySQL 8.0 en toute sécurité. Pour commencer, si vous n'avez pas installé MySQL Shell, vous devriez le faire. Vous pouvez trouver des téléchargements sur le site Web d'Oracle. Une fois que vous l'avez configuré, vous pouvez vous connecter à votre MySQL 5.7 et exécuter le test. Voyons à quoi cela peut ressembler :

[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.

Nous nous sommes connectés à l'instance MySQL sur l'hôte local à l'aide de MySQL Shell. Nous pouvons maintenant lancer la vérification. Nous vous transmettrons le chemin d'accès au fichier de configuration pour des tests plus approfondis :

MySQL  localhost:33060+ ssl  JS > util.checkForServerUpgrade({"configPath":"/etc/mysql/my.cnf"})

Ensuite, nous avons une longue sortie.

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.

Comme vous pouvez le voir, 21 tests au total ont été effectués, la vérification a trouvé 3 erreurs liées aux options de configuration qui n'existeront pas dans MySQL 8.0.21. Les tests sont assez détaillés. Entre autres choses, vous apprendrez les changements dans les valeurs par défaut pour les variables que vous n'avez pas configurées dans votre configuration MySQL (ainsi, ces paramètres changeront une fois que vous aurez installé MySQL 8.0).

Annuler une mise à jour ayant échoué

Comme nous l'avons mentionné précédemment, vous ne pouvez pas rétrograder à partir de MySQL 8.0 une fois la mise à niveau terminée. Heureusement, cela ne signifie pas que vous ne pouvez pas annuler la mise à niveau si elle échoue au milieu. En fait, cela se produit semi-automatiquement si l'un des problèmes dont nous avons discuté dans la section précédente est détecté. La seule action manuelle requise serait de supprimer les journaux redo et de démarrer MySQL 5.7 pour résoudre les problèmes détectés lors de la mise à niveau. Ensuite, vous devez effectuer un arrêt lent (innodb_fast_shutdown=0) pour vous assurer que tout est écrit dans les espaces de table, puis vous êtes tous prêts à tenter la mise à niveau une fois de plus.

Conseils finaux

Il y a deux changements assez importants dans le comportement par défaut fourni avec MySQL 8.0 que nous aimerions souligner.

Caching_sha2_password par défaut

Veuillez vous assurer de bien vérifier si vos applications et proxys fonctionneront correctement avec le plug-in d'authentification caching_sha2_password car il devient celui par défaut dans MySQL 8.0. Les applications plus anciennes peuvent être affectées et ne pas pouvoir se connecter à la base de données. Bien sûr, vous pouvez changer cela en n'importe quel plugin d'authentification que vous voulez (comme mysql_native_password par exemple, car c'était la valeur par défaut dans les versions précédentes de MySQL) afin que ce ne soit en aucun cas un bloqueur. N'oubliez pas de tester avant la mise à niveau afin de ne pas vous retrouver avec MySQL 8.0 et des applications qui ne peuvent pas s'y connecter à moins que vous ne reconfiguriez votre base de données pour utiliser un mécanisme d'authentification plus ancien.

UTF8mb4 comme jeu de caractères par défaut

Cela ne devrait pas être une surprise compte tenu de l'ampleur des discussions sur le passage à UTF8 dans la communauté, mais c'est le fait - MySQL 8.0 est livré avec le jeu de caractères UTF8mb4 par défaut. Cela a un impact supplémentaire dont vous devez être conscient. Tout d'abord, la taille de votre jeu de données peut augmenter si vous utilisez le jeu de caractères UTF8mb4. Cela conduit à des tampons de mémoire capables de stocker de plus petites quantités de données que pour les données avec le jeu de caractères latin1. Deuxièmement, les performances de MySQL devraient être réduites. Bien sûr, Oracle a fait un excellent travail pour minimiser l'impact de ce changement, mais vous ne pouvez pas vous attendre à ce qu'il n'y ait aucun impact sur les performances ; il y en aura.

Nous espérons que cet article de blog vous aidera à passer à travers le processus de mise à niveau de MySQL 5.7 vers MySQL 8.0. Si vous avez des idées sur le processus, nous vous encourageons à les partager dans les commentaires sous cet article.