[Bash] Récupérer la taille des bases MySQL

#!/bin/bash
#
# MySQL_DB_Sizes
#
# Auteur      : Johan 
# Contact     : johan@slashroot.fr
# Date        : 13/07/2011
# Version     : 1.0
# Description : Recupère la taille de chaque base de données et envoi les résultats par email
# Commentaire : L'utilisateur doit avoir acces en lecture a toutes les bases dont on souhaite connaitre la taille

# Reminder for a MySQL read only user
# CREATE USER 'ro-user'@'localhost' IDENTIFIED BY 'MySQL_Ro_User_Password';
# GRANT SELECT ON database1.* TO 'ro-user'@'localhost';
# GRANT SELECT ON database2.* TO 'ro-user'@'localhost';
# ...

#
# Usage
#
usage(){
    echo ""
    echo "Utilisation : mysql_db_sizes -s server_name -u mysql_user -p file/password [-b database1,database2...] [-m adresse@domain.com]"
    echo ""
    echo "OPTIONS :"
    echo "   -h     Affiche l'aide"
    echo "   -u     Utilisateur MySQL a utilise pour la requete SQL"
    echo "   -s     Serveur contenant la base de données"
    echo "   -p     Type d'authentification a utiliser (prompt du password ou fichier ~/.my.cnf)"
    echo "   -b     Specifie les bases a afficher (par defaut toutes celles accessibles"
    echo "   -m     Envoi le resultat par email au lieu de l'afficher dans le terminal"
    echo ""
    echo "EXEMPLES :"
    echo "   1 - Affichage de la taille de toutes les bases avec une authentification par mot de passe"
    echo "          mysql_db_sizes -s localhost-u bob  -p password"
    echo "   2 - Envoi de la taille des bases db1 et db2 par email avec une authentification par fichier"
    echo "          mysql_db_sizes -s localhost -u bob -p file -b db1,db2 -m bob@admin.fr"
    echo ""
}

#
# getopts
#

while getopts "s:u:p:b:m:h" opt; do
  case $opt in
    s)
      serveur=$OPTARG
      ;;
    u)
      user=$OPTARG
      ;;
    p)
      auth=$OPTARG
      ;;
    b)
      bases=$OPTARG
      ;;
    m)
      dest=$OPTARG
      ;;
    h)
      usage
      exit 0
      ;;
    \?)
      usage
      exit 1
      ;;
    🙂
      usage
      exit 1
      ;;
  esac
done

#
# Variables et verifications
#

# Verification des parametres choisis
if [[ $# -eq 0 || -z $serveur || -z $user || -z $auth ]] ; then
        usage
        exit 1
fi

# Verification de l'authentification choisi
if [ $auth == "file" ] ; then
        if [ ! -f ~/.my.cnf ] ; then
        	echo " ERREUR - Le fichier .my.cnf est introuvable"
	        exit 1
	else
		if [ $(stat -c %a ~/.my.cnf) != 600 ] ; then
			echo "Warning - Votre fichier ~/.my.cnf n'a pas les droits recommandes"
		fi
        fi
elif [ ! $auth == "password" ] ; then
	usage
	exit 1
fi

host=`hostname`
res="\n"

# Fichier de sortie temporaire
tmp="/tmp/mysql_db_sized.tmp"

#
# Au boulot
#

# On extrait dans un fichier toutes les bases du serveurs
if [ $auth == "file" ] ; then
	mysql -h $serveur -u $user -B --exec="SELECT table_schema, round(sum(data_length+index_length)/1024/1024,4) AS 'Size (MB)' FROM information_schema.tables GROUP BY table_schema;" > $tmp
else
	mysql -h $serveur -u $user -p -B --exec="SELECT table_schema, round(sum(data_length+index_length)/1024/1024,4) AS 'Size (MB)' FROM information_schema.tables GROUP BY table_schema;" > $tmp
fi

# On supprime la premières ligne du fichier comprenant les titres ainsi que la base schema 
sed -i '1d' $tmp
sed -i '/information_schema/d' $tmp 

# Pour chaque base
while read line ; do
    # On recupere son nom et sa taille
    nom=`echo $line | cut -f1 -d ' '`
    taille=`echo $line | cut -f2 -d ' '`
    # On l'ajoute au resultat si on veut toutes les bases ou si elle fait partie des bases choisies
    if [ -z $bases ] && ( echo $bases | grep -wq $nom ) ; then
	res+="$nom : $taille Mo\n"
    elif [ -n $bases ] && ( echo $bases | grep -wq $nom ) ; then
	res+="$nom : $taille Mo\n"
    fi
done < $tmp

# On redige et on envoi l'email si demande
if [ ! -z $dest ] ; then
    corps="Bonjour,\n\nVoici les informations concernant la taille de ma/mes base(s) de données :\n\n$res\n\nnCordialement,\n\n$host"
    echo -e $corps | mail -s "Infos : Taille base MySQL" $dest
# Sinon on affiche le resultat dans le terminal
else
    echo -e $res
fi

# On supprime le fichier de sortie temporaire
rm -f $tmp

Add a Comment

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *