jeudi 5 novembre 2015, par
Depuis quelques semaines, chaque nuit, je reçois un mail de mes serveurs sous Linux Debian Jessie indiquant une erreur provoquée par logrotate. J’ai enfin trouvé une solution pour ne plus être spamé par mes propres machines !
Note historique : Cet article date de novembre 2015 (Debian Jessie). Bien que les principes restent valides, certains détails concernant logrotate et MySQL peuvent avoir évolué. L’approche de diagnostic décrite conserve sa pertinence pour les systèmes Debian/Ubuntu contemporains.
Sur les serveurs Debian/Linux, logrotate exécute quotidiennement la rotation des fichiers journaux via un script dans /etc/cron.daily. Lorsque MySQL est installé, logrotate crée une configuration dédiée qui, après archivage des logs, exécute un script de postrotation. Ce script échoue régulièrement avec une erreur de permissions, générant des rapports par mail via cron.
Le message d’erreur type reçu :
/etc/cron.daily/logrotate: error: error running shared postrotate script for '/var/log/mysql.log /var/log/mysql/mysql.log /var/log/mysql/mysql-slow.log /var/log/mysql/error.log'
run-parts: /etc/cron.daily/logrotate exited with return code 1Logrotate est l’utilitaire système chargé de limiter la croissance des fichiers journaux. Il archive et compresse les logs anciens en parcourant les fichiers de configuration du répertoire /etc/logrotate.d/. Pour la gestion de MySQL, il utilise le compte utilisateur système dedié : debian-sys-maint.
Ce compte possède des permissions minimales nécessaires au redémarrage et à la gestion des services MySQL. Ces permissions sont stockées dans deux fichiers clés :
1. Configuration logrotate pour MySQL :
sudo cat /etc/logrotate.d/mysql-serverCe fichier contient une variable MYADMIN qui utilise les identifiants du compte de maintenance :
MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"2. Fichier de configuration MySQL du compte de maintenance :
sudo cat /etc/mysql/debian.cnfCe fichier expose les identifiants du compte debian-sys-maint :
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host = localhost
user = debian-sys-maint
password = xxxxxxxxxxxxxxx
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = debian-sys-maint
password = xxxxxxxxxxxxxxx
socket = /var/run/mysqld/mysqld.sock
basedir = /usrL’erreur de postrotate survient lorsque le compte debian-sys-maint n’dispose pas des permissions MySQL suffisantes pour exécuter les commandes d’administration nécessaires (redémarrage des tables, vérification de l’état, etc.). Le compte système existe et dispose d’accès au fichier de configuration, mais les droits au niveau base de données sont incomplets.
La résolution requiert d’accorder au compte debian-sys-maint l’ensemble des permissions administratives nécessaires. Cette opération s’effectue en tant que root MySQL.
Étape 1 : Connexion en tant qu’administrateur MySQL
mysql -u root -pEntrez le mot de passe root de MySQL.
Étape 2 : Attribution des permissions
Exécutez les commandes SQL suivantes en remplaçant les identifiants par ceux du fichier /etc/mysql/debian.cnf (notamment le mot de passe exact) :
GRANT RELOAD, SHUTDOWN, PROCESS, SHOW DATABASES, SUPER, LOCK TABLES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'xxxxxxxxxxxxxxx';
FLUSH PRIVILEGES;Les permissions attribuées correspondent à :
RELOAD : réinitialiser les tables et les caches
SHUTDOWN : arrêter le serveur MySQL
PROCESS : afficher les processus serveur
SHOW DATABASES : énumérer les bases de données
SUPER : exécuter les opérations de maintenance
LOCK TABLES : verrouiller les tables pour sauvegarde
Étape 3 : Application immédiate des permissions
La commande FLUSH PRIVILEGES recharge les permissions en mémoire, activant les changements instantanément sans redémarrage du serveur.
FLUSH PRIVILEGES;Après ces modifications, la prochaine exécution de logrotate (lors du cron quotidien la nuit suivante) fonctionnera sans erreur. Pour vérifier immédiatement sans attendre le cron :
sudo /etc/cron.daily/logrotateSi aucune erreur ne s’affiche, le problème est résolu.
Maintenir à jour le compte debian-sys-maint via les mises à jour du paquet mysql-server
Monitorer les erreurs logrotate via les logs cron : grep logrotate /var/log/syslog
Sur les installations personnalisées, adapter les permissions en fonction des besoins réels du serveur
Préserver le fichier /etc/mysql/debian.cnf : c’est la clé du bon fonctionnement de la maintenance automatisée