Quizás, una de los apartados más críticos en la configuración de un servidor, es la optimización de MySQL.
El quedarse corto o pasarse, significará el desaprovechar recursos, quitándoselos a otras tareas o quedarse corto y que el servidor vaya muy lento e incluso caiga.
Quizás es una de las tareas más tediosas que hay.
He estado buscando durante mucho tiempo algo que me facilitara la vida para optimizar MySQL tanto en mis servidores como en los VPS, Servidores Híbridos y Dedicados de mis clientes.
Normalmente, hay que ir haciendo ajustes en estos para que estén al 100%, no es realizarlo una vez y te olvidas de por vida. SI las necesidades de estos disminuyen o aumentan, hay que ajustarlos de nuevo.
La pesadilla, siempre a sido referente a MySQL.
Después de buscar mucho tiempo, he encontrado un script que es una auténtica maravilla.
El script lo encontrareis en esta página:
Si tenis un VPS o Dedicado, os facilitará la vida muchísimo.
Las instrucciones que voy a dar, son referentes a una instalación en CentOS.
Sirve si tenéis instalado cPanel en él.
Lo primero que deberemos hacer es acceder al servidor por SSH
Una vez que estemos conectados, escribimos:
1 | wget http: //www.day32.com/MySQL/tuning-primer.sh |
Con esto, nos descargaremos el script
Para que funcione bien este script, deberemos tener instalado bc, por lo tanto, escribiremos:
1 | yum install bc |
Lo anterior nos instalará bc.
Una vez que lo tengamos instalado, escribimos:
1 | sh tuning-primer.sh |
Debemos estar en el mismo directorio que el archivo.
El script se pondrá en marcha.
Os aconsejo que abráis otra conexión SSH, de esta forma, en una tendréis el script y en la otra podremos configurar MySQL.
Cuando el script finalice, os mostrará algo así (os pongo una imagen, ya que es mucho más clarificadora por los colores):
Y aquí el texto completo que nos muestra:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | -- MYSQL PERFORMANCE TUNING PRIMER -- - By: Matthew Montgomery - MySQL Version 5.0.90-community x86_64 Uptime = 0 days 14 hrs 6 min 16 sec Avg. qps = 2 Total Questions = 102107 Threads Connected = 2 Warning: Server has not been running for at least 48hrs. It may not be safe to use these recommendations To find out more information on how each of these runtime variables effects performance visit: http: //dev.mysql.com/doc/refman/5.0/en/server-system-variables.html Visit http: //www.mysql.com/products/enterprise/advisors.html for info about MySQL's Enterprise Monitoring and Advisory Service SLOW QUERIES The slow query log is NOT enabled. Current long_query_time = 10 sec. You have 4 out of 102128 that take longer than 10 sec. to complete Your long_query_time seems to be fine BINARY UPDATE LOG The binary update log is NOT enabled. You will not be able to do point in time recovery See http: //dev.mysql.com/doc/refman/5.0/en/point-in-time-recovery.html WORKER THREADS Current thread_cache_size = 1024 Current threads_cached = 5 Current threads_per_sec = 0 Historic threads_per_sec = 0 Your thread_cache_size is fine MAX CONNECTIONS Current max_connections = 100 Current threads_connected = 3 Historic max_used_connections = 8 The number of used connections is 8% of the configured maximum. You are using less than 10% of your configured max_connections. Lowering max_connections could help to avoid an over-allocation of memory See "MEMORY USAGE" section to make sure you are not over-allocating No InnoDB Support Enabled! MEMORY USAGE Max Memory Ever Allocated : 542 M Configured Max Per-thread Buffers : 400 M Configured Max Global Buffers : 510 M Configured Max Memory Limit : 910 M Physical Memory : 31.37 G Max memory limit seem to be within acceptable norms KEY BUFFER Current MyISAM index space = 73 M Current key_buffer_size = 250 M Key cache miss rate is 1 : 58 Key buffer free ratio = 81 % Your key_buffer_size seems to be fine QUERY CACHE Query cache is enabled Current query_cache_size = 250 M Current query_cache_used = 14 M Current query_cache_limit = 4 M Current Query cache Memory fill ratio = 5.73 % Current query_cache_min_res_unit = 4 K Your query_cache_size seems to be too high. Perhaps you can use these resources elsewhere MySQL won't cache query results that are larger than query_cache_limit in size SORT OPERATIONS Current sort_buffer_size = 1 M Current read_rnd_buffer_size = 768 K Sort buffer seems to be fine JOINS Current join_buffer_size = 1.00 M You have had 11 queries where a join could not use an index properly You should enable "log-queries-not-using-indexes" Then look for non indexed joins in the slow query log. If you are unable to optimize your queries you may want to increase your join_buffer_size to accommodate larger joins in one pass. Note! This script will still suggest raising the join_buffer_size when ANY joins not using indexes are found. OPEN FILES LIMIT Current open_files_limit = 8302 files The open_files_limit should typically be set to at least 2x-3x that of table_cache if you have heavy MyISAM usage. You currently have open more than 75% of your open_files_limit You should set a higher value for open_files_limit in my.cnf TABLE CACHE Current table_cache value = 4096 tables You have a total of 13106 tables You have 4096 open tables. Current table_cache hit rate is 6% , while 100% of your table cache is in use You should probably increase your table_cache TEMP TABLES Current max_heap_table_size = 32 M Current tmp_table_size = 32 M Of 1472 temp tables, 43% were created on disk Perhaps you should increase your tmp_table_size and / or max_heap_table_size to reduce the number of disk-based temporary tables Note! BLOB and TEXT columns are not allow in memory tables. If you are using these columns raising these values might not impact your ratio of on disk temp tables. TABLE SCANS Current read_buffer_size = 1 M Current table scan ratio = 32 : 1 read_buffer_size seems to be fine TABLE LOCKING Current Lock Wait ratio = 1 : 696 You may benefit from selective use of InnoDB. If you have long running SELECT's against MyISAM tables and perform frequent updates consider setting 'low_priority_updates=1' If you have a high concurrency of inserts on Dynamic row-length tables consider setting 'concurrent_insert=2' . |
Cómo podéis ver, lo que hace es hacer un estudio de como ha estado funcionando MySQL y da consejos sobre parámetros que debemos tocar.
Una vez que nos muestra el resultado, deberemos realizar las modificaciones aconsejadas por el script.
This, en la otra ventana que tenemos una conexión activa SSH escribimos:
1 | cp /etc/my.cnf /etc/my.cnfBACKUP |
Con lo anterior realizamos una copia de seguridad que no está de más.
1 | vi /etc/my.cnf |
Esto nos abrirá el archivo de configuración de MySQL.
Lo abro con vi, ya que es el que más me gusta, pero podéis realizar las modificaciones con el que más os guste.
Una vez abierto, para los que no estén familiarizados con vi, debéis apretar en el teclado la tecla “Insert”, de esta forma podréis escribir en el archivo.
Realizar las modificaciones que os aconseje el script.
Una vez que las hayáis realizado, apretar el botón “Escape” y escribir:
:w
Esto guardará las modificaciones.
Una vez realizadas las modificaciones, apretar:
:q
Lo anterior os sacará del editor.
Una cosa importante, ya que hay veces que sucede.
Si borras más cosas de la cuenta y no sabes que has borrado, lo mejor es que salgas sin guardar. Para salir sin guardar debéis escribir:
:q!
Acordaros de apretar la tecla “escape” antes, o no tendrá efecto, estaréis escribiendo el el archivo.
Una vez que hayáis realizado los cambios y los hayáis guardado, hay que reiniciar el servidor MySQL.
Si usáis WHM/cPanel, ir a WHM y en “Restart Services” Apretar sobre “SQL Server (MySQL)”
Si no usais WHM, escribir en la consola:
1 | /etc/init.d/mysqld restart |
Si MySQL no reinicia, algo habéis hecho mal en el archivo de configuración.
Para resolverlo y que no nos caigan gotas de sudor, escribimos:
1 | rm –rf /etc/my.cnf |
1 | cp /etc/my.cnfBACKUP /etc/my.cnf |
y volvemos a reiniciar.
Si no habíamos cometido ningún error, casi con toda seguridad la página os irá mucho más fluida.
Now, esperáis de 24 a 48h y volvéis a poner en marcha el script y veis resultados.
Si todo sale Ok, perfecto, si os sale algún otro consejo, pues volvéis a realizar el proceso.
SOURCE: http://www.bp-es.com/noticias/2010/05/18/optimiza-mysql-facilmente-sin-ser-un-experto/