{"id":412,"date":"2014-08-28T12:11:48","date_gmt":"2014-08-28T10:11:48","guid":{"rendered":"http:\/\/dbahire.com\/?p=412"},"modified":"2016-10-29T01:57:20","modified_gmt":"2016-10-28T23:57:20","slug":"cambios-en-variables-globales-de-configuracion-entre-mysql-5-6-20-y-mysql-5-7-4-milestone-14","status":"publish","type":"post","link":"https:\/\/jynus.com\/dbahire\/cambios-en-variables-globales-de-configuracion-entre-mysql-5-6-20-y-mysql-5-7-4-milestone-14\/","title":{"rendered":"Cambios en variables globales de configuraci\u00f3n entre MySQL 5.6.20 y MySQL 5.7.4 &#8220;Milestone 14&#8221;"},"content":{"rendered":"<p><a href=\"\/wp-content\/uploads\/2014\/08\/mysql-5.6-to-5.71.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2014\/08\/mysql-5.6-to-5.71.png\" alt=\"MySQL Upgrade from 5.6 to 5.7\" width=\"215\" height=\"181\" class=\"alignright size-full wp-image-390\" \/><\/a>Mientras realizaba unos tests (que <a href=\"http:\/\/dbahire.com\/probando-la-manera-mas-rapida-de-importar-una-tabla-en-mysql-y-unos-resultados-interesantes-del-rendimiento-de-5-7\/\" title=\"Probando la manera m\u00e1s r\u00e1pida de importar una tabla en MySQL (y unos resultados interesantes del rendimiento de 5.7)\">os ense\u00f1\u00e9 posteriormente aqu\u00ed<\/a>) en el -todav\u00eda en desarrollo- MySQL 5.7 quise hacer un an\u00e1lisis de la configuraci\u00f3n para ver si los cambios en el rendimiento eran debidos a los cambios en el c\u00f3digo o simplemente a los par\u00e1metros por defecto de MySQL (algo que es muy com\u00fan en una migraci\u00f3n de 5.5 a 5.6 debido al tama\u00f1o por defecto del log de transacciones y otros par\u00e1metros por defecto). <strong>\u00c9ste es un post r\u00e1pido con el objetivo de identificar las variables globales que se han modificado entre estas dos versiones<\/strong>.<\/p>\n<p>Me podr\u00edan decir que con leer <a href=\"http:\/\/dev.mysql.com\/doc\/relnotes\/mysql\/5.7\/en\/index.html\">las notas de cambios de versiones<\/a> (<em>release notes<\/em>) ser\u00eda suficiente, pero mi experiencia me dice (y esta no es una excepci\u00f3n, como podr\u00e9is comprobar) que compruebe los cambios por m\u00ed mismo.<\/p>\n<p>No incluyo cambios en las tablas de <code>performance_schema<\/code>, ya que estaba ejecutando estos tests en particular con <code>performance_schema = OFF<\/code>. Tampoco incluyo &#8220;cambios administrativos&#8221;, mi nombre para las variables que no influyen el comportamiento o el rendimiento de mysql, tales como el <code>server_uuid<\/code>, que ser\u00e1 diferente para instancias distintas y <code>version<\/code> e <code>innodb_version<\/code>, que obviamente han cambiado de <code>5.6.20<\/code> a <code>5.7.4-m14<\/code>. Tenga en cuenta que alguno de los cambios han sido portados de vuelta a 5.6, por lo que no se mostrar\u00e1n aqu\u00ed, o ya estaban disponibles en versiones previas de 5.7.<\/p>\n<p><strong>Variables que han cambiado su valor<\/strong><\/p>\n<table>\n<theader>\n<tr>\n<td><strong>nombre de la variable<\/strong><\/td>\n<td><strong>valor en 5.6.20<\/strong><\/td>\n<td><strong>valor en 5.7.4<\/strong><\/td>\n<\/tr>\n<\/theader>\n<tbody>\n<tr>\n<td>eq_range_index_dive_limit<\/td>\n<td>10<\/td>\n<td>200<\/td>\n<\/tr>\n<tr>\n<td>log_warnings<\/td>\n<td>1<\/td>\n<td>2<\/td>\n<\/tr>\n<tr>\n<td>performance_schema_max_statement_classes<\/td>\n<td>168<\/td>\n<td>189<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Nuevas variables<\/strong><\/p>\n<table>\n<theader>\n<tr>\n<td><strong>nombre de la variable\/strong><\/td>\n<td><strong>valor en 5.7.4<\/strong><\/td>\n<\/tr>\n<\/theader>\n<tbody>\n<tr>\n<td>default_authentication_plugin<\/td>\n<td>mysql_native_password<\/td>\n<\/tr>\n<tr>\n<td>default_password_lifetime<\/td>\n<td>360<\/td>\n<\/tr>\n<tr>\n<td>have_statement_timeout<\/td>\n<td>YES<\/td>\n<\/tr>\n<tr>\n<td>innodb_buffer_pool_dump_pct<\/td>\n<td>100<\/td>\n<\/tr>\n<tr>\n<td>innodb_log_write_ahead_size<\/td>\n<td>8192<\/td>\n<\/tr>\n<tr>\n<td>innodb_page_cleaners<\/td>\n<td>1<\/td>\n<\/tr>\n<tr>\n<td>innodb_temp_data_file_path<\/td>\n<td>ibtmp1:12M:autoextend<\/td>\n<\/tr>\n<tr>\n<td>log_error_verbosity<\/td>\n<td>3<\/td>\n<\/tr>\n<tr>\n<td>log_timestamps<\/td>\n<td>UTC<\/td>\n<\/tr>\n<tr>\n<td>max_statement_time<\/td>\n<td>0<\/td>\n<\/tr>\n<tr>\n<td>performance_schema_events_transactions_history_long_size<\/td>\n<td>-1<\/td>\n<\/tr>\n<tr>\n<td>performance_schema_events_transactions_history_size<\/td>\n<td>-1<\/td>\n<\/tr>\n<tr>\n<td>performance_schema_max_memory_classes<\/td>\n<td>250<\/td>\n<\/tr>\n<tr>\n<td>performance_schema_max_metadata_locks<\/td>\n<td>-1<\/td>\n<\/tr>\n<tr>\n<td>performance_schema_max_prepared_statements_instances<\/td>\n<td>-1<\/td>\n<\/tr>\n<tr>\n<td>performance_schema_max_program_instances<\/td>\n<td>5000<\/td>\n<\/tr>\n<tr>\n<td>performance_schema_max_statement_stack<\/td>\n<td>10<\/td>\n<\/tr>\n<tr>\n<td>rbr_exec_mode<\/td>\n<td>STRICT<\/td>\n<\/tr>\n<tr>\n<td>session_track_schema<\/td>\n<td>ON<\/td>\n<\/tr>\n<tr>\n<td>session_track_state_change<\/td>\n<td>OFF<\/td>\n<\/tr>\n<tr>\n<td>session_track_system_variables<\/td>\n<td>time_zone,autocommit,<br \/>character_set_client,<br \/>character_set_results,<br \/>character_set_connection<\/td>\n<\/tr>\n<tr>\n<td>slave_parallel_type<\/td>\n<td>DATABASE<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Variables hechas obsoletas<\/strong><\/p>\n<table>\n<theader>\n<tr>\n<td><strong>nombre de la variable<\/strong><\/td>\n<td><strong>valor en 5.6.20<\/strong><\/td>\n<\/tr>\n<\/theader>\n<tbody>\n<tr>\n<td>binlogging_impossible_mode<\/td>\n<td>IGNORE_ERROR<\/td>\n<\/tr>\n<tr>\n<td>innodb_additional_mem_pool_size<\/td>\n<td>8388608<\/td>\n<\/tr>\n<tr>\n<td>innodb_use_sys_malloc<\/td>\n<td>ON<\/td>\n<\/tr>\n<tr>\n<td>thread_concurrency<\/td>\n<td>10<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Algunos comentarios:<\/p>\n<ul>\n<li>Respecto a potenciales incompatibilidades, <strong>todas las variables obsoletas excepto una eran literalmente in\u00fatiles<\/strong>, y no las encontraba normalmente configuradas, excepto por <code>innodb_additional_mem_pool_size<\/code>, la cual era, en mi experiencia, siempre configurada por error, ya que no ten\u00eda absolutamente ning\u00fan efecto en versiones recientes de InnoDB. La excepci\u00f3n es <code>binlogging_impossible_mode<\/code>, <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.6\/en\/replication-options-binary-log.html#sysvar_binlog_impossible_mode\">que fue a\u00f1adida en 5.6.20<\/a> y probablemente no <em>mergeada<\/em> a tiempo para esta milestone de 5.7. Probablemente sea a\u00f1adida en el futuro con una funcionalidad equivalente. Una caracter\u00edstica interesante, me gustar\u00eda a\u00f1adir.<\/li>\n<li>El cambio de <code>eq_range_index_dive_limit<\/code> de 10 a 200 es <a href=\"http:\/\/mysqlserverteam.com\/you-asked-for-it-new-default-for-eq_range_index_dive_limit\/\">un cambio muy razonable, hecho a partir de una sugerencia de Facebook<\/a>. Esta variable fue a\u00f1adida en MySQL 5.6, y aunque solventaba el problema de obtener estad\u00edsticas fiables para expresiones IN con m\u00faltiples valores, <a href=\"https:\/\/www.facebook.com\/notes\/mysql-at-facebook\/eq_range_index_dive_limit-system-variable-in-mysql-56\/10151533648715933\">Facebook ten\u00eda completa raz\u00f3n en que las cl\u00e1usulas IN tienen frecuentemente m\u00e1s de 10 elementos<\/a> (ya que es una caracter\u00edsticas que muchos desarrolladores y frameworks utilizan).<\/li>\n<li><code>max_statement_timeout<\/code> y <code>have_statement_timeout<\/code> provienen del <em>merge<\/em> o la reimplementaci\u00f3n de la <a href=\"https:\/\/github.com\/twitter\/mysql\/wiki\/Statement-Timeout\">funcionalidad de timeout de consultas de Twitter<\/a>. Una buena adici\u00f3n en <em>upstream<\/em>.<\/li>\n<li><code>default_authentication_plugin<\/code> no es una nueva funcionalidad, tan s\u00f3lo se ha movido de un par\u00e1metro de servidor a una variable global de pleno derecho que puede ser inspeccionada (pero no cambiada) en tiempo de ejecuci\u00f3n. <strong>El verdadero cambio aqu\u00ed es <code>default_password_lifetime<\/code>, que realmente se echaba de menos en 5.6- expiraci\u00f3n autom\u00e1tica de contrase\u00f1as<\/strong> (sin tener que ejecutar manualmente <code>PASSWORD EXPIRE<\/code>). Lo que encuentro interesante es el valor por defecto: 360 (las contrase\u00f1as expiran aproximadamente una vez al a\u00f1o). No estoy diciendo que sea un valor por defecto malo o bueno, pero predigo bastante controversia\/confusi\u00f3n sobre eso. Hay m\u00e1s que hablar sobre cambios en la autenticaci\u00f3n, pero no me expandir\u00e9 aqu\u00ed, ya que no concierne a las variables de configuraci\u00f3n.<\/li>\n<li>Cambiando <code>slave_parallel_type<\/code> a <code>LOGICAL_CLOCK<\/code>, <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/replication-options-slave.html#option_mysqld_slave-parallel-type\">mysql permite la replicaci\u00f3n paralela de manera mucho m\u00e1s fina<\/a>, mucho mejor que la limitada opci\u00f3n de 5.6 (s\u00f3lo \u00fatil en infraestructuras <em>multi-tenant<\/em>)<\/li>\n<li>Algunos a\u00f1adidos a InnoDB, como por ejemplo la variable <code>innodb_page_cleaners<\/code>, permitiendo m\u00faltiples hilos de ejecuci\u00f3n para el flusheo de p\u00e1ginas desde el buffer pool en paralelo, y el cual <a href=\"https:\/\/blog.mariadb.org\/performance-evaluation-of-mariadb-10-1-and-mysql-5-7-4-labs-tplc\/\">fue el sujeto de una reciente discusi\u00f3n sobre un cierto benchmark<\/a>. Adem\u00e1s, se ha a\u00f1adido cierta flexibilidad extra respecto a la configuraci\u00f3n del cacheo del log de transacciones y la configuraci\u00f3n de la localizaci\u00f3n de las tablas temporales en formato InnoDB que considero cambios menores como para ir sobre cada uno de ellos en detalle.<\/a>\n<li><code>log_warnings<\/code> ha cambiado pero no ha sido documentado. Pero siendo sinceros, su funcionalidad es obsoleta ya que ha sido sustituida por <code>log_error_verbosity<\/code>, una <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/server-system-variables.html#sysvar_log_error_verbosity\">nueva variable recientemente introducida<\/a> que hace que por defecto se registren por defecto todos los errores, avisos y notas. He enviado el <s><a href=\"http:\/\/bugs.mysql.com\/bug.php?id=73745\">bug #73745<\/a><\/s> (arreglado) sobre esto.<\/li>\n<li>Una nueva variable, <code>rbr_exec_mode<\/code>, parece <a href=\"http:\/\/geek.rohitkalhans.com\/2013\/05\/mysqlbinlog-idemmpotent-mode.html\">haberse a\u00f1adido en 5.7.1<\/a>, pero no est\u00e1 documentada en ning\u00fan sitio de las secci\u00f3n de variables del servidor o en las release notes, tan s\u00f3lo en el blog de ese desarrollador. \u00c9sta permite iniciar a nivel de sesi\u00f3n un modo IDEMPOTENT cuando se replican eventos en modo filas, ignorando todos los conflictos encontrados. He creado un <s><a href=\"http:\/\/bugs.mysql.com\/bug.php?id=73744\">bug #73744<\/a><\/s> (arreglado) para esta incidencia.<\/li>\n<li>Ha habido varios cambios en el performance_schema; no comentar\u00e9 sobre ellos aqu\u00ed. Tenga en cuenta que <code>performance_schema_max_statement_classes<\/code> no es un cambio <em>real<\/em>, ya que se calcula al inicio (no tiene un valor fijo).<\/li>\n<li>Se han a\u00f1adido variables <code>session_track_*<\/code> para la monitorizaci\u00f3n de cambios en la sesi\u00f3n <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.7\/en\/mysql-session-track-get-first.html\">para usarse en el conector de C<\/a><\/li>\n<\/ul>\n<p>En resumen, cambios interesantes, tan s\u00f3lo una cambio en la configuraci\u00f3n por defecto que podr\u00eda alterar el rendimiento (<code>eq_range_index_dive_limit<\/code>), y nada que podr\u00eda crear problemas en una migraci\u00f3n, con dos excepciones provenientes de pron\u00f3sticos propios: <\/p>\n<p>Instancis de la (por otro lado in\u00fatil desde hace tiempo, tal y como se mencionaba arriba) variable <code>innodb_additional_mem_pool_size<\/code> fallando con:<\/p>\n<pre>\r\n[ERROR] unknown variable 'innodb_additional_mem_pool_size=X'\r\n<\/pre>\n<p>, la cual simplemente deber\u00eda borrarse del fichero de configuraci\u00f3n.<\/p>\n<p>Y el tiempo de expiraci\u00f3n establecido por defecto a un a\u00f1o, que podr\u00eda producir montones de:<\/p>\n<pre>\r\nERROR 1862 (HY000): Your password has expired.\r\n<\/pre>\n<p>o incluso crear algunos problemas dif\u00edciles de identificar en conectores anticuados, tal y como hemos experimentado con esta funcionalidad en 5.6. Me gustar\u00eda conocer en particular vuestra opini\u00f3n sobre la configuraci\u00f3n por defecto para el expirado de contrase\u00f1as en el software, ya que no me considero un experto en seguridad. Como habitualmente, <a href=\"http:\/\/dbahire.com\/changes-in-configuration-of-global-variables-between-mysql-5-6-20-and-mysql-5-7-4-milestone-14\/\">pod\u00e9is dejarme comentarios aqu\u00ed<\/a> o en <a href=\"http:\/\/twitter.com\/dbahire_en\">Twitter<\/a>.<\/p>\n<p><strong>EDIT: <\/strong>Morgan Tocker, de Oracle, <a href=\"https:\/\/twitter.com\/morgo\/status\/504653772748881921\">ha comentado via Twitter<\/a> que &#8220;<code>innodb_additional_mem_pool_size<\/code> no ha tenido utilidad desde hace mucho tiempo (desde el plugin), y que la raz\u00f3n para el cambio ahora son los problemas adicionales de <a href=\"http:\/\/mysqlha.blogspot.ca\/2009\/01\/parsed-but-ignored.html\">aceptar pero ignorar opciones<\/a>&#8220;. No me quejo de esos cambios, de hecho, creo que deber\u00edan haberse mucho tiempo atr\u00e1s para prevenir esos mismos errores, tan s\u00f3lo estoy describiendo aqu\u00ed una soluci\u00f3n para lo que creo que ser\u00e1n problemas frecuentes en la migraci\u00f3n. La incompatibilidad es a veces la manera correcta. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mientras realizaba unos tests (que os ense\u00f1\u00e9 posteriormente aqu\u00ed) en el -todav\u00eda en desarrollo- MySQL 5.7 quise hacer un an\u00e1lisis de la configuraci\u00f3n para ver si los cambios en el rendimiento eran debidos a los cambios en el c\u00f3digo o<\/p>\n","protected":false},"author":1,"featured_media":390,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[85],"tags":[86,163,158,162,157,164,159,156,457,90,165,161,166,167,160],"class_list":["post-412","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mysql-es","tag-5-6-es","tag-5-7-es","tag-5-7-4","tag-cambios","tag-configuracion","tag-error-es","tag-incompatibilidad","tag-migracion","tag-mysql-es","tag-mysql-5-6-es","tag-mysql-5-7-es","tag-obsoletas","tag-show-global-variables-es","tag-show-variables-es","tag-variables"],"_links":{"self":[{"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/posts\/412","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/comments?post=412"}],"version-history":[{"count":7,"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/posts\/412\/revisions"}],"predecessor-version":[{"id":812,"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/posts\/412\/revisions\/812"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/media\/390"}],"wp:attachment":[{"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/media?parent=412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/categories?post=412"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jynus.com\/dbahire\/wp-json\/wp\/v2\/tags?post=412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}