sql >> Base de Datos >  >> RDS >> Mysql

Consejos para actualizar de MySQL 5.7 a MySQL 8

MySQL 8.0 ya lleva bastante tiempo con nosotros y muchos usuarios de MySQL ya se han actualizado a esta versión. Para aquellos que aún utilizan versiones anteriores de MySQL, nos gustaría presentar este blog donde compartiremos algunos consejos e información que ayudarán en el proceso de actualización de MySQL 8.0.

Cuide su versión

Las versiones de software son muy importantes en el proceso de actualización. Para empezar, solo se admite una diferencia de versión principal. Debe ejecutar MySQL 5.7 antes de poder actualizar a MySQL 8.0. Es muy importante tener esto en cuenta dado que MySQL 5.6 se acerca al final de su vida útil y ya no será compatible. Todos los que usan MySQL 5.6 deben asegurarse de actualizarlo primero a MySQL 5.7 y luego, eventualmente, a MySQL 8.0.

Lo que se recomienda enfáticamente es que actualice a la última versión disponible para MySQL 5.7. En el momento de escribir este blog era 5.7.31 pero esto eventualmente cambiará, siempre puedes buscarlo en el sitio web de MySQL.

Tenga en cuenta también que las actualizaciones de versiones que no son de GA (y a versiones que no son de GA) no son compatibles. No es que tenga ningún sentido ejecutar versiones que no sean de GA en producción, pero también queríamos aclarar esto.

Es un billete de ida

Siempre que decida realizar la actualización, tenga en cuenta que, una vez que se completa la actualización, no hay vuelta atrás. Los cambios no son compatibles y simplemente no puede usar el directorio de datos de MySQL 8.0 en MySQL 5.7. Asegúrese de realizar una copia de seguridad de sus datos de MySQL 5.7 directamente antes de la actualización; podrá restaurarlos en la instancia de MySQL 5.7 en caso de que necesite revertir el cambio. También tenga en cuenta, ya que puede ser una sorpresa, que la actualización de MySQL 8.0.x a MySQL 8.0.x+1 también puede no ser compatible y, aunque se trata de una actualización de versión menor, no debe esperar esa actualización. sería posible. Este es el resultado del ciclo de implementación de Oracle:en lugar de congelar funciones para la rama GA más reciente, como era el caso con las versiones anteriores, las nuevas funciones, a veces incompatibles, se envían como nuevas versiones de la rama 8.0.

La actualización local es un Go

En el pasado, no siempre era posible realizar una actualización in situ de MySQL. En algunos casos, se vio obligado a volcar los datos en formato SQL y luego volver a cargarlos en la nueva versión. Afortunadamente, MySQL 8.0 es más fácil de administrar y se admite la actualización en el lugar. Todo lo que necesita hacer es ejecutar apt upgrade o yum update y ya está todo listo. La actualización es aún más conveniente:en el pasado, había que tener en cuenta ejecutar mysql_upgrade para garantizar que todas las tablas del sistema se actualicen correctamente al formato requerido por la nueva versión de MySQL. En MySQL 8.0, a partir de MySQL 8.0.16, esto ya no es necesario; todo lo que tiene que hacer es iniciar el proceso de MySQL, mysqld y, de forma predeterminada, la actualización se realizará sobre el diccionario de datos y otros esquemas del sistema cuando sea necesario. determinado como requerido. Es posible cambiar este comportamiento pasando diferentes parámetros a la opción --upgrade server pero en la mayoría de los casos le gustaría beneficiarse de esta mejora.

¿Es seguro actualizar?

Por supuesto, existen requisitos previos para la actualización segura. Echemos un vistazo a algunos métodos que deberían ayudarlo a asegurarse de que puede actualizar a MySQL 8.0 de manera segura.

Comprobaciones de estado

Antes de intentar cualquier cosa, debe verificar que su configuración actual de MySQL 5.7 marque todas las casillas en la lista de verificación de cordura antes de actualizar a MySQL 8.0. La documentación de MySQL presenta una extensa lista de cosas para probar. No tiene sentido repasar la lista aquí, ya que está cubierta en la documentación de MySQL, pero aquí hay un par de puntos que quizás desee tener en cuenta.

Primero, el particionamiento ahora solo se admite en los motores que lo implementan en su extremo, que son solo NDB e InnoDB. Asegúrese de que todas las tablas particionadas utilicen uno de esos motores de almacenamiento o elimine la partición antes de la actualización.

