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

Pasar de MySQL 5.7 a MySQL 8.0:lo que debe saber

Abril de 2018 no es solo una fecha para el mundo MySQL. Allí se lanzó MySQL 8.0, y más de 1 año después, probablemente sea hora de considerar migrar a esta nueva versión.

MySQL 8.0 tiene importantes mejoras de rendimiento y seguridad y, como en toda migración a una nueva versión de base de datos, hay varias cosas que se deben tener en cuenta antes de entrar en producción para evitar problemas graves como pérdida de datos, exceso tiempo de inactividad, o incluso una reversión durante la tarea de migración.

En este blog, mencionaremos algunas de las nuevas características de MySQL 8.0, algunas cosas obsoletas y lo que debe tener en cuenta antes de migrar.

¿Qué hay de nuevo en MySQL 8.0?

Resumamos ahora algunas de las características más importantes mencionadas en la documentación oficial para esta nueva versión de MySQL.

  • MySQL incorpora un diccionario de datos transaccionales que almacena información sobre los objetos de la base de datos.
  • Una declaración DDL atómica combina las actualizaciones del diccionario de datos, las operaciones del motor de almacenamiento y las escrituras de registros binarios asociadas con una operación DDL en una sola transacción atómica.
  • El servidor MySQL realiza automáticamente todas las tareas de actualización necesarias en el próximo inicio para actualizar las tablas del sistema en el esquema mysql, así como los objetos en otros esquemas, como el esquema sys y los esquemas de usuario. No es necesario que el DBA invoque mysql_upgrade.
  • Admite la creación y administración de grupos de recursos y permite asignar subprocesos que se ejecutan dentro del servidor a grupos particulares para que los subprocesos se ejecuten de acuerdo con los recursos disponibles para el grupo.
  • El cifrado de tablas ahora se puede administrar globalmente al definir y hacer cumplir los valores predeterminados de cifrado. La variable default_table_encryption define un valor predeterminado de cifrado para los esquemas recién creados y el tablespace general. Los valores predeterminados de cifrado se aplican habilitando la variable table_encryption_privilege_check.
  • El conjunto de caracteres predeterminado ha cambiado de latin1 a utf8mb4.
  • Admite el uso de expresiones como valores predeterminados en las especificaciones de tipos de datos. Esto incluye el uso de expresiones como valores predeterminados para los tipos de datos BLOB, TEXT, GEOMETRY y JSON.
  • El registro de errores se reescribió para usar la arquitectura de componentes de MySQL. El registro de errores tradicional se implementa mediante componentes integrados y el registro mediante el registro del sistema se implementa como un componente cargable.
  • Un nuevo tipo de bloqueo de copia de seguridad permite DML durante una copia de seguridad en línea y evita operaciones que podrían generar una instantánea incoherente. El nuevo bloqueo de copia de seguridad es compatible con la sintaxis LOCK INSTANCE FOR BACKUP y UNLOCK INSTANCE. Se requiere el privilegio BACKUP_ADMIN para usar estas declaraciones.
  • MySQL Server ahora permite configurar un puerto TCP/IP específicamente para conexiones administrativas. Esto proporciona una alternativa a la conexión administrativa única que se permite en las interfaces de red utilizadas para las conexiones ordinarias, incluso cuando las conexiones max_connections ya están establecidas.
  • Admite índices invisibles. El optimizador no utiliza este índice y permite probar el efecto de eliminar un índice en el rendimiento de la consulta, sin eliminarlo.
  • Almacén de documentos para desarrollar aplicaciones de documentos SQL y NoSQL usando una única base de datos.
  • MySQL 8.0 hace posible la persistencia de variables de servidor dinámicas globales utilizando el comando SET PERSIST en lugar del habitual SET GLOBAL.

Seguridad MySQL y administración de cuentas

Como hay muchas mejoras relacionadas con la seguridad y la administración de usuarios, las enumeraremos en una sección aparte.

  • Las tablas de concesión en la base de datos del sistema mysql ahora son tablas InnoDB.
  • El nuevo complemento de autenticación caching_sha2_password es ahora el método de autenticación predeterminado en MySQL 8.0. Implementa el hash de contraseña SHA-256, pero utiliza el almacenamiento en caché para abordar los problemas de latencia en el momento de la conexión. Proporciona un cifrado de contraseña más seguro que el complemento mysql_native_password y proporciona un mejor rendimiento que sha256_password.
  • MySQL ahora admite roles, que se denominan colecciones de privilegios. Los roles pueden tener privilegios otorgados y revocados, y se pueden otorgar y revocar de cuentas de usuario.
  • MySQL ahora mantiene información sobre el historial de contraseñas, lo que permite restringir la reutilización de contraseñas anteriores.
  • Permite a los administradores configurar cuentas de usuario de modo que demasiadas fallas de inicio de sesión consecutivas debido a contraseñas incorrectas provoquen el bloqueo temporal de la cuenta.

