OVH Community, your new community space.

Using MySQLTuner


Guille
17/06/2013, 06:26
MarcosBL, oceano: Muchas gracias por compartir vuestros scripts.

MarcosBL
16/06/2013, 19:15
Eso es que tienes software, sea propio o de terceros, que hace consultas JOIN en tablas que no tienen los índices apropiados, sea porque hay que crearlos, sea porque hay que abordar las queries de otra forma.

Aunque parezca coña, una query de una sola linea con un mal índice, en una tabla medana-grande, puede echar abajo una máquina, por muy potente que sea.

Si quieres ver qué consultas son las afectadas, pon un log-queries-not-using-indexes en tu my.cnf, reinicia MySQL y haz un tail -f a ese fichero de log para ir viendo cuales van apareciendo.

Más información:

http://www.longovil.com/node/8

http://dev.mysql.com/doc/refman/5.0/...query-log.html

Una vez identificadas, si es software de terceros, toca ir a la web de los autores a ver si hay algún parche/mod/cache o similar que lo minimize, si es software propio, toca optimizar esas consultas o crear los índices:

http://www.webtaller.com/construccio...ices-mysql.php

http://www.sergiquinonero.net/explai...imiza-sql.html

http://www.mysqlperformanceblog.com/

oceano
15/06/2013, 18:20
Hola MarcosBL,

En primer lugar agradecerte el script, más adelante lo probaré.

Concretamente me refería a esto:

[!!] Joins performed without indexes: 7240


Un saludo !

MarcosBL
15/06/2013, 16:46
No sé a qué error te refieres, de todas formas, te pego un script que me monté para lo mismo (como todo, optimizable, es viejo, pero funciona bien). Lo metes por ahí en tu home y lo programas en un cron, y te olvidas:

Código PHP:
#!/bin/bash

export COLUMNS=80
export TERM
="xterm"

VERSION="0.1.1"
log="$PWD/mysqloptimizator_log"

echo
echo 
"================================="
echo "Defragmentador de MySQL v$VERSION"
echo "================================="
echo


showHelp() {
        echo -
"\tSolo para tablas MyISAM e InnoDB"
        
echo -"\t--help o -h\t\tpara ver este menu"
        
echo -"\t--user o -u usuario\tusuario de conexion a MySQL\n\t\t\tsi lo indicas el script pedira contraseña, salvo que uses..."
        
echo -"\t--pass o -p contraseña"
        
echo -"\t--host o -h hostname\tespecificar servidor, sea este localhost (por defecto) o uno remoto"
}

# Parseemos argumentos...
#while [[ $1 == -* ]]; do
while [ $# -ne 0 ]; do
        
case "$1" in
                
--help|-hshowHelp; exit 0;;
                --
user|-umysqlUser="$2"shift 2;;
                --
pass|-pmysqlPass="$2"shift 2;;
                --
host|-hmysqlHost="$2"shift 2;;
                --) 
shift;
        
esac
done

# Comprobaciones varias de autentificacion, los argumentos siempre tienen preferencia sobre el .my.cnf
if [[ ! $mysqlUser  && -"$HOME/.my.cnf" ]]; then
        
if grep "user=" "$HOME/.my.cnf" >/dev/null 2>&1then
                
if grep "pass=" "$HOME/.my.cnf" >/dev/null 2>&1then
                        mysqlUser
=$(grep user= < "$HOME/.my.cnf" awk -F=\  '{print $2}');
                        
mysqlPass=$(grep pass= < "$HOME/.my.cnf" awk -F=\  '{print $2}');
                        if 
grep "host=" "$HOME/.my.cnf" >/dev/null 2>&1then
                                mysqlHost
=$(grep host= < "$HOME/.my.cnf" awk -F=\ '{print $2}');
                        
fi
                
else
                        echo 
"No se ha encontrado la contraseña en tu .my.cnf, crea ese fichero o especifica la contraseña con --pass"
                
fi
        
else
                echo 
"No hay linea de usuario en tu .my.cnf, crea ese fichero o especifica el usuario con --user"
                
exit 1;
        
fi
fi

# localhost si no se indica otra cosa
if [[ ! $mysqlHost ]]; then
        mysqlHost
="localhost"
fi

# Ya la hemos liado...
if [[ ! $mysqlUser ]]; then
        
echo "No se ha encontrado la informacion de autentificacion ni en los argumentos ni en $HOME/.my.cnf , y no somos magos :P"
        
echo
        
showHelp
        
exit 1
fi

if [[ ! $mysqlPass ]]; then
        
echo -"Contraseña del usuario para acceder a MySQL: "
        
read -s mysqlPass
fi

# Conexion de prueba a MySQL:
mysql -u"$mysqlUser-p"$mysqlPass-h"$mysqlHost--skip-column-names --batch -"show status" 2>"$log>/dev/null
if [[ $? -gt 0 ]]; then
        