Es posible que desee correr

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

para verificar que las tablas tengan el formato correcto.

También hay otras comprobaciones que debe realizar:casi todas las versiones nuevas de MySQL vienen con una lista actualizada de palabras reservadas y debe verificar que no las use en su base de datos. Debe verificar los nombres de restricciones de clave externa, no pueden tener más de 64 caracteres. Se han eliminado algunas opciones para sql_mode, por lo que debe asegurarse de no usarlas. Como mencionamos, hay una extensa lista de cosas para probar.

MySQL Shell al rescate

Probar todas esas condiciones requiere bastante tiempo, por lo que Oracle creó una opción en MySQL Shell que tiene como objetivo ejecutar una serie de pruebas para verificar si su instalación existente es segura para actualizar a MySQL 8.0. Para empezar, si no tiene instalado MySQL Shell, debe hacerlo. Puede encontrar descargas en el sitio web de Oracle. Una vez que lo configure, puede conectarse a su MySQL 5.7 y ejecutar la prueba. Veamos cómo puede verse:

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

Nos conectamos a la instancia de MySQL en el host local usando MySQL Shell. Ahora podemos ejecutar la comprobación. Pasaremos la ruta al archivo de configuración para pruebas más extensas:

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

Entonces tenemos una salida larga.

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.

Como puede ver, se han realizado 21 pruebas en total, la verificación ha encontrado 3 errores relacionados con las opciones de configuración que no existirán en MySQL 8.0.21. Las pruebas son bastante detalladas. Entre otras cosas, aprenderá acerca de los cambios en los valores predeterminados para las variables que no ha configurado en su configuración de MySQL (por lo tanto, esas configuraciones cambiarán una vez que instale MySQL 8.0).

Revertir una actualización fallida

Como mencionamos antes, no puede cambiar a una versión anterior de MySQL 8.0 una vez que se completa la actualización. Afortunadamente, no significa que no pueda revertir la actualización si falla en el medio. En realidad, sucede de forma semiautomática si se detecta uno de los problemas que discutimos en la sección anterior. La única acción manual que se requiere sería eliminar los registros de rehacer e iniciar MySQL 5.7 para solucionar los problemas detectados durante la actualización. Luego, debe realizar un apagado lento (innodb_fast_shutdown=0) para asegurarse de que todo esté escrito en los espacios de tabla y luego esté listo para intentar la actualización una vez más.

Consejos finales

Hay dos cambios bastante importantes en el comportamiento predeterminado que viene con MySQL 8.0 que nos gustaría destacar.

Caching_sha2_password como predeterminado

Asegúrese de verificar dos veces si sus aplicaciones y proxies funcionarán correctamente con el complemento de autenticación caching_sha2_password, ya que se convierte en el predeterminado en MySQL 8.0. Es posible que las aplicaciones más antiguas se vean afectadas y no puedan conectarse a la base de datos. Por supuesto, puede cambiar esto a cualquier complemento de autenticación que desee (como mysql_native_password, por ejemplo, ya que era el predeterminado en las versiones anteriores de MySQL) para que no sea un bloqueador de ninguna manera. Es algo que debe recordar probar antes de la actualización para que no termine con MySQL 8.0 y las aplicaciones que no pueden conectarse a menos que reconfigure su base de datos para usar un mecanismo de autenticación más antiguo.

UTF8mb4 como juego de caracteres predeterminado

Esto no debería ser una sorpresa dado que la comunidad discutió ampliamente el cambio a UTF8, pero ese es el hecho:MySQL 8.0 viene con el conjunto de caracteres UTF8mb4 como predeterminado. Esto tiene un impacto adicional que debe tener en cuenta. Primero, el tamaño de su conjunto de datos podría aumentar si usa el juego de caracteres UTF8mb4. Esto lleva a que los búferes de memoria puedan almacenar cantidades más pequeñas de datos que los datos con el conjunto de caracteres latin1. En segundo lugar, se espera que se reduzca el rendimiento de MySQL. Claro, Oracle hizo un gran trabajo al minimizar el impacto de este cambio, pero no puede esperar que no haya ningún impacto en el rendimiento, lo habrá.

Esperamos que esta publicación de blog lo ayude a realizar el proceso de actualización de MySQL 5.7 a MySQL 8.0. Si tiene alguna opinión sobre el proceso, lo alentamos a que la comparta en los comentarios debajo de esta publicación.