Mejoras de InnoDB

Al igual que el punto anterior, también hay muchas mejoras relacionadas con este tema, por lo que también las enumeraremos en una sección separada.

  • El valor máximo actual del contador de incremento automático se escribe en el registro de rehacer cada vez que cambia el valor y se guarda en una tabla del sistema privado del motor en cada punto de control. Estos cambios hacen que el valor del contador de incremento automático máximo actual sea persistente en los reinicios del servidor
  • Al encontrar daños en el árbol de índices, InnoDB escribe un indicador de corrupción en el registro de rehacer, lo que hace que el indicador de corrupción sea seguro contra fallas. InnoDB también escribe datos de indicadores de corrupción en la memoria en una tabla de sistema privado del motor en cada punto de control. Durante la recuperación, InnoDB lee los indicadores de corrupción de ambas ubicaciones y combina los resultados antes de marcar la tabla en memoria y los objetos de índice como corruptos.
  • Se puede usar una nueva variable dinámica, innodb_deadlock_detect, para deshabilitar la detección de puntos muertos. En los sistemas de alta simultaneidad, la detección de interbloqueos puede provocar una ralentización cuando numerosos subprocesos esperan el mismo bloqueo. A veces, puede ser más eficiente deshabilitar la detección de puntos muertos y confiar en la configuración innodb_lock_wait_timeout para la reversión de transacciones cuando se produce un punto muerto.
  • Las tablas temporales de InnoDB ahora se crean en el espacio de tabla temporal compartido, ibtmp1.
  • Las tablas del sistema mysql y las tablas del diccionario de datos ahora se crean en un solo archivo de espacio de tabla InnoDB llamado mysql.ibd en el directorio de datos de MySQL. Anteriormente, estas tablas se creaban en archivos individuales de espacios de tablas de InnoDB en el directorio de la base de datos mysql.
  • De forma predeterminada, los registros de deshacer ahora residen en dos espacios de tablas de deshacer que se crean cuando se inicializa la instancia de MySQL. Los registros de deshacer ya no se crean en el tablespace del sistema.
  • La nueva variable innodb_dedicated_server, que está deshabilitada de manera predeterminada, se puede usar para que InnoDB configure automáticamente las siguientes opciones según la cantidad de memoria detectada en el servidor:innodb_buffer_pool_size, innodb_log_file_size e innodb_flush_method. Esta opción está pensada para instancias de servidor MySQL que se ejecutan en un servidor dedicado.
  • Los archivos Tablespace se pueden mover o restaurar a una nueva ubicación mientras el servidor está fuera de línea usando la opción innodb_directories.

Ahora, echemos un vistazo a algunas de las funciones que ya no debería usar en esta nueva versión de MySQL.

¿Qué está obsoleto en MySQL 8.0?