echo "Error chungo al conectar, mira en $log para mas informacion.";
        exit 
1;
fi

# Lista de las BDs:
databases=( $(mysql -u"$mysqlUser-p"$mysqlPass-h"$mysqlHost--skip-column-names --batch -"show databases;" 2>"$log"));
if [[ $? -
gt 0 ]]; then
        
echo "Error chungo al listar las BDs, mira en $log para mas informacion."
        
exit 1;
fi

echo -"Encontradas ${#databases[@]} Bases de Datos";
echo 

asd=0

for i in ${databases[@]}; do
    (( 
asd$asd ))
    echo 
$asd $i
        
# Listamos las tablas, con grep cogemos las MyISAM o InnoDB, y recogemos las fragmentadas con awk
        
fragmented=( $(mysql -u"$mysqlUser-p"$mysqlPass-h"$mysqlHost--skip-column-names --batch -"SHOW TABLE STATUS FROM \`$i\`;" 2>"$logawk '{print $1,$2,$10}' egrep "MyISAM|InnoDB" awk '$3 > 0' awk '{print $1}') );
        if [[ $? -
gt 0 ]]; then
                
echo "Error chungo al buscar fragmentadas, mira en $log para mas informacion."
                
exit 1;
        
fi
        tput sc
        
echo -"Comprobando \`$i\` ... ";
        if [[ ${
#fragmented[@]} -gt 0 ]]; then
                
if [[ ${#fragmented[@]} -gt 0 ]]; then
                        
if [[ ${#fragmented[@]} -gt 1 ]]; then
                                
echo "encontradas ${#fragmented[@]} tablas fragmentadas."
                        
else
                                echo 
"encontrada ${#fragmented[@]} tabla fragmentada."
                        
fi
                fi
                
for table in ${fragmented[@]}; do
                        
let fraggedTables=$fraggedTables+1;
                        echo -
ne "\tOptimizando $table ... ";
                        
mysql -u"$mysqlUser-p"$mysqlPass-h"$mysqlHost-"$i--skip-column-names --batch -"optimize table $table2>"$log>/dev/null
                        
if [[ $? -gt 0 ]]; then
                                
echo "Error chungo optimizando la tabla $table, mira en $log para mas informacion."
                                
exit 1;
                        
fi
                        
echo listo
                done
        
else
                
tput rc
                tput el
        fi
        
unset fragmented
done

# Mensaje de finalizacion
if [[ ! $fraggedTables -gt 0 ]]; then
        
echo "No se encontraron tablas fragmentadas, asi que no se optimizo nada de nada.";
else
        if [[ 
$fraggedTables -gt 1 ]]; then
                
echo "$fraggedTables tablas presentaban fragmentacion, y han sido optimizadas.";
        else
                echo 
"$fraggedTables tabla presentaba fragmentacion, y ha sido optimizada.";
        
fi
fi

echo 

if [[ ! -
s $log ]]; then
        rm 
-"$log"
fi

unset fraggedTables 
Para poder llamarlo sin parámetros, crea el .my.cnf en tu home:

Código PHP:
[mysql]
userusuario
pass
contraseña
host
localhost
socket
=/var/run/mysqld/mysqld.sock
[client]
user=usuario
pass
=contraseña 
Algo asi, espero que te sirva.

oceano
15/06/2013, 15:30
Hola, buenas tardes;

He implementado este script 1* (MySQLTuner) para verificar el correcto funcionamiento de MySQL y posteriormente he utilizado este otro 2* para la fragmentación de las tablas que tenía y bueno, se las ha comido todas, una detrás de otra, pero me ha mostrado un error con el indexes.

1: http://www.howtoforge.com/tuning-mys...ith-mysqltuner
2: http://www.justin.my/2010/09/optimiz...bles-in-mysql/

Sabéis algún script o método para solucionarlo ?


*por si se pierde la fuente
2 {

#!/bin/sh
echo -n "MySQL username: " ; read username
echo -n "MySQL password: " ; stty -echo ; read password ; stty echo ; echo

mysql -u $username -p"$password" -NBe "SHOW DATABASES;" | grep -v 'lost+found' | while read database ; do
mysql -u $username -p"$password" -NBe "SHOW TABLE STATUS;" $database | while read name engine version rowformat rows avgrowlength datalength maxdatalength indexlength datafree autoincrement createtime updatetime checktime collation checksum createoptions comment ; do
if [ "$datafree" -gt 0 ] ; then
fragmentation=$(($datafree * 100 / $datalength))
echo "$database.$name is $fragmentation% fragmented."
mysql -u "$username" -p"$password" -NBe "OPTIMIZE TABLE $name;" "$database"
fi
done
done

* how to add

vi mysql_optimize
chmod 744 ./mysql_optimize

* execute
./mysql_optimize

}



Muchas gracias, un saludo !!