lunes, 6 de mayo de 2013

Cómo ajustar el servidor MySQL

Original post: http://anothermysqldba.blogspot.com/2013/05/how-to-tune-mysql-server.html



Esta entrada de blog es parte de la serie de blog
    Para continuar ahora con el propio servidor:

    Bueno, además de simplemente decir hacer lo que dice Pedro , le revise ejemplos de cómo se pueden resolver por sí mismos.

    Para empezar, se puede comparar el archivo my.cnf contra el Q & A versión que está disponible de forma gratuita a través de Percona. Es ésta una solución ideal? No, pero se le permitirá tomar una nueva mirada a su archivo de configuración después de que responde a todas sus preguntas, a través de su asistente de configuración.


    innodb_buffer_pool_size -
    select @@innodb_buffer_pool_size;

    Ajuste de la innodb_buffer_pool_size es, con mucho, uno de los lugares más importantes para un MySQL InnoDB database.Some buena lectura sobre este tema es el siguiente:
    Es necesario tener en cuenta que no existe una "talla única consulta" para el ajuste del innodb_buffer_pool_size. Tenemos algunas pautas y sugerencias que han surgido en los últimos años (ver a continuación) comunes y también tenemos varias teorías diferentes acerca de las mejores opciones.

    SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS
    FROM (SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
    FROM information_schema.tables WHERE engine='InnoDB') A;


    SELECT CONCAT(ROUND(KBS/POWER(1024,
    IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
    SUBSTR(' KMG',IF(PowerOf1024<0,0,
    IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
    FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
    WHERE engine='InnoDB') A,
    (SELECT 3 PowerOf1024) B; 

    Es seguro decir que si usted tiene la serie 8M defecto como la variable innodb_buffer_pool_size entonces este debe ser uno de los primeros parámetros que ajustar.

    Básicamente, permitir que esto tiene toda la memoria disponible, puede darse el lujo de dar. Esto por supuesto tiene en cuenta varios factores, como lo que más necesita asignar memoria en el servidor? Ten en cuenta que el disco I / O es importante para el rendimiento y la más memoria permite que esta variable tiene menos disco I / O se debería exigir para el acceso a la tabla.

    Consideremos también esto ....
    Como una recomendación general es establecer the innodb_log_file_size a 25% del tamaño del buffer que debemos evaluar lo que tenemos para el innodb_log_file_size per conceptos del barón y luego mirar para ver cómo se relaciona con el innodb_buffer_pool_size.

    Por ejemplo, siguiendo la lógica de Del Barón mensaje:
    > show engine innodb status\G select sleep(60); show engine innodb status\G
    Log sequence number 3982683217
    1 row in set (0.01 sec)

    1 row in set (59.99 sec)

    Log sequence number 3991367755
    1 row in set (0.01 sec)

    > SET @sequence1=3982683217;
    Query OK, 0 rows affected (0.00 sec)
    > SET @sequence2=3991367755;
    Query OK, 0 rows affected (0.00 sec)
    > select (@sequence2 - @sequence1) / 1024 / 1024 as MB_per_min;
    +------------+
    | MB_per_min |
    +------------+
    | 8.28222084 |
    +------------+
    1 row in set (0.00 sec)
    > select ( (@sequence2 - @sequence1) / 1024 / 1024 )* 60 as MB_per_hour ;
    +--------------+
    | MB_per_hour |
    +--------------+
    | 496.93325043 |
    +--------------+
    1 row in set (0.00 sec)
    > select ( ( (@sequence2 - @sequence1) / 1024 / 1024 )* 60 ) * 4 as estimated_buffer_pool ;
    +-----------------------+
    | estimated_buffer_pool |
    +-----------------------+
    | 1987.73300171 |
    +-----------------------+
    1 row in set (0.00 sec)
    > select ( ( ( (@sequence2 - @sequence1) / 1024 / 1024 )* 60 ) * 4 ) / 1024 as estimated_buffer_pool_GB ;
    +--------------------------+
    | estimated_buffer_pool_GB |
    +--------------------------+
    | 1.941145509481 |
    +--------------------------+
    1 row in set (0.00 sec)
    Ahora, cuando se comparan estos resultados con las "directrices"
    SELECT CONCAT(ROUND(KBS/POWER(1024,
    -> IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
    -> SUBSTR(' KMG',IF(PowerOf1024<0,0,
    -> IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
    -> FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
    -> WHERE engine='InnoDB') A,
    -> (SELECT 3 PowerOf1024) B;
    +-------------------------------------+
    | recommended_innodb_buffer_pool_size |
    +-------------------------------------+
    | 1G |
    +-------------------------------------+ 

    Usted obtiene un resultado diferente. Mientras que el cheque de Baron depende del período de tiempo que se ejecuta dentro (que es por eso que usted debe comprobar esto durante picos de tráfico) se le puede dar una visión más realista de su tráfico y uso. Me gustaría ver en la creación del innodb_buffer_pool_size a 2G no 1G en este sencillo ejemplo.

    SET @ Secuencia1 = 3982683217;
    SET @ secuencia2 = 3991367755;
    seleccionar (@ secuencia2 - @ Secuencia1) / 1024/1024 como MB_per_min;
    seleccionar ((@ secuencia2 - @ Secuencia1) / 1024/1024) * 60 como MB_per_hour;
    seleccionar (((@ secuencia2 - @ Secuencia1) / 1024/1024) * 60) * 4 como estimated_buffer_pool;
    seleccionar ((((@ secuencia2 - @ Secuencia1) / 1024/1024) * 60) * 4) / 1024 como estimated_buffer_pool_GB;



    innodb_log_file_size -
    select @@innodb_log_file_size;

    He descubierto que me gusta conceptos del barón sobre cómo configurar el innodb_log_file_size. Recuerde que debe ejecutar sus sugerencias durante las horas punta para obtener lecturas reales. Cuanto mayor sea el tamaño de estos archivos, el mejor rendimiento con grandes conjuntos de datos, pero nada es gratis, aumentará los tiempos de recuperación. El aumento de los tiempos de recuperación no puede sonar como una gran preocupación para algunos, hasta que sea una base de datos depende de los ingresos que usted está esperando y el proceso de observación de siempre. Una recomendación general es situarlo en el 25% del tamaño del buffer.

    select ( @@innodb_buffer_pool_size * .25 )


    innodb_log_buffer_size -
    select @@innodb_log_buffer_size;

    Recuerdo que una vez tuve este conjunto en un servidor para innodb_log_buffer_size = 128M.¿Fue una buena elección? No significa que quería memoria cuando probablemente no tenía que hacerlo. Era una base de datos muy pesado escribir, pero esta opción es muy probable que alto. Centrarse en los valores predeterminados primero y luego duplicarlo (8 MB - 16 MB) max.


    innodb_additional_mem_pool_size -
    select @@innodb_additional_mem_pool_size;

    Pedro se dirige a esta configuración en su blog . Usted puede tratar y evaluar las opciones de configuración después de que otros se han tratado en mi opinión.


    innodb_flush_log_at_trx_commit -
    select @@innodb_flush_log_at_trx_commit;

    > Set GLOBAL innodb_flush_log_at_trx_commit = 2;
    Pedro se dirige a esta configuración en su blog también. Se trata de una mejora en el rendimiento de pruebas variables y el valor comúnmente pasado por alto por el ajuste 0-2.Tenga en cuenta los riesgos.


    thread_cache -
    select @@thread_cache_size;
    +---------------------+
    | @@thread_cache_size |
    +---------------------+
    | 50 |
    +---------------------+
    >show status like 'threads_created';
    +-----------------+-------+
    | Variable_name | Value |
    +-----------------+-------+
    | Threads_created | 4 |
    +-----------------+-------+
    1 row in set (0.00 sec)

    > show status like 'connections';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | Connections | 962 |
    +---------------+-------+
    1 row in set (0.00 sec)

    > SELECT 100 - ((4 / 962) * 100);
    +-------------------------+
    | 100 - ((4 / 962) * 100) |
    +-------------------------+
    | 99.5842 |
    +-------------------------+
    Mantenga un ojo en la misma situación: mostrar el estado como "Threads_created ';
    Si sube, entonces tengo configurado demasiado bajo y tiene que ser levantado.


    query_cache_size -
    select ((@@query_cache_size / 1024) / 1024);

    Los valores permitidos son múltiplos de 1.024.
    Preste atención a este ajuste, el más leído depende que la aplicación se vuelve. Yo solía correr con los ajustes key_buffer = 16M y yo podría y probablemente debería haber doblado eso.


    key_buffer_size -
    select @@key_buffer_size;

    Con el cambio a MySQL InnoDB como el motor de almacenamiento por defecto que es probable un cierto pudimos ver cada vez menos las tablas creadas como MyISAM. Eso no es un hecho sólo una opinión. El key_buffer_size será muy importante para usted si utilizas tablas MyISAM.

    Revisión de Shlomi Noaj mensaje para ayudarle a encontrar lo que fácilmente las tablas que tipo de motor.
    "Ver al tamaño de la tabla (casi exactamente como se presenta en INFORMATION_SCHEMA)"Shlomi Noaj.

    > SHOW VARIABLES LIKE 'key_buffer_size';
    +-----------------+----------+
    | Variable_name | Value |
    +-----------------+----------+
    | key_buffer_size | 15728640 |
    +-----------------+----------+ 


    table_cache -
    show variables like '%table%cache%';
    +----------------------------+-------+
    | Variable_name | Value |
    +----------------------------+-------+
    table_definition_cache | 4096 |
    table_open_cache | 4096 |
    table_open_cache_instances | 1 |
    +----------------------------+-------+ 

    Según el manual es una buena fórmula para ayudar a determinar latable_definition_cache tamaño.
    SELECT 400 + (@@table_open_cache / 2);

    > SHOW status like '%Opened_tables%'; 

    table_open_cache_instances
    Un valor de 8 o 16 se recomienda en sistemas que utilizan habitualmente 16 o más núcleos, el valor predeterminado es 1.


    Esperemos que esto expone las variables y los ajustes que se deben revisar para ayudarle a obtener lo mejor de su base de datos MySQL.