Vous êtes ici : Accueil / Debian GNU/Linux / Serveurs / MySQL / Configurer l'analyse et l'optimisation / défragmentation régulière des tables MySQL

Configurer l'analyse et l'optimisation / défragmentation régulière des tables MySQL

Par Pierre-Yves Landuré Dernière modification 14/11/2017 13:39

Au fil des insertions et des suppressions, les performances des tables MySQL peuvent baisser. Optimiser et analyser régulièrement les tables MySQL permet de reconstruire les index et limiter l'espace disque utilisé par le serveur. Il faut toutefois être prudent, car cette pratique a quelques inconvénients. Ce guide présente la mise en place d'un outil analysant régulièrement les tables du serveur MySQL.

Ce guide est testé sur:

  • Debian 6.0 Squeeze
  • Debian 7.0 Wheezy

Prérequis

Ce guide nécessite:

    Installation

    Détectez le proxy de commande (command ou sudo):

    cmdProxy='command'
    command type -f 'sudo' &>'/dev/null' && cmdProxy='sudo'

    Téléchargez le script mysql-defragger:

    ${cmdProxy} wget 'https://raw.github.com/biapy/howto.biapy.com/master/mysql/mysql-defragger' \
    --quiet --no-check-certificate --output-document='/usr/local/bin/mysql-defragger'

    Rendez-le executable:

    ${cmdProxy} chmod +x '/usr/local/bin/mysql-defragger'

    mysql-defragger permet d'effectuer des actions sélective d'optimisation des tables MySQL.

    Maintenance ponctuelle

    Tables InnoDB

    A savoir : Il est impossible de calculer la fragmentation d'une table InnoDB. La fragmentation se détecte par la baisse de performance des requêtes et des accès disques plus nombreux.

    La maintenance des tables InnoDB doit être effectuée prudemment. L'option --optimize de mysql-defragger va recréer les tables InnoDB. Ce processus entraîne une duplication de la table, puis la suppression de l'original. Cet action défragmente effectivement la table. Les inconvénients sont les suivants:

    • La table est verrouillée pour toute la durée du processus.
    • L'espace disque utilisé par les données de la table est doublé.

    N'effectuez cette action que sur les bases n'utilisant pas des tables InnoDB de taille très importante, sous peine de surcharger le système, et rendre non fonctionnelles les applications utilisant cette table.

    Il est toutefois intéressant d'effectuer une optimisation des tables InnoDB tous les 6 mois environ, lors d'une maintenance serveur programmée. Pour optimiser les tables InnoDB, utilisez (danger !):

    command mysql-defragger --innodb --optimize

    D'une manière générale, il est préférable de se contenter d'une analyze des tables InnoDB:

    command mysql-defragger --innodb --analyze

    Tables MyISAM

    Les tables MyISAM fragmentent facilement avec les suppression fréquentes (requêtes DELETE). Pour défragmenter les tables MyISAM, utilisez:

    command mysql-defragger --myisam --optimize

    Maintenance régulière

    J'utilise les réglages suivants pour la maintenance d'un serveur MySQL. Ce sont mes réglages actuels et ils ne sont peut être pas pertinents. Ils sont toutefois fonctionnels:

    • Analyse hebdomadaire des tables MyISAM et InnoDB.
    • Optimisation mensuelle des tables MyISAM uniquement.

    J'effectue manuellement l'optimisation des tables InnoDB.

    Renseignez le mot de passe root pour MySQL:

    command read -s -p "Enter password: " mysqlPassword

    Créez le fichier .my.cnf de l'utilisateur root de MySQL dans votre compte:

    if [ ! -e "/root/.my.cnf" ]; then
      echo "[client]
    user=root
    password=${mysqlPassword}" \
        | ${cmdProxy} tee "/root/.my.cnf"
    command chmod 400 "${HOME}/.my.cnf"
    fi

    Configurez cron pour lancer la maintenance régulière du serveur MySQL:

    echo "# /etc/cron.d/mysql-defragger: crontab fragment for mysql-defragger
    #  Weekly run analyze on all MySQL tables (mysqlcheck is faster and do the same).
    # 04 2    * * 7    ${USER}    [ -x /usr/local/bin/mysql-defragger ] && /usr/local/bin/mysql-defragger --analyze -q -q
    04 2    * * 7    ${USER}    [ -x /usr/bin/mysqlcheck ] && /usr/bin/mysqlcheck --all-databases --analyze --silent
    #  Monthly optimize MyISAM tables.
    04 3    * * 7    ${USER}    [ -x /usr/local/bin/mysql-defragger ] && /usr/local/bin/mysql-defragger --myisam --optimize -q -q" \
        | ${cmdProxy} tee '/etc/cron.d/mysql-defragger'

    Rechargez la configuration de cron:

    ${cmdProxy} service cron reload

    Références

    Ces livres peuvent vous aider:

    Remerciements