Warum sind die MySQL-Bin-Protokolldateien nach einer Bereinigung oder Leerung noch vorhanden?

11

Ich habe sowohl PURGE BINARY LOGS als auch FLUSH LOGS verwendet, aber das MySQL-Verzeichnis enthält weiterhin die folgenden Dateien:

mysql-bin.000025
mysql-bin.000024
mysql-bin.000023
mysql-bin.000022
mysql-bin.000021
mysql-bin.000020
mysql-bin.000019
mysql-bin.index

Gibt es einen Grund, warum die Verwendung der Befehle nicht funktioniert? Diese Dateien nehmen viel Platz ein. Ich möchte sie sicher loswerden.

lamp_scaler
quelle

Antworten:

10

Die PURGE BINARY LOGSAnweisung löscht alle in der Protokollindexdatei aufgelisteten binären Protokolldateien vor dem angegebenen Protokolldateinamen oder Zeitstempel. Gelöschte Protokolldateien werden ebenfalls aus der in der Indexdatei aufgezeichneten Liste entfernt, sodass die angegebene Protokolldatei die erste in der Liste wird.

Ich hoffe, Sie haben Binärprotokolle bis zur mysql-bin.000019Verwendung des Befehls gelöscht

PURGE BINARY LOGS TO 'mysql-bin.000019';

Wenn Sie alle Protokolle löschen müssen, mögen Sie

PURGE BINARY LOGS TO 'mysql-bin.000025';

Dadurch werden binäre Protokolle bis entfernt mysql-bin.000025.

AKTUALISIEREN

Du kannst es versuchen

RESET MASTER;

RESET MASTER Löscht alle in der Indexdatei aufgelisteten binären Protokolldateien, setzt die leere binäre Protokollindexdatei auf leer zurück und erstellt eine neue binäre Protokolldatei

Die Auswirkungen von RESET MASTERunterscheiden sich von denen von PURGE BINARY LOGS in zwei wesentlichen Punkten:

  1. RESET MASTER Entfernt alle in der Indexdatei aufgelisteten binären Protokolldateien, wobei nur eine einzige leere binäre Protokolldatei mit dem numerischen Suffix .000001 übrig bleibt, während die Nummerierung durch PURGE BINARY LOGS nicht zurückgesetzt wird.

  2. RESET MASTERsollte nicht verwendet werden, während Replikations-Slaves ausgeführt werden. Das Verhalten RESET MASTERbei Verwendung während der Ausführung von Slaves ist undefiniert (und wird daher nicht unterstützt), wohingegen PURGE BINARY LOGSes sicher verwendet werden kann, während Replikations-Slaves ausgeführt werden.

CAVEAT von RolandoMySQLDBA

Wenn Sie RESET MASTERmit verbundenen und laufenden Slaves arbeiten, verliert der E / A-Thread jedes Slaves sofort seinen Platz. Die Replikation ist daher fehlerhaft und Sie müssen Zeit damit verbringen, die Daten aller Slaves erneut zu synchronisieren. Wenn Sie Binärprotokolle sicher von einem Master löschen möchten, ohne die Replikationsintegrität zu beeinträchtigen, gehen Sie wie folgt vor:

  • Laufen Sie SHOW SLAVE STATUS\Gauf jedem Slave.
  • Beachten Sie Relay_Master_Log_File. Dies ist das Binärprotokoll, dessen letzte Anweisung im Slave erfolgreich ausgeführt wurde.
  • SHOW SLAVE STATUS\GBestimmen Sie anhand aller Anzeigen von , welche Relay_Master_Log_Filedie älteste ist (z. B. 'mysql-bin.00123').
  • Sie können ausführen PURGE BINARY LOGS TO 'mysql-bin.00123';Keiner der Slaves verliert seinen Platz.

Der Gesamteffekt? Dadurch bleiben auf dem Master Binärprotokolle zurück, deren Anweisungen noch nicht auf allen Slaves ausgeführt wurden.

Abdul Manaf
quelle
Ja. Ich habe es versucht. Funktioniert nicht.
lamp_scaler
BINARY LOGS AUF 'mysql-bin.000025' SPÜLEN; Wenn Sie dies ausführen, was ist der Fehler.
Abdul Manaf
Ja. Ich habe es versucht. Funktioniert nicht.
lamp_scaler
Ich habe meine Antwort aktualisiert. Sie können RESET MASTER ausprobieren.
Abdul Manaf
1
@ydaetskcoR Nein, ich meinte wirklich das älteste. Lassen Sie mich klarstellen: Wenn Sie zu irgendeinem Zeitpunkt ausgeführt werden CHANGE MASTER TO, werden alle Relay-Protokolle gelöscht. Wenn Relay_Master_Log_fileja mysql-bin.00123, ist dies das älteste binäre Protokoll auf dem Master, das dem Slave bekannt ist. Wenn mysql-bin.00123auf dem Master nicht mehr vorhanden ist, können Sie den richtigen Ort für die Replikation verlieren, wenn Sie einen CHANGE MASTER TOauf dem Slave ausführen , der nicht auf neuere Protokolle verweist. Dies kann leicht übersehen werden und Sie brechen die Replikation manuell ab.
RolandoMySQLDBA
5

