Un script bash pour optimiser les tables mysql

16.09.2008 0

Et hop voilà un petit script bien pratique pour voir l’état de fractionnement des tables de votre serveur mysql:


#!/bin/bash
# -l 5 : parameter to launch OPTIMIZE query
while getopts 'D:d:u:p:s:l:' OPTION ; do
case $OPTION in
D) defaults_file="--defaults-file=$OPTARG";;
d) DB=$OPTARG;;
u) user="-u $OPTARG";;
p) pwd="-p$OPTARG";;
s) socket="--socket=$OPTARG";;
l) level="$OPTARG"
esac
done
mysql="mysql $defaults_file $user $pwd $socket"
if [ -z "$DB" ]
then
DB=`$mysql -N -e "show databases"`
fi
if [ -z "$level" ]
then
level="101"
fi
for db in $DB
do
for table in `$mysql -N $db -e "show tables"`
do
ENGINE=$($mysql $db -e "show table status like '$table'\G" | awk '/Engine/ {print $2}')
if [ "$ENGINE" == "MyISAM" ]
then
SIZE=$($mysql $db -e "show table status like '$table'\G" | awk '/Data_length/ {print $2}')
FREE=$($mysql $db -e "show table status like '$table'\G" | awk '/Data_free/ {print $2}')
ROWS=$($mysql $db -e "show table status like '$table'\G" | awk '/Rows/ {print $2}')
if [ $FREE -gt 0 ] && [ $SIZE -gt 0 ]
then
FRAGMENTATION=$(printf '%i' $(echo "scale=0; $FREE/($SIZE/100)"|bc))
echo "$FRAGMENTATION% $db.$table [Data_length=$SIZE Data_free=$FREE]"
if [ $FRAGMENTATION -ge $level ]
then
echo "OPTIMIZE REQUESTED"
$mysql $db -e "use '$db';OPTIMIZE TABLE $table\G"
fi
fi
fi
done
done

Le script a besoin d’informations de connexion à la base mysql, soit en ligne de commande, soit via un fichier .my.cnf

Il peut analyser une database particulière ou toutes celles du système si aucune n’est fournie en paramètre.

Il peut déclencher l’exécution de la commande OPTIMIZE TABLE si le taux de fragmentation de la table dépasse le seuil founi dans le paramètre -l

Par exemple: ./optimize_tables -u root -pxxxxxxx ou ./optimize_tables -l 10

PS: ce script ne fonctionne qu’avec des tables au format MyISAM, la fonction OPTIMIZE ne fonctionnant pas pour de l’InnoDB


 Olivier PIERRE, freelance au Luxembourg Analyste développeur PHP/MySQL/jQuery et administrateur système Linux spécialiste Gentoo


Les messages similaires