Las siguientes funciones están obsoletas y se eliminarán en una versión futura.

  • El conjunto de caracteres utf8mb3 está en desuso. Utilice utf8mb4 en su lugar.
  • Debido a que caching_sha2_password es el complemento de autenticación predeterminado en MySQL 8.0 y proporciona un superconjunto de las capacidades del complemento de autenticación sha256_password, sha256_password está obsoleto.
  • El complemento de validate_password se ha vuelto a implementar para usar la infraestructura del componente del servidor. La forma de complemento de validate_password todavía está disponible pero está obsoleta.
  • La cláusula ENGINE para las sentencias ALTER TABLESPACE y DROP TABLESPACE.
  • El modo SQL PAD_CHAR_TO_FULL_LENGTH.
  • La compatibilidad con AUTO_INCREMENT está en desuso para columnas de tipo FLOAT y DOUBLE (y cualquier sinónimo). Considere eliminar el atributo AUTO_INCREMENT de tales columnas o convertirlas a un tipo de número entero.
  • El atributo UNSIGNED está en desuso para las columnas de tipo FLOAT, DOUBLE y DECIMAL (y cualquier sinónimo). Considere usar una restricción CHECK simple en su lugar para tales columnas.
  • La sintaxis FLOAT(M,D) y DOUBLE(M,D) para especificar el número de dígitos para las columnas de tipo FLOAT y DOUBLE (y cualquier sinónimo) es una extensión de MySQL no estándar. Esta sintaxis está obsoleta.
  • El estilo C no estándar &&, || y ! los operadores que son sinónimos de los operadores SQL estándar AND, OR y NOT, respectivamente, están en desuso. Las aplicaciones que usan operadores no estándar deben ajustarse para usar los operadores estándar.
  • El cliente mysql_upgrade está obsoleto porque sus capacidades para actualizar las tablas del sistema en el esquema del sistema mysql y los objetos en otros esquemas se han movido al servidor MySQL.
  • El archivo mysql_upgrade_info, que se crea en el directorio de datos y se utiliza para almacenar el número de versión de MySQL.
  • La variable de sistema relay_log_info_file y la opción --master-info-file están en desuso. Anteriormente, se usaban para especificar el nombre del registro de información del registro de retransmisión y el registro de información principal cuando se establecían relay_log_info_repository=FILE y master_info_repository=FILE, pero esas configuraciones quedaron obsoletas. El uso de archivos para el registro de información del registro de retransmisión y el registro de información maestro ha sido reemplazado por tablas esclavas a prueba de fallas, que son las predeterminadas en MySQL 8.0.
  • El uso de la variable de entorno MYSQL_PWD para especificar una contraseña de MySQL está en desuso.

Y ahora, echemos un vistazo a algunas de las funciones que debe dejar de usar en esta versión de MySQL.

¿Qué se eliminó en MySQL 8.0?

Las siguientes funciones se han eliminado en MySQL 8.0.

  • Se eliminó la variable del sistema innodb_locks_unsafe_for_binlog. El nivel de aislamiento LECTURA COMPROMETIDA proporciona una funcionalidad similar.
  • Uso de GRANT para crear usuarios. En su lugar, utilice CREAR USUARIO. Seguir esta práctica hace que el modo SQL NO_AUTO_CREATE_USER sea irrelevante para las sentencias GRANT, por lo que también se elimina y ahora se escribe un error en el registro del servidor cuando la presencia de este valor para la opción sql_mode en el archivo de opciones impide que mysqld se inicie.
  • Uso de GRANT para modificar las propiedades de la cuenta que no sean las asignaciones de privilegios. Esto incluye propiedades de autenticación, SSL y límite de recursos. En su lugar, establezca tales propiedades en el momento de la creación de la cuenta con CREAR USUARIO o modifíquelas después con ALTERAR USUARIO.
  • IDENTIFICADO POR CONTRASEÑA 'auth_string' sintaxis para CREAR USUARIO y OTORGAR. En su lugar, use IDENTIFICADO CON auth_plugin COMO 'auth_string' para CREAR USUARIO y ALTERAR USUARIO, donde el valor 'auth_string' está en un formato compatible con el complemento nombrado.
  • La función CONTRASEÑA(). Además, la eliminación de PASSWORD() significa que la sintaxis SET PASSWORD ... =PASSWORD('auth_string') ya no está disponible.
  • La variable de sistema old_passwords.
  • Las declaraciones FLUSH QUERY CACHE y RESET QUERY CACHE.
  • Estas variables del sistema:query_cache_limit, query_cache_min_res_unit, query_cache_size, query_cache_type, query_cache_wlock_invalidate.
  • Estas variables de estado:Qcache_free_blocks, Qcache_free_memory, Qcache_hits, Qcache_inserts, Qcache_lowmem_prunes, Qcache_not_cached, Qcache_queries_in_cache, Qcache_total_blocks.
  • Estos estados de subprocesos:verificación de privilegios en consultas almacenadas en caché, verificación de consultas en caché para una consulta, invalidación de entradas de caché de consultas, envío de resultados almacenados en caché al cliente, almacenamiento de resultados en la caché de consultas, espera de bloqueo de caché de consultas.
  • Se eliminaron las variables de sistema tx_isolation y tx_read_only. En su lugar, utilice transaction_isolation y transaction_read_only.
  • La variable del sistema sync_frm se eliminó porque los archivos .frm se volvieron obsoletos.
  • Se eliminaron la variable de sistema secure_auth y la opción de cliente --secure-auth. Se eliminó la opción MYSQL_SECURE_AUTH para la función C API mysql_options().
  • La variable de sistema log_warnings y la opción de servidor --log-warnings se han eliminado. Utilice la variable de sistema log_error_verbosity en su lugar.
  • Se eliminó el alcance global de la variable de sistema sql_log_bin. sql_log_bin solo tiene alcance de sesión, y las aplicaciones que dependen del acceso a @@GLOBAL.sql_log_bin deben ajustarse.
  • Se eliminan las variables de sistema date_format, datetime_format, time_format y max_tmp_tables que no se utilizan.
  • Se eliminan los calificadores ASC o DESC en desuso para las cláusulas GROUP BY. Las consultas que anteriormente dependían de la clasificación GROUP BY pueden producir resultados que difieren de las versiones anteriores de MySQL. Para producir un orden de clasificación determinado, proporcione una cláusula ORDER BY.
  • El analizador ya no trata a \N como sinónimo de NULL en las sentencias SQL. Utilice NULL en su lugar. Este cambio no afecta las operaciones de importación o exportación de archivos de texto realizadas con LOAD DATA o SELECT ... INTO OUTFILE, para las cuales NULL sigue representado por \N.
  • Se eliminaron las opciones --ssl y --ssl-verify-server-cert del lado del cliente. Use --ssl-mode=REQUIRED en lugar de --ssl=1 o --enable-ssl. Utilice --ssl-mode=DISABLED en lugar de --ssl=0, --skip-ssl o --disable-ssl. Use --ssl-mode=VERIFY_IDENTITY en lugar de las opciones --ssl-verify-server-cert.
  • El programa mysql_install_db se eliminó de las distribuciones de MySQL. La inicialización del directorio de datos debe realizarse invocando mysqld con la opción --initialize o --initialize-insecure en su lugar. Además, se eliminó la opción --bootstrap para mysqld que usaba mysql_install_db y se eliminó la opción INSTALL_SCRIPTDIR CMake que controlaba la ubicación de instalación de mysql_install_db.
  • Se eliminó la utilidad mysql_plugin. Las alternativas incluyen la carga de complementos al inicio del servidor usando la opción --plugin-load o --plugin-load-add, o en tiempo de ejecución usando la instrucción INSTALL PLUGIN.
  • Se elimina la utilidad resolveip. En su lugar, se pueden usar nslookup, host o dig.

