wake-up-neo.net

expire_logs_days wird in my.cnf ignoriert

Ich habe ein Paar MySQL-Datenbanken, die für die Master-Slave-Replikation eingerichtet sind. Dem Sklaven geht es gut.

Auf der anderen Seite hat der Master trotz meiner besten (automatisierten) Bemühungen Binärprotokolle gehortet.

Ich versuche, die Variable 'expire_logs_days' in der my.cnf-Datei von MySQL einzurichten, aber aus irgendeinem Grund scheint sie ignoriert zu werden. Meine my.cnf-Datei sieht ungefähr so ​​aus:

[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]
...

Wenn ich jedoch SHOW VARIABLES WHERE Variable_Name='expire_logs_days' in MySQL ausführe, wird der Wert 0 zurückgegeben.

Ich habe es versucht:

  • Neustart von MySQL
  • Mit dieser Zeile: expire_logs_days='3'
  • Auf andere my.cnf-Dateien überprüft:
    • mysqld --help --verbose | grep cnf
    • Zeile gefunden: /etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf order of preference
    • Meine my.cnf-Datei befindet sich unter /etc/my.cnf
    • An den anderen Speicherorten befinden sich keine Dateien mit dem Namen my.cnf
  • SET GLOBAL expire_logs_days=3 funktioniert zwar in MySQL, löst aber mein Problem per se nicht wirklich

Und das ist ungefähr alles, woran ich denken könnte. Ich habe den manuellen Befehl PURGE ausgeführt, der einwandfrei funktioniert, aber ich würde es vorziehen, den Befehl PURGE nicht mit cron auszuführen.

Hat jemand irgendwelche Ideen? Ich bin fast fertig.

Vielen Dank.

11
Cody S

Fakten aus Ihrer Frage

  • Binäre Protokolle können nicht gedreht werden
  • Sie sagten, Sie können PURGE BINARY LOGS ausführen

Hier ist meine Arbeitstheorie

Da Sie Binärlogs mit PURGE BINARY LOGS; löschen können, habe ich zwei Stellen, an denen Sie nachsehen können, die Sie nicht erwähnt haben

PLATZ 1: mysql-bin.index

Diese Datei enthält den Speicherort aller Binärprotokolle. Wenn expire_logs_days festgelegt ist, öffnet mysqld diese Textdatei und überprüft die Datums-/Uhrzeitstempel in jeder Datei, bis Binärprotokolle mit einem Zeitstempel kleiner als NOW() - INTERVAL expire_logs_days DAY) gefunden werden.

Es wird erwartet, dass die Binärprotokolle in mysql-bin.index numerisch fortlaufend sind. Wenn die Binärprotokolle nicht numerisch fortlaufend sind, ist die Protokollrotation deaktiviert.

PLATZ 2: Ordner /var/log/mysql

Entsprechend Ihrem my.cnf enthält dieser Ordner alle Binärprotokolle.

Hier sind 2 Fragen:

  1. Gibt es in /var/log/mysql Binärprotokolle, die nicht numerisch aufeinander folgen?
  2. Gibt es in /var/log/mysql Binärprotokolle, die NOT IN mysql-bin.index lauten?

Warum tauchen diese Situationen auf?

Manchmal werden Binärprotokolle im Betriebssystem gelöscht. Dies kann mysqld ausschalten, da mysqld mysql-bin.index verwendet, um das Vorhandensein von Binärprotokollen intern zu verfolgen. Durch einfaches Löschen von Binärprotokollen mit rm -f wird der Mechanismus der Protokollrotation, wie ihn mysqld kennt, logisch unterbrochen.

EMPFEHLUNG

Wenn einer oder beide der Fall sind, können Sie dies wie folgt bereinigen:

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

Danach sollten Sie eine brandneue Binärlog-Einrichtung haben.

Versuche es !!!

9
RolandoMySQLDBA

Hat das Ändern einer ANDEREN Option in dieser Konfigurationsdatei Auswirkungen? Wir müssen uns sicher sein, dass wir die richtige Konfigurationsdatei gefunden haben. Das Ändern des Werts der Server-ID ist wahrscheinlich ein guter Kandidat.

Wenn dies keinen Effekt hat, suchen wir die richtige Datei, indem Sie Folgendes ausführen:

ps aux | grep mysqld

Und schauen Sie sich die Werte von --defaults-file oder --defaults-extra-file an

Und wenn Sie immer noch ratlos sind, stellen Sie sicher, dass nicht --init-file irgendwo gesetzt ist und setzen Sie den Wert auf 0.

0

Ich bin nicht sicher, was mit Ihrer my.cnf passiert, aber was das größere Problem betrifft, haben Sie anscheinend einige Möglichkeiten:

  1. führen Sie mysqldump aus und geben Sie an, dass die Dateien gelöscht/gelöscht werden sollen
  2. führe 'Säuberung' aus (wie du es getan hast)
  3. setze max_binlog_size. Nach den Dokumenten:

Mögliche Entfernungen treten beim Start und beim Leeren des Binärlogs auf.

und

Außerdem wird das Binärprotokoll gelöscht, wenn seine Größe den Wert der Systemvariablen max_binlog_size erreicht.

Es hört sich so an, als würde # 3 den expire_logs_days ausführen, wenn er die Spülung/Spülung durchführt.

0
ethrbunny