Ich bin nicht sicher, ob Ihnen dies passiert ist, aber in meinem Fall hat MySQL das "Zyklisieren" von Protokollen gestoppt und die Datei mysql-bin.index wurde mit ungültigen Binlog-Dateieinträgen "beschädigt".

Insbesondere hatte die Indexdatei bei mysql-bin.000001 begonnen und war bei mysql-bin.000220 angekommen, hatte dann aber irgendwie wieder von 001 gestartet. Als ich dies mit den Dateien auf meinem Server verglich, konnte ich sehen, dass ich Dateien von 001 bis hatte 022.

Zuerst habe ich es versucht, PURGE LOGS TO 'mysql-bin.000022';aber das hat nicht funktioniert.

Am Ende habe ich MySQL gestoppt und die Indexdatei manuell bearbeitet, bis sie mit den Dateien auf meinem Server übereinstimmt. Beim Neustart von MySQL wurden die Binlog-Dateien bereinigt, um die Einstellung zu berücksichtigen expire_logs_days, und es wurde wieder normal funktioniert.

Sysadmiral
quelle
1
... und so machen Sie sich die Hände schmutzig, wenn Sie die Protokollrotation von MySQL korrigieren. Obwohl dies ein sehr seltenes Ereignis ist. Ich musste das tun. Lustige Sache ist, PURGE LOGSfunktioniert nur unter dem idealen Setup: 1) wenn alle Binärprotokolle aufeinanderfolgend sind, 2) alle Binärprotokolle in der mysql-bin.indexDatei benannt sind, 3) Es gibt keine zusätzlichen Protokolle, die nicht in erwähnt werden mysql-bin.index. +1 !!!
RolandoMySQLDBA
3

In meinem Fall wurde PURGE BINARYeinfach nichts gelöscht.

Ich hatte meine Partition zu 100% ausgelastet (ich musste mein Slowqueries-Protokoll ein wenig bereinigen, damit MySQL genügend Speicherplatz hatte, um neu gestartet zu werden), also änderte ich als erstes /etc/my.cnfdie Zeile, um log-bin=mysql-binsie zu kommentieren (sie wurde nicht benötigt) auf diesem Server mehr und ich hatte vergessen, es zu entfernen), und dann startete ich mysql neu (dies wurde benötigt, weil es Abfragen in der Warteschlange gab, die PURGE BINARYdie Ausführung verhinderten).

Danach rannte ich, PURGE BINARYaber nichts passierte. Also las ich das Handbuch und fand heraus, dass:

Diese Anweisung hat keine Auswirkung, wenn der Server nicht mit der Option --log-bin gestartet wurde, um die binäre Protokollierung zu aktivieren.

Also habe ich log-bin=mysql-binmeine /etc/my.cnfwieder aktiviert, neu gestartet, die Dateien gelöscht (jetzt mit Erfolg), die Zeile erneut kommentiert und dann neu gestartet. Danach wurden die Dateien entfernt und nicht mehr erstellt.

Carla
quelle
2

Das funktioniert bei mir: (MySQL Server Version: 5.6.14)

PURGE BINARY LOGS BEFORE NOW();

Entfernt alle Binärprotokolle auf meinem System.

grobmotoriker
quelle
Ihre Antwort funktioniert, solange die Binärprotokolle und die Binärprotokollindexdateien perfekt ausgerichtet sind. In der Antwort dba.stackexchange.com/a/74498/877 finden Sie Informationen , wenn dies nicht funktioniert. Ihre Antwort erhält immer noch +1 !!!
RolandoMySQLDBA
0

Sie können ALLE Protokolle einfach löschen mit:

PURGE BINARY LOGS BEFORE NOW();

Oder ersetzen Sie func NOW () durch ein beliebiges Datum in Anführungszeichen:

PURGE BINARY LOGS BEFORE '2018-02-15 00:00:00';

Oder Sie können diese Aktion mit expire_logs_days = 10in my.cnf automatisieren . Standardmäßig expire_logs_days ist 0 = nie Protokolle löschen.

( Quelle )

c ccx
quelle