Hay muchas funciones nuevas, obsoletas y eliminadas. Puede consultar el sitio web oficial para obtener información más detallada.

Consideraciones antes de migrar a MySQL 8.0

Mencionemos ahora algunas de las cosas más importantes a considerar antes de migrar a esta versión de MySQL.

Método de autenticación

Como mencionamos, caching_sha2_password no es el método de autenticación predeterminado, por lo que debe verificar si su aplicación/conector lo admite. De lo contrario, veamos cómo puede cambiar el método de autenticación predeterminado y el complemento de autenticación de usuario a 'mysql_native_password' nuevamente.

Para cambiar el método de autenticación predeterminado, edite el archivo de configuración my.cnf y agregue/edite la siguiente línea:

$ vi /etc/my.cnf

[mysqld]

default_authentication_plugin=mysql_native_password

Para cambiar el complemento de autenticación de usuario, ejecute el siguiente comando con un usuario privilegiado:

$ mysql -p

ALTER USER ‘username’@’hostname’ IDENTIFIED WITH ‘mysql_native_password’ BY ‘password’;

De todos modos, estos cambios no son una solución permanente, ya que la autenticación anterior podría quedar obsoleta pronto, por lo que debe tenerla en cuenta para una futura actualización de la base de datos.

También los roles son una característica importante aquí. Puede reducir los privilegios individuales asignándolo a un rol y agregando allí los usuarios correspondientes.

Por ejemplo, puede crear un nuevo rol para los equipos de marketing y desarrolladores:

$ mysql -p

CREATE ROLE 'marketing', 'developers';

Asigne privilegios a estos nuevos roles:

GRANT SELECT ON *.* TO 'marketing';

GRANT ALL PRIVILEGES ON *.* TO 'developers';

Y luego, asigne el rol a los usuarios:

GRANT 'marketing' TO 'marketing1'@'%';

GRANT 'marketing' TO 'marketing2'@'%';

GRANT 'developers' TO 'developer1'@'%';

Y eso es todo. Tendrá los siguientes privilegios:

SHOW GRANTS FOR 'marketing1'@'%';

+-------------------------------------------+

| Grants for [email protected]%                   |

+-------------------------------------------+

| GRANT USAGE ON *.* TO `marketing1`@`%`    |

| GRANT `marketing`@`%` TO `marketing1`@`%` |

+-------------------------------------------+

2 rows in set (0.00 sec)

SHOW GRANTS FOR 'marketing';

