Experiencia pr谩ctica actualizando MySQL 5.7 a la versi贸n 8.0

imagen

Recientemente actualizamos nuestros servidores de MySQL 5.7 a 8.0.

Dejemos fuera del alcance de este art铆culo por qu茅 y qu茅 nuevos buns aparecieron en MySQL 8.0, pero en cambio hablaremos sobre las dificultades que encontramos durante el proceso de actualizaci贸n.

En primer lugar, antes de actualizar, vale la pena mirar la lista de cambios y corregir su archivo de configuraci贸n.

Como m铆nimo, se han eliminado las siguientes opciones:
innodb_file_format, innodb_file_format_check, innodb_file_format_max, innodb_large_prefix
query_cache_limit, query_cache_min_res_unit, query_cache_size, query_cache_type, query_cache_wlock_invalidate.

En el par谩metro sql_mode, en particular, se elimin贸 NO_AUTO_CREATE_USER, lo cual es especialmente importante porque en MySQL 5.7, estaba activado por defecto.

Percona tiene instrucciones para la actualizaci贸n en el lugar. Y en el caso general, puede seguirlo, sin embargo, logramos actualizar solo un cl煤ster de esta manera; por lo dem谩s, un intento de actualizar esto fall贸 con un error similar:

2019-06-22T05:04:18.510888Z 1 [ERROR] [MY-011014] [Server] Found partially upgraded DD. Aborting upgrade and deleting all DD tables. Start the upgrade process again. 2019-06-22T05:04:23.115018Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed. 2019-06-22T05:04:23.115655Z 0 [ERROR] [MY-010119] [Server] Aborting 

Por lo tanto, actualizamos los cl煤steres restantes generando una nueva instancia vac铆a y restaurando el volcado de la base de datos de la versi贸n anterior.

Para hacer esto, en primer lugar, necesita un volcado de la base de datos. Y aqu铆 est谩 el peligro # 1: un vertedero hecho de la manera est谩ndar:

 mysqldump -u root -p --hex-blob --default-character-set=utf8mb4 --all-databases --triggers --routines --events > dump.sql 

no se recupera dando un error:

 ERROR 3554 (HY000) at line 15915: Access to system table 'mysql.innodb_index_stats' is rejected. 

La descripci贸n se encuentra en el rastreador de errores de MySQL (con el estado No es un error :), tambi茅n hay consejos sobre c贸mo volcarlo para que pueda restaurarse:

 mysqldump -u root -p --hex-blob --default-character-set=utf8mb4 --all-databases --triggers --routines --events --ignore-table=mysql.innodb_index_stats --ignore-table=mysql.innodb_table_stats > dump.sql 

Pero cuando se trata de usar un volcado de este tipo, si los desencadenantes estuvieran presentes (y los tuvi茅ramos), se podr铆a esperar el peligro n. 掳 2, en forma de tal error:

 ERROR 1231 (42000) at line 54: Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER' 

La raz贸n de esto es c贸mo MySQL usa sql_mode para disparadores, a saber: MySQL guarda el valor de sql_mode para un disparador en el momento en que se crea y luego siempre lo ejecuta con ese valor. Y en consecuencia guarda este valor en un volcado.

Descripci贸n de ayuda para esto:
dev.mysql.com/doc/refman/8.0/en/create-trigger.html
MySQL almacena la configuraci贸n de la variable del sistema sql_mode vigente cuando se crea un activador, y siempre ejecuta el cuerpo del activador con esta configuraci贸n vigente, independientemente del modo SQL del servidor actual cuando el activador comienza a ejecutarse.

Que hacemos Acabamos de cortar NO_AUTO_CREATE_USER del volcado finalizado. Comando similar:

 sed "s/50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER/50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO/g" dump.sql > dump2.sql 

Despu茅s de eso, el volcado se restaura con 茅xito, pero el peligro # 3 nos espera (la verdad bastante esperada): las tablas del sistema se restauraron al estado de la versi贸n 5.7 y tenemos los siguientes errores en los registros:

 [ERROR] [MY-013143] [Server] Column count of mysql.user is wrong. Expected 51, found 45. The table is probably corrupted 

Por experiencia con versiones anteriores, esto se trata ejecutando mysql_upgrade, pero desde la versi贸n 8.0.16, esto no funciona porque mysql_upgrade se declara obsoleto y no hace nada.

Ahora, para que las tablas del sistema se actualicen, debe iniciar MySQL con la opci贸n upgrade = FORCE .

En ubuntu fresco, esto se puede hacer de la siguiente manera:

 systemctl set-environment MYSQLD_OPTS="--upgrade=FORCE" 

Luego reinicie MySQL. Bueno, despu茅s de una actualizaci贸n exitosa, elim铆nela:

 systemctl unset-environment MYSQLD_OPTS 

Source: https://habr.com/ru/post/476852/


All Articles