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.