+----------------------------------------+

| Grants for [email protected]%                 |

+----------------------------------------+

| GRANT SELECT ON *.* TO `marketing`@`%` |

+----------------------------------------+

1 row in set (0.00 sec)

Conjuntos de caracteres

Como el nuevo conjunto de caracteres predeterminado es utf8mb4, debe asegurarse de no estar usando el predeterminado, ya que cambiará.

Para evitar algunos problemas, debe especificar las variables character_set_server y collation_server en el archivo de configuración my.cnf.

$ vi /etc/my.cnf

[mysqld]

character_set_server=latin1

collation_server=latin1_swedish_ci

Motor MyISAM

Las tablas de privilegios de MySQL en el esquema de MySQL se mueven a InnoDB. Puede crear un motor de tabla =MyISAM, y funcionará como antes, pero copiar una tabla MyISAM en un servidor MySQL en ejecución no funcionará porque no se descubrirá.

Particionamiento

No debe haber tablas particionadas que usen un motor de almacenamiento que no tenga soporte de partición nativo. Puede ejecutar la siguiente consulta para verificar este punto.

$ mysql -p

SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE NOT IN ('innodb', 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';

Si necesita cambiar el motor de una tabla, puede ejecutar:

ALTER TABLE table_name ENGINE = INNODB;

Comprobación de actualización

Como último paso, puede ejecutar el comando mysqlcheck usando el indicador de verificación de actualización para confirmar si todo se ve bien.

$ mysqlcheck -uroot -p --all-databases --check-upgrade

Enter password:

mysql.columns_priv                                 OK

mysql.component                                    OK

mysql.db                                           OK

mysql.default_roles                                OK

mysql.engine_cost                                  OK

mysql.func                                         OK

mysql.general_log                                  OK

mysql.global_grants                                OK

mysql.gtid_executed                                OK

mysql.help_category                                OK

mysql.help_keyword                                 OK

mysql.help_relation                                OK

mysql.help_topic                                   OK

mysql.innodb_index_stats                           OK

mysql.innodb_table_stats                           OK

mysql.password_history                             OK

mysql.plugin                                       OK

mysql.procs_priv                                   OK

mysql.proxies_priv                                 OK

mysql.role_edges                                   OK

mysql.server_cost                                  OK

mysql.servers                                      OK

mysql.slave_master_info                            OK

mysql.slave_relay_log_info                         OK

mysql.slave_worker_info                            OK

mysql.slow_log                                     OK

mysql.tables_priv                                  OK

mysql.time_zone                                    OK

mysql.time_zone_leap_second                        OK

mysql.time_zone_name                               OK

mysql.time_zone_transition                         OK

mysql.time_zone_transition_type                    OK

mysql.user                                         OK

sys.sys_config                                     OK

world_x.city                                       OK

world_x.country                                    OK

world_x.countryinfo                                OK

world_x.countrylanguage                            OK

Hay varias cosas que verificar antes de realizar la actualización. Puede consultar la documentación oficial de MySQL para obtener información más detallada.

Métodos de actualización

Hay diferentes formas de actualizar MySQL 5.7 a 8.0. Puede usar la actualización en el lugar o incluso crear un esclavo de replicación en la nueva versión, para poder promocionarlo más tarde.

Pero antes de actualizar, el paso 0 debe ser una copia de seguridad de sus datos. La copia de seguridad debe incluir todas las bases de datos, incluidas las bases de datos del sistema. Entonces, si hay algún problema, puede retroceder lo antes posible.

Otra opción, dependiendo de los recursos disponibles, puede ser crear una replicación en cascada MySQL 5.7 -> MySQL 8.0 -> MySQL 5.7, así que después de promocionar la nueva versión, si algo salió mal, puede promocionar la nodo esclavo con la versión anterior de vuelta. Pero podría ser peligroso si hubiera algún problema con los datos, por lo que la copia de seguridad es imprescindible antes.

Para cualquier método a utilizar, es necesario un entorno de prueba para verificar que la aplicación funciona sin ningún problema utilizando la nueva versión de MySQL 8.0.

Conclusión

Más de 1 año después del lanzamiento de MySQL 8.0, es hora de comenzar a pensar en migrar su versión anterior de MySQL, pero afortunadamente, como el fin del soporte para MySQL 5.7 es 2023, tiene tiempo para crear un plan de migración y probar el comportamiento de la aplicación. sin prisas Es necesario dedicar algo de tiempo a ese paso de prueba para evitar cualquier problema después de migrarlo.