web-dev-qa-db-fra.com

expire_logs_days ignoré dans my.cnf

J'ai une paire de bases de données MySQL configurées pour la réplication Master Slave. L'esclave se porte bien.

Le maître, en revanche, a accumulé des journaux binaires malgré mes meilleurs efforts (automatisés).

J'essaie de configurer la variable 'expire_logs_days' dans le fichier my.cnf de MySQL, mais pour une raison quelconque, elle semble être ignorée. Mon fichier my.cnf ressemble à quelque chose comme:

[mysqld]
...
log-bin=/var/log/mysql/mysql-bin.log
server-id=1
expire_logs_days=3
log_bin_trust_function_creators=TRUE
sync_binlog=1

[mysqld_safe]
...

Mais quand je lance SHOW VARIABLES WHERE Variable_Name='expire_logs_days' dans MySQL, il me renvoie la valeur 0

J'ai essayé:

  • Redémarrer MySQL
  • En utilisant cette ligne: expire_logs_days='3'
  • Vérifié d’autres fichiers my.cnf:
    • mysqld --help --verbose | grep cnf
    • Trouvé la ligne: /etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf order of preference
    • Mon fichier my.cnf est situé à /etc/my.cnf
    • Il n'y a pas de fichier appelé my.cnf aux autres emplacements
  • SET GLOBAL expire_logs_days=3 fonctionne dans MySQL, mais ne résout pas vraiment mon problème en soi

Et c'est à peu près tout ce que je pouvais penser à faire. J'ai exécuté la commande manuelle PURGE, ce qui fonctionne très bien, mais je préférerais (bien que, s'il n'y a pas moyen de la contourner, je le ferai quand même), de ne pas exécuter la commande PURGE à l'aide de cron.

Quelqu'un a des idées? Je suis à peu près tapé.

Merci.

11
Cody S

Faits de votre question

  • Les journaux binaires ne peuvent pas être retournés
  • Vous avez dit que vous pouvez exécuter PURGE BINARY LOGS

Voici ma théorie de travail

Puisque vous pouvez effacer les journaux binaires en utilisant PURGE BINARY LOGS;, j’ai deux endroits où vous pouvez regarder, que vous n’avez pas mentionnés

LIEU N ° 1: mysql-bin.index

Ce fichier contient l'emplacement de tous les journaux binaires. Lorsque expire_logs_days est défini, mysqld ouvre ce fichier texte et vérifie les tampons datetime de chaque fichier jusqu'à ce qu'il rencontre un journal binaire dont l'horodatage est inférieur à NOW() - INTERVAL expire_logs_days DAY).

Les journaux binaires dans mysql-bin.index devraient être consécutifs numériquement. Si les journaux binaires ne sont pas consécutifs numériquement, la rotation des journaux est désactivée.

PLACE # 2: dossier /var/log/mysql

Selon votre my.cnf, ce dossier contient tous les journaux binaires.

Voici 2 questions:

  1. Existe-t-il des journaux binaires dans /var/log/mysql qui ne sont pas consécutifs numériquement?
  2. Existe-t-il des journaux binaires dans /var/log/mysql qui sont NOT IN mysql-bin.index?

Pourquoi ces situations se présenteraient-elles?

Parfois, des personnes suppriment des journaux binaires dans le système d'exploitation. Cela peut dissiper mysqld car mysqld utilise mysql-bin.index pour suivre en interne l'existence de journaux binaires. Supprimez simplement les journaux binaires avec rm -f en interrompant logiquement le mécanisme de rotation des journaux comme le sait mysqld.

RECOMMANDATION

Si l'un ou les deux sont les cas, vous pouvez le nettoyer comme suit:

mysql -ANe"RESET MASTER"
service mysql stop
cd /var/log/mysql
rm -f mysql-bin.*
cd
service mysql start

Après cela, vous devriez avoir une nouvelle configuration de journal binaire époustouflante.

Essaie !!!

9
RolandoMySQLDBA

Est-ce que changer une autre option dans ce fichier de configuration a un effet? Nous devons être certains que nous trouvons le bon fichier de configuration. Changer la valeur de server-id est probablement un bon candidat.

Si aucun effet, cherchons le bon fichier en lançant:

ps aux | grep mysqld

Et regardez les valeurs de --defaults-file ou --defaults-extra-file

Et si vous êtes toujours perplexe, assurez-vous qu'il n'y a pas de --init-file défini quelque part, en définissant la valeur sur 0.

0
Brian Papantonio

Je ne sais pas ce qui se passe avec votre fichier my.cnf, mais en ce qui concerne le problème plus vaste, il semble que vous ayez plusieurs choix:

  1. lancez mysqldump et indiquez que vous voulez que les fichiers soient vidés/purgés
  2. lancez 'purge' (comme vous l'avez été)
  3. set max_binlog_size. Selon les docs:

Les suppressions possibles se produisent au démarrage et lorsque le journal binaire est vidé.

et

De plus, le journal binaire est vidé lorsque sa taille atteint la valeur de la variable système max_binlog_size.

On dirait que le n ° 3 fera le expire_logs_days quand il fera la chasse/purge.

0
ethrbunny