Mientras realizaba unos tests (que os enseñé posteriormente aquí) en el -todavía en desarrollo- MySQL 5.7 quise hacer un análisis de la configuración para ver si los cambios en el rendimiento eran debidos a los cambios en el código o simplemente a los parámetros por defecto de MySQL (algo que es muy común en una migración de 5.5 a 5.6 debido al tamaño por defecto del log de transacciones y otros parámetros por defecto). Éste es un post rápido con el objetivo de identificar las variables globales que se han modificado entre estas dos versiones.
Me podrían decir que con leer las notas de cambios de versiones (release notes) sería suficiente, pero mi experiencia me dice (y esta no es una excepción, como podréis comprobar) que compruebe los cambios por mí mismo.
No incluyo cambios en las tablas de performance_schema
, ya que estaba ejecutando estos tests en particular con performance_schema = OFF
. Tampoco incluyo “cambios administrativos”, mi nombre para las variables que no influyen el comportamiento o el rendimiento de mysql, tales como el server_uuid
, que será diferente para instancias distintas y version
e innodb_version
, que obviamente han cambiado de 5.6.20
a 5.7.4-m14
. Tenga en cuenta que alguno de los cambios han sido portados de vuelta a 5.6, por lo que no se mostrarán aquí, o ya estaban disponibles en versiones previas de 5.7.
Variables que han cambiado su valor
nombre de la variable | valor en 5.6.20 | valor en 5.7.4 |
eq_range_index_dive_limit | 10 | 200 |
log_warnings | 1 | 2 |
performance_schema_max_statement_classes | 168 | 189 |
Nuevas variables
nombre de la variable/strong> | valor en 5.7.4 |
default_authentication_plugin | mysql_native_password |
default_password_lifetime | 360 |
have_statement_timeout | YES |
innodb_buffer_pool_dump_pct | 100 |
innodb_log_write_ahead_size | 8192 |
innodb_page_cleaners | 1 |
innodb_temp_data_file_path | ibtmp1:12M:autoextend |
log_error_verbosity | 3 |
log_timestamps | UTC |
max_statement_time | 0 |
performance_schema_events_transactions_history_long_size | -1 |
performance_schema_events_transactions_history_size | -1 |
performance_schema_max_memory_classes | 250 |
performance_schema_max_metadata_locks | -1 |
performance_schema_max_prepared_statements_instances | -1 |
performance_schema_max_program_instances | 5000 |
performance_schema_max_statement_stack | 10 |
rbr_exec_mode | STRICT |
session_track_schema | ON |
session_track_state_change | OFF |
session_track_system_variables | time_zone,autocommit, character_set_client, character_set_results, character_set_connection |
slave_parallel_type | DATABASE |
Variables hechas obsoletas
nombre de la variable | valor en 5.6.20 |
binlogging_impossible_mode | IGNORE_ERROR |
innodb_additional_mem_pool_size | 8388608 |
innodb_use_sys_malloc | ON |
thread_concurrency | 10 |
Algunos comentarios:
- Respecto a potenciales incompatibilidades, todas las variables obsoletas excepto una eran literalmente inútiles, y no las encontraba normalmente configuradas, excepto por
innodb_additional_mem_pool_size
, la cual era, en mi experiencia, siempre configurada por error, ya que no tenía absolutamente ningún efecto en versiones recientes de InnoDB. La excepción esbinlogging_impossible_mode
, que fue añadida en 5.6.20 y probablemente no mergeada a tiempo para esta milestone de 5.7. Probablemente sea añadida en el futuro con una funcionalidad equivalente. Una característica interesante, me gustaría añadir. - El cambio de
eq_range_index_dive_limit
de 10 a 200 es un cambio muy razonable, hecho a partir de una sugerencia de Facebook. Esta variable fue añadida en MySQL 5.6, y aunque solventaba el problema de obtener estadísticas fiables para expresiones IN con múltiples valores, Facebook tenía completa razón en que las cláusulas IN tienen frecuentemente más de 10 elementos (ya que es una características que muchos desarrolladores y frameworks utilizan). max_statement_timeout
yhave_statement_timeout
provienen del merge o la reimplementación de la funcionalidad de timeout de consultas de Twitter. Una buena adición en upstream.default_authentication_plugin
no es una nueva funcionalidad, tan sólo se ha movido de un parámetro de servidor a una variable global de pleno derecho que puede ser inspeccionada (pero no cambiada) en tiempo de ejecución. El verdadero cambio aquí esdefault_password_lifetime
, que realmente se echaba de menos en 5.6- expiración automática de contraseñas (sin tener que ejecutar manualmentePASSWORD EXPIRE
). Lo que encuentro interesante es el valor por defecto: 360 (las contraseñas expiran aproximadamente una vez al año). No estoy diciendo que sea un valor por defecto malo o bueno, pero predigo bastante controversia/confusión sobre eso. Hay más que hablar sobre cambios en la autenticación, pero no me expandiré aquí, ya que no concierne a las variables de configuración.- Cambiando
slave_parallel_type
aLOGICAL_CLOCK
, mysql permite la replicación paralela de manera mucho más fina, mucho mejor que la limitada opción de 5.6 (sólo útil en infraestructuras multi-tenant) - Algunos añadidos a InnoDB, como por ejemplo la variable
innodb_page_cleaners
, permitiendo múltiples hilos de ejecución para el flusheo de páginas desde el buffer pool en paralelo, y el cual fue el sujeto de una reciente discusión sobre un cierto benchmark. Además, se ha añadido cierta flexibilidad extra respecto a la configuración del cacheo del log de transacciones y la configuración de la localización de las tablas temporales en formato InnoDB que considero cambios menores como para ir sobre cada uno de ellos en detalle. log_warnings
ha cambiado pero no ha sido documentado. Pero siendo sinceros, su funcionalidad es obsoleta ya que ha sido sustituida porlog_error_verbosity
, una nueva variable recientemente introducida que hace que por defecto se registren por defecto todos los errores, avisos y notas. He enviado elbug #73745(arreglado) sobre esto.- Una nueva variable,
rbr_exec_mode
, parece haberse añadido en 5.7.1, pero no está documentada en ningún sitio de las sección de variables del servidor o en las release notes, tan sólo en el blog de ese desarrollador. Ésta permite iniciar a nivel de sesión un modo IDEMPOTENT cuando se replican eventos en modo filas, ignorando todos los conflictos encontrados. He creado unbug #73744(arreglado) para esta incidencia. - Ha habido varios cambios en el performance_schema; no comentaré sobre ellos aquí. Tenga en cuenta que
performance_schema_max_statement_classes
no es un cambio real, ya que se calcula al inicio (no tiene un valor fijo). - Se han añadido variables
session_track_*
para la monitorización de cambios en la sesión para usarse en el conector de C
En resumen, cambios interesantes, tan sólo una cambio en la configuración por defecto que podría alterar el rendimiento (eq_range_index_dive_limit
), y nada que podría crear problemas en una migración, con dos excepciones provenientes de pronósticos propios:
Instancis de la (por otro lado inútil desde hace tiempo, tal y como se mencionaba arriba) variable innodb_additional_mem_pool_size
fallando con:
[ERROR] unknown variable 'innodb_additional_mem_pool_size=X'
, la cual simplemente debería borrarse del fichero de configuración.
Y el tiempo de expiración establecido por defecto a un año, que podría producir montones de:
ERROR 1862 (HY000): Your password has expired.
o incluso crear algunos problemas difíciles de identificar en conectores anticuados, tal y como hemos experimentado con esta funcionalidad en 5.6. Me gustaría conocer en particular vuestra opinión sobre la configuración por defecto para el expirado de contraseñas en el software, ya que no me considero un experto en seguridad. Como habitualmente, podéis dejarme comentarios aquí o en Twitter.
EDIT: Morgan Tocker, de Oracle, ha comentado via Twitter que “innodb_additional_mem_pool_size
no ha tenido utilidad desde hace mucho tiempo (desde el plugin), y que la razón para el cambio ahora son los problemas adicionales de aceptar pero ignorar opciones“. No me quejo de esos cambios, de hecho, creo que deberían haberse mucho tiempo atrás para prevenir esos mismos errores, tan sólo estoy describiendo aquí una solución para lo que creo que serán problemas frecuentes en la migración. La incompatibilidad es a veces la manera correcta.
Pingback:Probando la manera más rápida de importar una tabla en MySQL (y unos resultados interesantes del rendimiento de 5.7) | Contrate un MySQL DBA